自学Python--迭代、列表生成式、生成器、迭代器

可迭代对象:可通过for循环遍历的对象。通过collections模块的Iterable判断

from collections import Iterable
print(isinstance('abc', Iterable)) # True

如果对列表实现类似java的下标循环,可通过内置函数enumerate

for i, v in enumerate([1, 2, 3, 4, 5, 6]):
    print(i, '-->', v)
'''
0 --> 1
1 --> 2
2 --> 3
3 --> 4
4 --> 5
5 --> 6
'''

 

列表生成式:

l1 = [x * x for x in range(1, 10) if x % 2 == 0]
print(l1) # [4, 16, 36, 64]

l2 = [m + n for m in 'ABC' for n in 'XYZ']
print(l2) # ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

 

生成器generator:一边循环一边计算的机制

创建一个生成器:

把列表生成式的[]改成()即可,使用next()或者__next()__可获取生成器的下一个返回值:

l1 = (x * x for x in range(1, 10) if x % 2 == 0)
print(type(l1)) # <class 'generator'>
print(next(l1)) # 4
print(l1.__next__()) # 16

l2 = (m + n for m in 'ABC' for n in 'XYZ')
print(type(l2)) # <class 'generator'>

生成器是可迭代对象,因此也可以使用for循环遍历

 

斐波拉契数列:除前两个数外,任意一个属都是前两个数相加得到,如1,1,2,3,5,8,13,21

斐波拉契数列用列表生成式写不出来,但可以用函数打印出来:

def fib(max):
    a, b = 0 ,1
    for i in range(0, max):
        print(b)
        a, b = b, a + b
    return 'ok'

fib(8) # 1 1 2 3 5 8 13 21

 

把fib函数变成生成器generator:如果一个函数包含yield关键字,这个函数就是一个generator

def fib(max):
    a, b = 0 ,1
    for i in range(0, max):
        yield b
        a, b = b, a + b
    return 'ok'
res = fib(8)
for i in res:
    print(i) # 1 1 2 3 5 8 13 21

杨辉三角:todo

def triangles(n):
    current_list = [1]
    pre_list = [1 ,1]
    for i in range(1,n+1):
        if i == 1:
            yield [1]
        elif i == 2:
            yield [1, 1]
        else:
            
            for j in range(1,i-1):
                current_list.append(pre_list[j-1] + pre_list[j])
            current_list.append(1)
            yield current_list
            pre_list = current_list
            current_list = [1]

res = triangles(6)
for i in res:
    print(i)

 

迭代器:

可迭代对象:

可直接用for循环遍历的对象,如list、tuple、dict、set、str、generator

迭代器:

可以被next()函数调用并不断返回下一个值的对象称为迭代器Iterator

迭代器都是可迭代对象,但可迭代对象不一定是迭代器

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值