zoukankan      html  css  js  c++  java
  • python014 Python3 迭代器与生成器

    Python3 迭代器与生成器
    迭代器
    迭代是Python最强大的功能之一,是访问集合元素的一种方式。。
    迭代器是一个可以记住遍历的位置的对象。
    迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
    迭代器有两个基本的方法:iter() 和 next()。
    字符串,列表或元组对象都可用于创建迭代器:
    实例(Python 3.0+)

    >>>list=[1,2,3,4]
    >>> it = iter(list)    # 创建迭代器对象
    >>> print (next(it))   # 输出迭代器的下一个元素
    1
    >>> print (next(it))
    2
    >>>
    

    迭代器对象可以使用常规for语句进行遍历:
    实例(Python 3.0+)

    #!/usr/bin/python3
     
    list=[1,2,3,4]
    it = iter(list)    # 创建迭代器对象
    for x in it:
        print (x, end=" ")

    执行以上程序,输出结果如下:

    1 2 3 4
    

    也可以使用 next() 函数:

    实例(Python 3.0+)

    #!/usr/bin/python3
     
    import sys         # 引入 sys 模块
     
    list=[1,2,3,4]
    it = iter(list)    # 创建迭代器对象
     
    while True:
        try:
            print (next(it))
        except StopIteration:
            sys.exit()
    

    执行以上程序,输出结果如下:

    1
    2
    3
    4
    

    生成器

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

    #!/usr/bin/python3
     
    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
    

    Python3 循环语句 

    笔记列表
    来看一下有yield和没有yield的情况会对生成器了解多点:
    第一种:使用 yield

    #!/usr/bin/python3
    
    import sys
    
    def fibonacci(n,w=0): # 生成器函数 - 斐波那契
        a, b, counter = 0, 1, 0
        while True:
            if (counter > n): 
                return
            yield a
            a, b = b, a + b
            print('%d,%d' % (a,b))
            counter += 1
    f = fibonacci(10,0) # f 是一个迭代器,由生成器返回生成
    
    while True:
        try:
            print (next(f), end=" ")  # 有yield,这里有返回值
        except :
            sys.exit()

    输出结果:

    0 1,1
    1 1,2
    1 2,3
    2 3,5
    3 5,8
    5 8,13
    8 13,21
    13 21,34
    21 34,55
    34 55,89
    55 89,144

    第二种:不使用 yield

    #!/usr/bin/python3
    
    import sys
    
    def fibonacci(n,w=0): # 生成器函数 - 斐波那契
        a, b, counter = 0, 1, 0
        while True:
            if (counter > n): 
                return
            #yield a
            a, b = b, a + b
            print('%d,%d' % (a,b))
            counter += 1
    f = fibonacci(10,0) # f 是一个迭代器,由生成器返回生成
    
    while True:
        try:
            print (next(f), end=" ")
        except :
            sys.exit()

    输出结果:

    1,1
    1,2
    2,3
    3,5
    5,8
    8,13
    13,21
    21,34
    34,55
    55,89
    89,144

    第二种没有yield时,函数只是简单执行,没有返回迭代器f。这里的迭代器可以用生成l列表来理解一下:

    >>> l = [i for i in range(0,15)]
    >>> print(l)
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
    >>> m = (i for i in range(0,15))
    >>> print(m)
    <generator object <genexpr> at 0x104b6f258>
    >>> for g in m:
    ... print(g,end=', ')
    ... 
    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
    

    这里的m就像上面的f一样,是迭代器。

  • 相关阅读:
    解决PKIX:unable to find valid certification path to requested target 的问题
    Linux 上的常用文件传输方式介绍与比较
    用VNC远程图形化连接Linux桌面的配置方法
    红帽中出现”This system is not registered with RHN”的解决方案
    linux安装时出现your cpu does not support long mode的解决方法
    CentOS SSH配置
    es6扩展运算符及rest运算符总结
    es6解构赋值总结
    tortoisegit安装、clon、推送
    es6环境搭建
  • 原文地址:https://www.cnblogs.com/chenlin163/p/7253355.html
Copyright © 2011-2022 走看看