1. 生成器、生成式及函数的区别。
(1)生成式的定义方式为 [表达式 循环语句 [判断条件]]
list的表达方式为[,],tuple的表达方式为(,),dict的表达方式为{:,},集合的表达方式为{,},故可知生成式的返回结果是list。
[x*x+y*2 for x in range(5) for y in range(9) if x%2==0 if y%3==0]
result:
[0, 6, 12, 4, 10, 16, 16, 22, 28]
l2 = [(x*x,y*2) for x in range(5) for y in range(9) if x%2==0 if y%3==0]
type(l2)
l2
result:
list
[(0, 0), (0, 6), (0, 12), (4, 0), (4, 6), (4, 12), (16, 0), (16, 6), (16, 12)]
(2)生成器有2中配置方法,一种和生成式类似,通过(表达式 循环语句 [判断条件])来实现,一种和函数类似,通过yield关键字来实现。
l1 = [i for i in range(5)]
print(f1)
g2 = (i for i in range(5))
print(g2)
# print(list(g2))
print(next(g2),next(g2),next(g2),next(g2),next(g2))
def func():
for i in range(5):
return i
return 'f'
def gene():
for i in range(5):
yield i
yield 'f'
i+=1
print(func())
g1=gene()
print(g1)
print(next(g1),next(g1),next(g1),next(g1),next(g1),next(g1),next(g1),next(g1),next(g1),next(g1))
result:
[0, 1, 2, 3, 4]
<generator object <genexpr> at 0x00000000059B5888>
0 1 2 3 4
0
<generator object gene at 0x00000000059B51A8>
0 f 1 f 2 f 3 f 4 f
生成器的表达式形式和生成式形式和功能都一样,只是返回结果不一样,生成式返回的是列表,而生成器返回的是一个迭代器。list可以直接访问,但不能通过next来访问,因为list不是迭代器,而是一个可迭代的对象。生成器可以通过next来访问,也可以通过类型转换转换成list类型然后再进行访问。
生成器的函数形式和普通函