(6)--第4章 选择结构、循环结构、函数定义与使用.ppt
第4章 选择结构、循环结构、函数定义与使用1本章学习目标理解条件表达式的值与True或False的等价关系熟练掌握选择结构熟练掌握循环结构理解带else的循环结构执行过程熟练掌握函数的定义与使用熟练掌握lambda表达式语法与应用理解递归函数的执行过程理解嵌套定义函数的语法24.1 选择结构4.1.1 条件表达式在Python中,几乎所有合法表达式都可以作为条件表达式。条件表达式的值等价于True时表示条件成立,等价于False时表示条件不成立。条件表达式的值只要不是False、0(或0.0、0j等)、空值None、空列表、空元组、空集合、空字典、空字符串、空range对象或其他空迭代对象,Python解释器均认为与True等价(注意,等价和相等是有区别的)。4.1.2 单分支选择结构例例4-1 生成包含两个或三个汉字的人名。from random import choice,randomname=choice(董孙李周赵钱王)if random()0.5:#random()函数返回0,1)区间上的随机数 name+=choice(付玉延邵子凯)name+=choice(国楠栋涵雪玲瑞)print(name)4.1.3 双分支选择结构例例4-2 首先生成1,100区间上的一个随机数,然后根据随机数的范围生成变量sex的值,当随机数大于51时把sex设置为男,否则设置为女。from random import randintif randint(1,100)51:sex=男else:sex=女print(sex)4.1.4 嵌套的分支结构if 条件表达式1:语句块1elif 条件表达式2:语句块2elif 条件表达式3:语句块3.else:语句块nif 条件表达式1:语句块1 if 条件表达式2:语句块2 else:语句块3else:if 条件表达式4:语句块44.2 循环结构4.2.1 for循环for循环非常适合用来遍历容器类对象(列表、元组、字典、集合、字符串以及map、zip等类似对象)中的元素,语法形式为:for 循环遍历 in 容器类对象:循环体else:else子句代码块4.2.2 while循环while循环结构语法如下:while 条件表达式:循环体else:else子句代码块4.2.3 break与continue语句例例4-3 编写程序,输出200以内最大的素数。for n in range(200,1,-1):#从大到小遍历 for i in range(2,n):#遍历2,n-1区间的自然数 if n%i=0:#如果n有因数,就不是素数 break#提前结束内循环 else:#如果内循环自然结束,继续执行这里的代码 print(n)#输出素数 break#结束外循环4.2.3 break与continue语句例例4-4 编写程序,输出各位数字都不相同的所有三位数。digits=range(10)for i in digits:#选择一个数字 if i=0:continue#第一位数不能是0 for j in digits:if j=i:continue#第2位与第1位相同,则忽略后面的操作 for k in digits:if k in(i,j):continue#3位数字必须互不相同 print(int(str(i)+str(j)+str(k),end=)4.3 函数定义与使用4.3.1 函数定义基本语法在Python中,函数定义的语法如下:def 函数名(参数列表):函数体定义函数时需要注意的问题主要有:1)不需要说明形参类型,Python解释器会根据实参的值自动推断形参类型。2)不需要指定函数返回值类型,这由函数中return语句返回的值的类型来确定。如果函数没有明确的返回值,Python认为返回空值None。3)即使该函数不需要接收任何参数,也必须保留一对空的英文半角圆括号。4)函数头部括号后面的冒号必不可少。5)函数体相对于def关键字必须保持一定的空格缩进。4.3.2 lambda表达式func=lambda x,y:x+y#像调用函数一样调用lambda表达式print(func(3,5)data=9,88,444#按各位数字之和的大小升序排序print(sorted(data,key=lambda num:sum(map(int,str(num)#输出转换成字符串之后的长度最大的数字print(max(data,key=lambda num:len(str(num)4.3.3 递归函数例例4-5 编写递归函数,计算组合数c(n,i),也就是从n个物品中任选i个的选法。根据帕斯卡公式可知,c(n,i)=c(n-1,i)+c(n-1,i-1),在下面的代码中使用标准库functools中的修饰器lru_cache避免重复计算从而提高计算速度。from functools import lru_cache#使用修饰器,增加用来记忆中间结果的缓存lru_cache(maxsize=64)def cni(n,i):if n=i or i=0:return 1 return cni(n-1,i)+cni(n-1,i-1)4.3.4 生成器函数例例4-6 编写生成器函数,模拟内置函数map()。def myMap(func,iterable):for item in iterable:yield func(item)result=myMap(str,range(5)print(result)print(list(result)4.3.5 位置参数、默认值参数、关键参数、可变长度参数(1)位置参数def add(a,b):print(In function:a=,b=.format(a,b)return a+bprint(add(3,5)4.3.5 位置参数、默认值参数、关键参数、可变长度参数(2)默认值参数def add(a,b=5):print(In function:a=,b=.format(a,b)return a+bprint(add(3)print(add(3,8)4.3.5 位置参数、默认值参数、关键参数、可变长度参数(3)关键参数def add(a,b):print(In function:a=,b=.format(a,b)return a+bprint(add(b=8,a=3)4.3.5 位置参数、默认值参数、关键参数、可变长度参数(4)可变长度参数def add(a,b,*args,*kwargs):print(In function:na=nb=nargs=nkwargs=.format(a,b,args,kwargs)return a+b+sum(args)+sum(kwargs.values()print(add(3,8,1,2,3,4,x=5,y=6,z=7)print(=*20)print(add(1,2,3,4,5,6,7,8,9,x=10,y=11)4.3.6 变量作用域def func():global x x=666 y=888 print(x,y,z,sep=,)x,y,z=3,5,7func()4.4 综合应用与例题解析例例4-7 假设张三所在团队有一小笔收入,但是超出800元以上的部分要交20%的税,为了提高总收入,可以申报多人合作完成,这样的话每人800之内的部分都不需要扣税,那么总收入能提高多少呢?def calcFee(total,num):total为原始总收入,num为申报人数#只申报一人的收入 origin=800+(total-800)*0.8#申报多人完成时不扣税的基数 base=num*800#人均收入小于等于800的情况 if total value:print(Too big)else:print(Too little)else:#次数用完还没猜对 print(Game over.FAIL.)print(The value is,value)guess(1,10,3)