【目录】
表达式与生成式-匿名函数-函数递归
表达式/生成式
三元表达式
【语法】
res = 条件成立时返回的值 if 条件 else 条件不成立时返回的值
【栗子】
针对下述场景def max2(x,y):
if x > y:
return x
else:
return yres = max2(1,2)
用三元表达式可以一行解决x=1
y=2
res = x if x > y else y # 三元表达式
列表生成式
列表生成式用来快速生成列表
【语法】
[expression for item1 in iterable1 if condition1
for item2 in iterable2 if condition2
...
for itemN in iterableN if conditionN
]#类似于--for 循环
res=[]
for item1 in iterable1:
if condition1:
for item2 in iterable2:
if condition2
...
for itemN in iterableN:
if conditionN:
res.append(expression)
【栗子】
egg_list=[]
for i in range(10):
egg_list.append('鸡蛋%s' %i)用列表生成式可以一行解决:
egg_list=['鸡蛋%s' %i for i in range(10)]
生成器表达式
创建一个生成器对象有两种方式,一种是调用带yield关键字的函数,
另一种就是生成器表达式,与列表生成式的语法格式相同,只需要将[]换成()
【语法】
(expression for item in iterable if condition)
对比列表生成式返回的是一个列表,生成器表达式返回的是一个生成器对象
对比列表生成式,生成器表达式的优点自然是节省内存
(一次只产生一个值在内存中)
栗子
#2、示例:
生一筐鸡蛋变成给你一只老母鸡,用的时候就下蛋,这也是生成器的特性
>>> chicken=('鸡蛋%s' %i for i in range(5))
>>> chicken
<generator object <genexpr> at 0x10143f200>
>>> next(chicken)
'鸡蛋0'
>>> list(chicken) #因chicken可迭代,因而可以转成列表
['鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4',]
如果我们要读取一个大文件的字节数,应该基于生成器表达式的方式完成with open('db.txt','rb') as f:
nums=(len(line) for line in f)
total_size=sum(nums) # 依次执行next(nums),然后累加到一起得到结果=
函数递归
函数嵌套调用
函数不仅可以嵌套定义,还可以嵌套调用,即在调用一个函数的过程中,函数内部又调用另一个函数
函数递归调用
函数的递归调用指的是在调用一个函数的过程中又直接或间接地调用该函数本身
栗子
在调用f1的过程中,又调用f1,这就是直接调用函数f1本身def f1():
print('from f1')
f1()
f1()
在调用f1的过程中,又调用f2,而在调用f2的过程中又调用f1,这就是间接调用函数f1本身def f1():
print('from f1')
f2()def f2():
print('from f2')
f1()f1()
递归
一个递归的过程,可以分为两个阶段:回溯和递推。
回溯--》寻找开始递推的条件
递推--》从条件出发,推导结果
使用递归,我们只需要分析出要重复执行的代码逻辑,然后提取进入下一次递归调用的条件或者说递归结束的条件即可,代码实现起来简洁清晰
递归本质就是在做重复的事情,所以理论上递归可以解决的问题循环也都可以解决,只不过在某些情况下,使用递归会更容易实现。
比如有一个嵌套多层的列表,要求打印出所有的元素,代码实现如下items=[[1,2],3,[4,[5,[6,7]]]]
def foo(items):
for i in items:
if isinstance(i,list): #满足未遍历完items以及if判断成立的条件时,一直进行递归调用
foo(i)
else:
print(i,end=' ')foo(items) #打印结果1 2 3 4 5 6 7