- 列表生成式
L1 = [x*x for x in range(1,11)]
print('L1:',L1)
L3 = [m+n for m in 'ABC' for n in 'abc']
print('L3:',L3)
d = {'x': 'A', 'y': 'B', 'z': 'C' }
L4 = [key+ '=' +value for key,value in d.items()]
print('L4:',L4)
L2 = [x*x for x in range(1,11) if x%2==0]
print('L2:',L2)
L5 = [x if x%2==0 else -x for x in range(1,11)]
print('L5:',L5)
- 生成器:generator
一边计算一边循环,不用直接生成整个列表。可以用next(g)不断获取g的下一个元素,但一般用for循环。
g =(x*x for x in range(1,11))
g
Out[10]: <generator object <genexpr> at 0x000001F67AF6A120>
next(g)
Out[11]: 1
next(g)
Out[12]: 4
for n in (g):
print(n)
9
16
25
36
49
64
81
100
generator函数:如果一个函数中包含yield关键字,此函数为generator函数,调用generator函数,生成一个generator对象。generator函数和普通函数的执行流程不一样。普通函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
"""斐波拉契数列"""
def f(max):
n,a,b=0,0,1
while n < max:
yield b
a, b = b, a + b
n = n + 1
return 'done'
o = f(6)
o
Out[16]: <generator object f at 0x0000026DA9A992E0>
for x in o:
print(x)
1
1
2
3
5
8
每次调用generato函数都会生成一个独立的generator,需要注意。
"""杨辉三角"""
def triangles():
arr= [1]
while True:
yield arr
'arr = [1] + [arr[n]+arr[n+1] for n in range(len(arr)-1)] + [1]'
arr = [1] + [m + n for m, n in zip(arr[:-1],arr[1:])]+[1]
n = 0
results = []
for t in triangles():
results.append(t)
n = n + 1
if n == 10:
break
for t in results:
print(t)
if results == [
[1],
[1, 1],
[1, 2, 1],
[1, 3, 3, 1],
[1, 4, 6, 4, 1],
[1, 5, 10, 10, 5, 1],
[1, 6, 15, 20, 15, 6, 1],
[1, 7, 21, 35, 35, 21, 7, 1],
[1, 8, 28, 56, 70, 56, 28, 8, 1],
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
]:
print('测试通过!')
else:
print('测试失败!')
- 可迭代对象与迭代器
可迭代对象:直接作用于for循环的对象统称为可迭代对象。一类是集合数据类特型,如list、tuple、dict、set、str等;一类是generator,包括生成器和带yield的generator function。
迭代器:生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,而上述的list、tuple、dict、set、str等不是,无法调用next()函数。可以通过iter()函数获得一个Iterator对象。