python列表生成式、生成器、可迭代对象与迭代器

  • 列表生成式
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对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值