函数的递归调用、三元表达式、匿名函数、生成式
目录
函数的递归调用、三元表达式、匿名函数、生成式
一 函数的递归调用
1 什么是函数的递归调用
-就是函数在调用过程中,直接或间接的调用了自己。为防止内存溢出,在python中函数的递归调用默认最大1000层。所以函数递归不应无限进行,应在满足某条件时结束,然后返回。
# 直接调用自己
def func():
print('from func')
func()
func()
# 间接调用自己
def foo():
print('from foo')
bar()
def bar():
print('from bar')
foo()
foo()
2 递归的两个阶段
2.1 回溯:
-一层层地回溯下去。
2.2 递归:
-在满足某条件的情况下结束回溯,然后一层层向上返回。
# 案例:
# 某公司四个员工坐在一起,问第四个人薪水,他说比第三个人多1000,问第三个人薪水,第他说比第二个人多1000,问第二个人薪水,他说比第一个人多1000,最后第一人说自己每月5000,请问第四个人的薪水是多少?
# 思路解析:
# 要知道第四个人的月薪,就必须知道第三个人的,第三个人的又取决于第二个人的,第二个人的又取决于第一个人的,而且每一个员工都比前一个多一千,数学表达式即:
salary(4)=salary(3)+1000
salary(3)=salary(2)+1000
salary(2)=salary(1)+1000
salary(1)=5000
总结为:
salary(n)=salary(n-1)+1000 (n>1)
salary(1)=5000 (n=1)
# 代码实现
def salary(n):
if n==1:
return 5000
return salary(n-1) + 1000
s = salary(4)
print(s) # 8000
# 打印列表里的所有值:
nums = [111, [222, [333, [444, [5555, [6666, [777, [888, [9999]]]]]]]]]
def func(l):
for x in l:
if type(x) is list:
# 把自身再调用一遍
func(x)
else:
print(x)
func(nums)
3 递归的应用:二分法
# 从小到大排列的一个数字列表,找出某数字是否在列表中
nums = [11, 13, 32, 47, 53, 73, 84, 91, 101, 111, 222, 333, 444, 5555]
def binary_search(l, find_num):
print(l)
if len(l) == 0:
print('find_num not exists')
return
mid_index = len(l) // 2
if find_num > l[mid_index]:
right_l = l[mid_index + 1:]
binary_search(right_l, find_num)
elif find_num < l[mid_index]:
left_l = l[:mid_index]
binary_search(left_l, find_num)
else:
print('find it')
binary_search(nums, 85)
# [11, 13, 32, 47, 53, 73, 84, 91, 101, 111, 222, 333, 444, 5555]
# [11, 13, 32, 47, 53, 73, 84]
# [53, 73, 84]
# [84]
# []
# find_num not exists
二 三元表达式
1 什么是三元表达式
-三元表达式是一种可以简化代码的方式,在不丧失可读性的情况下,精简代码。
# 表达式1 if 条件 else 表达式2# 将三元表达式赋值给一个变量,可以得出结果
2 如何使用三元表达式
# 案例x = 111y = 222def max2(x, y): if x > y: return x else: return yres = x if x > y else y # 一行代码搞定一个简单的比较取值过程print(res) # 222
三 匿名函数
1 什么是匿名函数
-匿名函数就是没有名字的函数。 -没有名字意味着只能使用一次,用完之后就是垃圾,所以匿名函数只能用于临时使用一次的场景。 -匿名函数的表达式:lambda 参数:表达式 ===>>> 进而得出结果
-表达式 lambda parameters: expression 会产生一个函数对象。 -该未命名对象的行为类似于用以下方式定义的函数:def <lambda>(parameters): return expression
2 如何使用匿名函数
# 错误示范:给匿名函数命名(没有意义) res = lambda x, y: x + yprint(res(1, 2))# 正确用法:res = (lambda x, y: x + y)(1, 2)print(res)
# 用于使用一次就没作用的场景,如:为其他函数作为一个辅助参数salaries = { 'egon': 4.4, "lqz": 3.3, 'yj': 2.2}# max()、min()、sorted()函数对字典默认针对key进行排序,若要对值进行排序并返回key,可以加一个参数key,作为实际比较的依据。res = max(salary, key=lambda k: salary[k])print(res) # egonres = min(salary, key=lambda k: salary[k])print(res) # yjres = sorted(salary, key=lambda k: salary[k], reverse = True)print(res) # ['egon', 'lqz', 'yj']res = sorted(salary, key=lambda k: salary[k])print(res) # ['yj', 'lqz', 'egon']
四 三元表达式/生成式
-使用三元表达式,是为了在不丧失代码可读性的前提下,使用一行代码实现多行代码的功能,让代码尽可能的简洁。
1 列表生成式
# 简化代码l = [i**2 for i in range(5) if i > 2]print(l) # [9, 16]# 过滤元素names = ['lqz_sb', 'yj_sb', 'jason_sb', 'egon']l = [name for name in names if name.endswith('sb')]print(l) # ['lqz_sb', 'yj_sb', 'jason_sb']
2 集合生成式
res = {i for i in range(5)}print(res) # {0, 1, 2, 3, 4}
3 字典生成式
res = {f'k{i}':i**2 for i in range(5)}print(res) # {'k0': 0, 'k1': 1, 'k2': 4, 'k3': 9, 'k4': 16}
4 生成器表达式
res = (i for i in range(5))print(res,type(res)) # <generator object <genexpr> at 0x0000018625397190> <class 'generator'>print(next(res)) # 0print(next(res)) # 1print(next(res)) # 2print(next(res)) # 3print(next(res)) # 4print(next(res)) # StopIteration
nums = (i for i in range(2000))res = sum(nums)print(res) # 19999000
with open('hw-day15.py',mode='rt',encoding='utf-8') as f: res = 0 for line in f: res += len(line) print(res) # 26

浙公网安备 33010602011771号