列表生成式 与 生成器

列表生成式

  • 借助for循环实现的列表生成式:
>>>[x*x for x in range(5)]
[0, 1, 4, 9, 16, 25]
  • 也可以使用双重循环:
>>>[m+n for m in 'ABC' for y in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

三层或三层以上的循环较少用到

  • for后加if判断作为过滤条件,注意由于是作为过滤条件,不可再加else
    eg:
>>> [x for x in range(1, 11) if x % 2 == 0]
[2, 4, 6, 8, 10]
  • for前加if...else表达式也可:
>>> [x if x % 2 == 0 else -x for x in range(1, 11)]
[-1, 2, -3, 4, -5, 6, -7, 8, -9, 10]

生成器generator

  • 普通的generator
    列表生成式中的[]改为()即可
    eg:
>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>
  • 函数式复杂generator
    若一个函数的定义中包括关键字yield,则该函数是generator;
    函数是顺序执行,每次遇到return即返回;generator则是调用next()时执行,遇到yield返回,再次执行时从yield处继续执行。
    eg:斐波那契数列生成器:
def fib(max):
      n, a, b=0, 0, 1
      while n<max:
            yield b
            a, b = b, a+b
            n = n+1
      return 'done'

打印generator的每一个元素

  • 使用next()方法依次打印
    eg:
>>>next(g)
0
....

但是打印到最后一个元素之后继续打印会出现StopIteration的错误

  • for循环打印
    generator是可迭代对象,可以用for循环打印,且不必考虑打印到最后一个元素之后的问题
    eg:
for n in g:
      print('g:',n)
posted @ 2020-11-17 17:40  圆圆的圈圈  阅读(124)  评论(0)    收藏  举报