4.1 if条件判断语句
4.1.1 if条件判断语句单分支
◆单分支格式:if 判断条件:
语句块1……
else:
语句块2……
Ø例:name=input('请输入您的用户名:')
if name == 'admin':
print('欢迎管理员用户')
else:
print('欢迎普通用户')#输出:请输入您的用户名:
Ø例:num=10
if num>5:
print('请选择物品进行兑换')
else:
print('积分不足')#输出:请选择物品进行兑换
4.1.2 if条件判断语句多分支
◆多分支格式:if 判断条件1:
语句块1……
elif 判断条件2:
语句块2……
elif 判断条件3:
语句块3……
else:
语句块n
Ø例:name=input('请输入您的用户名:')
if name == 'admin':
print('欢迎管理员用户')
elif name == 'kitty':
print('欢迎kitty用户')
else:
print('用户不存在,请注册')
4.1.3 if条件判断语句的三目运算
◆三目运算基本格式:
name = input('请输入您的用户名:')
print ('在上海' if name == 'xiaowang' else '在深圳')
只适用于if条件判断语句的单分支
Ø例:name = input('请输入您的用户名:')
print('香港') if name == '深圳' else print('广东')#输出请输入您的用户名:
Ø例:dict={'name':'老六','age':18}
if dict.__contains__('class') is True:
print(dict)
else:
dict['class']=1844
print(dict)#输出{'name': '老六', 'age': 18, 'class': 1844}
换位三目运算:
→dict={'name':'老六','age':18}
print(dict) if dict.__contains__('class') is True else dict.setdefault('class',1844) and print(dict)
#输出{'name': '老六', 'age': 18, 'class': 1844}
→dict={'name':'老六','age':18,'class':1999}
print(dict) if dict.__contains__('class') is True else dict.setdefault('class',1844) and print(dict)
#输出{'name': '老六', 'age': 18, 'class': 1999}
Ø例:登录功能实战练习
→通过输入函数/输入用户名/先判断用户名是否正确,用户名正确则进行密码判断
# 如果用户名错误则提示:"用户名错误,请重新输入"
密码错误则提示"密码错误,请重新输入密码"
输入正确密码则登录成功
法1:username = input('请输入你的用户名:')
if username == 'admin':
password = input('123456')
if password == '123456':
print('登录成功')
else:
print('您输入的密码有误,请重新输入')
else:
print('您输入的用户名有误,请重新输入')
法2:dict={'username':'admin','password':'123456'}
username=input('请输入你的用户名:')
if username==dict.get('username'):
password=input('请输入你的密码:')
if password==dict.get('password'):
print('登录成功')
else:
print('您输入的密码有误,请重新输入')
else:
print('您输入的密码有误,请重新输入')
4.1.4 if语句之if的嵌套语句(if中包含if)
if 判断条件1:
语句块1
if 判断条件2:
语句块2
else:
语句块3
else:
语句块4
4.2 while循环语句
◆while语句的格式:
while 条件表达式:
循环体语句
◆while什么时候进入循环?当循环条件成立时,进入循环
◆while什么时候退出循环?当循环条件不成立时,退出循环
◆注意:在写while循环语句时一定要让循环条件发生变化,否认很容易陷入死循环中
Ø例:使用循环语句求出1—100的和
i=1
j=0
while i<101:
j=i+j
i+=1
print(j)#输出5050
Ø例:使用循环语句求出1—100之内的奇数之和
i=1
j=0
while i<=100:
j+=i
i+=2
print(j)#输出2500
Ø例:使用循环语句求出1—100之内的奇数之和减去偶数之和的结果
★ i=0
odd=0
even=0
while i<=100:
if i%2==0:
even+=i
else:
odd+=i
i+=1
print(odd-even)#输出-50
4.3 for循环语句
◆for循环的语法格式如下:
for ... in ...
语句块
◆遍历(Traversal):是指沿着某条搜索路线,依次对树(或图)中每个节点均做一次访问。访问结点所做的操作依赖于具体的应用问题, 具体的访问操作可能是检查节点的值、更新节点的值等。不同的遍历方式,其访问节点的顺序是不一样的。遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。
◆for循环遍历
字符串、列表、字典、元组、集合均可遍历,但不可遍历整型。
1>遍历字符串
str='python'
for i in str:
print(i,end='')#输出python
2>遍历列表
list=[1,2,3,4,'a','b']
for i in list:
print(i,end='')#输出1234ab
3>遍历元组
tuple=(1,2,3,4,['a','b'])
for i in tuple:
print(i,end='')#输出1234['a', 'b']
4>遍历字典
dict={'name':'张三','age':18}
for i,j in dict.items():
print(i,j)#输出name 张三 age 18
5>遍历集合
test='python'
set=set(test)
for i in set:
print(i,end='')#输出npotyh
6>遍历整型(整型不能遍历)
test=123
for i in test:
print(i)#TypeError: 'int' object is not iterable
Ø例:使用for循环打印出字符串hellokitty每个字符以及字符的索引值,并且进行格式化输出
Østr='hello'
for i,j in enumerate(str):
print(j,'对应的索引值是',i)
Østr='hello'
for i in str:
print('%s对应的索引值是%d' % (i,str.index(i)))
#输出h对应的索引值是0
e对应的索引值是1
l对应的索引值是2
l对应的索引值是2
o对应的索引值是4
Østr = 'hello'
for i in str:
s=str.index(i)
print('字符:%s 对应的索引值是:%d' % (i, s))
#输出字符:h 对应的索引值是:0
字符:e 对应的索引值是:1
字符:l 对应的索引值是:2
字符:l 对应的索引值是:2
字符:o 对应的索引值是:4
◆先熟悉下range()函数:如果需要遍历一个数字序列,可以使用python中内建的函数range()
for i in range (10) #打印0到9、不包含10
for i in range (1,10) #打印1到9、不包含10
for i in range (0,10,2) #打印结果:0,2,4,6,8不包含10
Ø例:for i in range(10):
print(i)#输出0123456789 纵向打印
print(i,end='')#输出0123456789 end=''横向打印
Ø例:for i in range(9,0,-1):
print(i)#输出987654321纵向打印
Ø例:使用for循环求1-100的和
sum=0
for i in range(1,101):
sum+=i
print(sum)#输出5050
Ø例:使用for循环求1-100的奇数之和
sum=0
for i in range(1,101,2):
sum+=i
print(sum)#输出2500
Ø例:使用for循环求1-100的偶数之和
sum=0
for i in range(1,101,2):
sum+=i+1
print(sum)#输出2550
4.4 continue语句
◆用法:continue语句用来告诉Python跳过当前循环的剩余语句,然后继续进行下一轮循环。
Ølist = [1,2,3,4,5,6,7,8,9]
for i in list:
if i==6:
continue
print (i,end='')
#输出12345789
Øfor i in range(10):
if i==5:
continue
print(i,end='')
#输出012346789
4.5 break语句
◆用法:语句会立即退出循环,在其后边的循环代码不会被执行。
Ølist = [1,2,3,4,5,6,7,8,9]
for i in list:
if i==6:
break
print (i,end='')
#输出12345
Øfor i in range(10):
if i==5:
break
print (i,end='')
#输出 01234
练习:求出1/1+1/3+1/5+...+1/99的和
Øi=1
sum=0
for i in range(1,100,2):
sum+=1/i
print(sum)
Øi=1
sum=0
while i<100:
sum+=1/i
i+=2
print(sum)
#输出2.937774848474907
练习:用循环语句计算2-10之间整数的循环相乘的值
Øi=2
sum=1
while i<11:
sum*=i
i=i+1
print(sum)
Øsum=1
for i in range(2,11):
sum*=i
print(sum)#输出3628800
4.6 排序方法
Python基本排序方法:选择排序、插入排序、冒泡排序、快速排序、希尔排序、归并排序、堆排序、基数排序、计数排序、桶排序。
4.6.1 冒泡排序
◆冒泡排序(Bubble Sort):是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。【这个算法的来由是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序),如同气泡一样最终会浮到液体顶端,故名冒泡排序。】
◆算法思路:
从前到后(即下标较小的元素开始)依次比较相邻元素的值,若发现比后一个值大,则交换位置,使值较大的元素逐渐从前向后移动
import numpy as np#导入numpy整个模块,并指定别名为np
pop_list = np.random.randint(100,size=6)#从0到100随机取六位数【random()返回随机生成的一个实数。注意:random()是不能直接访问的,需要导入 random 模块,然后通过 random 静态对象调用该方法。random.randint() 方法返回指定范围内的整数】
count=len(pop_list)#使用len函数获取列表长度
for i in range(count-1):#列表长度减一,控制循环次数
for j in range(count-i-1):#控制索引取值范围
if pop_list[j]>pop_list[j+1]:
pop_list[j],pop_list[j+1]=pop_list[j+1], pop_list[j]
print('排序好之后的位置为:',pop_list)
#输出'排序好之后的位置为: [ 4 6 7 35 62 69]'
4.6.2 递归方法
◆递归方法(recursion algorithm):在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。【递归就是一个函数在它的函数体内调用它自身】
4.6.2.1 递归的组成部分
◆终止条件:返回函数值,以防止进入一直调用函数的无限递归中,如果没有了递归条件,函数就变成了无限调用)
◆递归步骤:递归函数每步参数之间的关联
第一步:找出终止条件:当时间是最后一天,即第十天结束
第二步:确定递归步骤:今天桃子的数量除以2再减去1,就是明天桃子的数量
第三步:将公式进行变形,再更换成具体天数
今天桃子的数量/2-1=明天桃子的数量,
今天桃子的数量=(明天桃子的数量+1)*2
第1天桃子数量=(第2天桃子数量+1)*2
第2天桃子数量=(第3天桃子数量+1)*2 .......
第四步:创建一个函数并将函数参数设置为天数
每次调用函数时进行天数的判断,如果天数达到终止条件,则直接设置桃子的数量为1
如果不是第十天即不是最后一天,需要根据递归步骤公式进行计算
Ø【例】猴子吃桃:第一天猴群吃掉了桃子所有的1/2又多一个,第二天猴群吃掉了剩余桃子的1/2又多一个,按照这样的吃法,直到第10天,猴群发现只剩下一个桃子,问猴子一共摘了多少只桃子?
#for循环语句求解 x=1
for i in range(1,10):
x=(x+1)*2
print('猴子一共摘桃子总数为:',x)
#while语句求解
x=0
y=1
d=9
while d>0:
x=(y+1)*2
y=x
d-=1
print(x)
#输出猴子一共摘桃子总数为: 1534
#递归方法求解
def peach(day):
if day==10:
num=1
else:
num=(peach(day+1)+1)*2
return num
print(peach(1))#输出1534
Ø例:递归的阶乘>>求5!
def fn(num):
if num==1:
return 1#满足终止条件直接返回1
else:
return num*fn(num-1)
print(fn(5))#输出120
递归过程(为了明确递归过程,现对5!进行过程分解)
def p(n):
if n==0:
return
print('递归前->',n)
p(n-1)
print('递归后->',n)
p(5)
fn(5) #第1次调用使用5
5*fn(4) #第2次调用使用4
5*(4*fn(3)) #第3次调用使用3
5*(4*(3*fn(2))) #第4次调用使用2
5*(4*(3*(2*fn(1)))) #第5次调用使用1
5*(4*(3*(2*1))) #从第5次调用返回
5*(4*(3*2)) #从第4次调用返回
5*(4*6) #从第3次调用返回
5*24 #从第2次调用返回
120 #从第1次调用返回
★注意:当num = 998时能输出正确答案,但当num=999及更大数字时,就出现下面的错误了:
RecursionError: maximum recursion depth exceeded in comparison
这是由于默认的Python有一个可用的递归深度的限制,以避免耗尽计算机中的内存。默认是999。
Ø例:1,1,2,3,5,8,13,21,34,55,试判断数列第十五个数是哪个?
def f(n):
if n<=2:
v=1
return v
else:
v=f(n-1)+f(n-2)
return v
print(f(15))#输出610
4.6.2.2 递归算法主要应用范围
递归算法一般用于解决三类问题:
(1)数据的定义是按递归定义的。(比如Fibonacci函数)
(2)问题解法按递归算法实现。(回溯)[]
(3)数据的结构形式是按递归定义的。(比如树的遍历,图的搜索)
4.6.2.3 递归的特点
1、必须有一个明确的结束条件
2、每次进入更深一层递归时,问题规模(计算量)相比上次递归都应有所减少
3、递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
【拓展】
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为先进后出表。
栈可以用来在函数调用的时候存储断点,做递归时要用到栈。
以上定义是在经典计算机科学中的解释。
在计算机系统中,栈则是一个具有以上属性的动态内存区域。程序可以将数据压入栈中,也可以将数据从栈顶弹出。在i386机器中,栈顶由称为esp的寄存器进行定位。压栈的操作使得栈顶的地址减小,弹出的操作使得栈顶的地址增大。
栈在程序的运行中有着举足轻重的作用。最重要的是栈保存了一个函数调用时所需要的维护信息,这常常称之为堆栈帧或者活动记录。堆栈帧一般包含如下几方面的信息:
1.函数的返回地址和参数
2. 临时变量:包括函数的非静态局部变量以及编译器自动生成的其他临时变量。
栈的模型
4.6.2.4 递归优缺点
Ø优点:递归使代码看起来更加整洁、优雅;可以用递归将复杂任务分解成更简单的子问题;使用递归比使用一些嵌套迭代更容易
Ø缺点:递归的逻辑很难调试、跟进;递归算法解题的运行效率较低。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。
★递归函数就是把每次的调用压入到栈里面,当你调用p(5)时,我们会把p(5)压到栈里面,因为前面有递归的流程,递归流程还没有结束.p(5)等待,接着调用p(4)、p(3)、p(2)、p(1),当调用到p(1)时,递归前面到递归前面的部分还是会被打印出来,紧接着就p(n-1),也就是1-1=0满足了终止条件,递归结束,栈的话是后进先出的,先会执行p(1)....最后执行p(6)