zoukankan      html  css  js  c++  java
  • 11-Python3从入门到实战—基础之生成器和迭代器

    Python从入门到实战系列——目录

    切片

    Python提供切片(Slice)操作符用来获取列表、元组等数据中的部分元素;如,读取列表

    list[m:n]:表示获取m-n区间的元素
    list[m:n:o]:表示以条件o获取m-n之间的元素

    num = list(range(100))  # 创建0-99的列表num
    
    • 获取num中前三个元素
    >>> num[0:3]
    ['0', '1', '2']
    >>> num[:3]    # 索引从0开始时,0可以省略
    ['0', '1', '2']
    
    • 获取num中后三个元素
    >>> num[-3:]
    ['97', '98', '99']]
    
    • 每隔10个数获取所有元素
    >>> num[::5]
    [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
    
    • 复制一个列表
    >>> num[:]
    [0, 1, 2, 3, 4, 5, 6...98,97]
    

    迭代

    Python 中通过for循环来遍历list或tuple,这种遍历称为迭代(Iteration);

    • 迭代的使用
    >>> user={'0':'张三','1':'李四','2':'王五','3':'赵六',}
    >>> for key in user:
    ...     print(key)
    >>> print('---------分割线-----------')
    >>> for value in user.values():
    ...     print(value)
    

    输出结果:

    0
    1
    2
    3
    ---------分割线-----------
    张三
    李四
    王五
    赵六

    • 判断对象是否可迭代
    >>> user={'0':'张三','1':'李四','2':'王五','3':'赵六',}
    >>> print(isinstance(1,Iterable))
    >>> print(isinstance(user,Iterable))
    

    输出结果:

    False
    True

    • 遍历输出对象的下标和值
    >>> user={'0':'张三','1':'李四','2':'王五','3':'赵六',}
    >>> for key,value in enumerate(user.values()):
    ...     print(key,value)
    

    输出结果:

    0 张三
    1 李四
    2 王五
    3 赵六

    迭代器

    迭代器是一个可以记住遍历的位置的对象;迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束;迭代器只能往前不会后退;

    迭代器有两个基本的方法:创建迭代器对象的 iter() 和 输出迭代器对象的下一元素的 next();

    • 基本使用
    >>> nums = [1,2,3,4]
    >>> num = iter(nums)
    >>> print(next(num))
    >>> print(next(num))
    >>> print(next(num))
    

    输出

    1
    2
    3

    • 迭代器结合 for 循环使用
    >>> nums = [1,2,3,4]
    >>> num = iter(nums)
    >>> for n in num:
    ...     print(n)
    

    输出结果:

    1
    2
    3
    4

    • 迭代器结合 while 循环使用
    >>> while True:
    ...     try:
    ...         print(next(num))
    ...     except StopIteration:
    ...         print("迭代完毕")
    ...         sys.exit()
    

    输出:

    1
    2
    3
    4
    迭代完毕

    列表生成式

    • 生成列表的方法
    >>> list(range(10))
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    • 原始生成[11,22,...,10*10]方法
    >>> for x in range(1,11):
    ...     l.append(x*x)
    ...
    >>> l
    [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    >>>
    
    • 使用Python内置强大的生成[11,22,...,10*10]列表的方法
    >>> [x * x for x in range(1,11)]
    [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    >>>
    
    • 生成[11,22,...,10*10]元素为偶数的列表
    >>> [x * x for x in range(1,11) if x % 2 ==0]
    [4, 16, 36, 64, 100]
    
    • 双重循环生成列表
    >>> [x + y for x in 'ABC' for y in 'abc']
    ['Aa', 'Ab', 'Ac', 'Ba', 'Bb', 'Bc', 'Ca', 'Cb', 'Cc']
    
    • 使用两个变量生成列表
    >>> str = {'x': 'A', 'y': 'B', 'z': 'C' }
    >>> [key + '=' + value for key, value in str.items()]
    ['x=A', 'y=B', 'z=C']
    

    生成器

    通过列表生成式可以生成一个列表,但是列表受内存限制,容量是有限的,并且,如果创建一个包含几百万元素的列表,而只需要使用其中元素时便造成了空间浪费;
    这时候就应该使用生成器(generator);生成器表达式能做的事情列表解析基本都能处理,只不过在需要处理的序列比较大时,列表解析比较费内存。

    • 创建一个生成器
    >>> gen = (x * x for x in range(10))
    >>> gen
    <generator object <genexpr> at 0x0000000002742E08>
    >>>
    
    • 读取生成器中的元素
    >>> for x in gen:
    ...     print(x)
    ...
    0
    1
    4
    9
    16
    25
    36
    49
    64
    81
    >>>
    

    生成器函数

    生成器函数:在函数中如果出现了yield关键字,那么该函数就不再是普通函数,而是生成器函数;

    • 使用函数实现斐波拉契数列
    def fib(max):
        n, a, b = 0, 0, 1
        while n < max:
            print(b)
            a, b = b, a + b
            n = n + 1
        return 'done'
    
    >>> fib(6)
    1
    1
    2
    3
    5
    8
    'done'
    
    • 使用生成器函数实现斐波拉契数列
    def fib(max):
        n, a, b = 0, 0, 1
        while n < max:
            yield b
            a, b = b, a + b
            n = n + 1
        return 'done'
    
    >>> for n in fib(6):
    ...     print(n)
    ...
    1
    1
    2
    3
    5
    8
    
    • generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
  • 相关阅读:
    SQL学习
    FOR XML PATH
    IOS学习网址
    weak nonatomic strong等介绍(ios)
    UVALive3045 POJ2000 ZOJ2345 Gold Coins
    UVA713 UVALive5539 POJ1504 ZOJ2001 Adding Reversed Numbers
    UVA713 UVALive5539 POJ1504 ZOJ2001 Adding Reversed Numbers
    UVA439 POJ2243 HDU1372 ZOJ1091 Knight Moves【BFS】
    UVA439 POJ2243 HDU1372 ZOJ1091 Knight Moves【BFS】
    UVA10905 Children's Game
  • 原文地址:https://www.cnblogs.com/shen-hua/p/8547655.html
Copyright © 2011-2022 走看看