• Python3+迭代器与生成器


    转载Python3 迭代器与生成器

    迭代器

    • 迭代是Python最强大的功能之一,是访问集合元素的一种方式。
    • 迭代器是一个可以记住遍历的位置的对象。
    • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
    • 迭代器有两个基本的方法:iter() 和 next()。

    字符串,列表或元组对象都可用于创建迭代器:

    l=[1,2,3,4]
    it = iter(l)    # 创建迭代器对象
    print (next(it))   # 输出迭代器的下一个元素
    print (next(it))
    
    1
    2
    
    l=[1,2,3,4]
    it = iter(l)    # 创建迭代器对象
    for x in it:
        print (x, end=" ")
    
    1 2 3 4 
    

    也可以使用 next() 函数:

    import sys         # 引入 sys 模块
     
    li=[1,2,3,4]
    it = iter(li)    # 创建迭代器对象
     
    while True:
        try:
            print (next(it))
        except StopIteration:
            sys.exit()
    
    1
    2
    3
    4
    
    
    
    An exception has occurred, use %tb to see the full traceback.
    
    
    SystemExit
    
    
    
    C:UsersxinerAnaconda3libsite-packagesIPythoncoreinteractiveshell.py:2870: UserWarning: To exit: use 'exit', 'quit', or Ctrl-D.
      warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)
    

    生成器

    在 Python 中,使用了yield的函数被称为生成器(generator)。
    跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
    在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回yield的值。并在下一次执行 next()方法时从当前位置继续运行。

    import sys
     
    def fibonacci(n): # 生成器函数 - 斐波那契
        a, b, counter = 0, 1, 0
        while True:
            if (counter > n): 
                return
            yield a
            a, b = b, a + b
            counter += 1
    f = fibonacci(10) # f 是一个迭代器,由生成器返回生成
     
    while True:
        try:
            print (next(f), end=" ")
        except StopIteration:
            sys.exit()
    
    0 1 1 2 3 5 8 13 21 34 55 
    
    
    An exception has occurred, use %tb to see the full traceback.
    
    
    SystemExit
    
    
    
    C:UsersxinerAnaconda3libsite-packagesIPythoncoreinteractiveshell.py:2870: UserWarning: To exit: use 'exit', 'quit', or Ctrl-D.
      warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)
    

    Python yield 使用浅析

    
    

    resversed(序列) 顺序翻转迭代

    a=list('hello')
    a
    
    ['h', 'e', 'l', 'l', 'o']
    
    a1=reversed(a)    #a1是一个迭代器
    
    print(type(a))
    print(type(a1))
    
    <class 'list'>
    <class 'list_reverseiterator'>
    
    b=[1,2,3,4,5]
    b1=reversed(b)
    
    print(type(b))
    print(type(b1))
    
    <class 'list'>
    <class 'list_reverseiterator'>
    
    reversed((1,2,4,7,8))
    
    <reversed at 0x2272e4a82e8>
    
    a2=reversed(range(5))
    list(a2)
    
    [4, 3, 2, 1, 0]
    

    zip(序列1,序列2) 并行迭代

    l1=['a','b','c','d']
    l2=[1,2,3,4]
    list(zip(l1,l2))
    
    [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
    
    l3=('a','b','c','d')
    l4=[1,2,3,4]
    list(zip(l1,l2))
    
    [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
    
    l='hello'
    s=range(len(l))
    list(zip(l,s))
    
    [('h', 0), ('e', 1), ('l', 2), ('l', 3), ('o', 4)]
    
    l=dict(keys=l,values=s)
    l
    
    {'keys': 'hello', 'values': range(0, 5)}
    
    s
    
    range(0, 5)
    
    list(zip(l,s))
    
    [('keys', 0), ('values', 1)]
    

    编号迭代

    enumerate(序列):给序列打上编号

    l=['1','b','h',8]
    s=enumerate(l)
    s
    
    <enumerate at 0x2272dc60b88>
    
    list(s)
    
    [(0, '1'), (1, 'b'), (2, 'h'), (3, 8)]
    

    循环控制语句

    break & continue

    • break结束当前循环,然后跳到循环后的下一条语句。
    • continue提前结束当前这次循环,且继续进行下一次循环。
    a,b=0,1
    while True:
        a,b=b,a+b
        if b>1000:
            break
    print(a)
    
    987
    
    # (数值之和小于100的行)的奇树数值之和
    m=[[12,13,20,9,30,7],[11,22,33,21,44],[30,32,25,66,1],[12,34,56,7]]
    result=0
    for l in m:
        tmp=0
        for n in l:
            tmp+=n
            if tmp>=100:
                break
        if tmp>=100:
            continue
        for n in l:
            if n % 2==1:
                result+=n
    print(result)
    
    29
    

    else子句

    flag 变量可用来指示某一个特定事件是否已经发生,或某个特定状态是否存在。

    若需要在循环之后判断该条件是否符合,则需要额外的标识来记录。
    示例:

    l=[2,4,8,0,10,12]
    flag=False
    for n in l:
        if n%2==1:
            flag=True
            break
    if not flag:
        print('All num is even')
    
    All num is even
    

    与下面的else子句等价

    l = [2, 4, 8, 0, 10, 12]
    for n in l:
        if n % 2 == 1:
            flag = True
            break
    else:
        print('All num is even')
    
    All num is even
    

    列表推导式

    利用其他集合类对象(列表,元组,集合,字典,...)来创建新的列表的方法:
    示例:

    [2 * x for x in range(10)]
    
    [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
    
    [2 * x for x in range(10) if x % 3 == 0]
    
    [0, 6, 12, 18]
    
    [(x, y) for x in range(2) for y in range(3)]
    
    [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)]
    

    字典推导式

    a = ('a','b','c','df','gh')
    b = ['sdd',1,2,3,4,5]
    d = {a[i]:b[i] for i in range(len(a))}
    d
    
    {'a': 'sdd', 'b': 1, 'c': 2, 'df': 3, 'gh': 4}
    

    元组推导式(迭代器)

    a = (x**2 for x in range(10))
    type(a)
    
    generator
  • 相关阅读:
    .NET CORE中的配置系统
    .Net Core使用AspNetCoreRateLimit实现限流
    .NET CORE 依赖注入2
    linunx命令学习_文件命令
    .NET CORE 日志系统
    Rabbit MQ
    WPF学习
    Unity asp.net 依赖注入框架Unity
    .NET Core 依赖注入1
    备忘asp.net core使用中间件实现IP白名单访问
  • 原文地址:https://www.cnblogs.com/q735613050/p/7350767.html
Copyright © 2020-2023  润新知