ShineMiao

列表生成式

  • 借助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)

分类:

技术点:

相关文章:

  • 2021-06-12
  • 2021-11-18
  • 2021-10-07
  • 2021-05-25
  • 2021-11-29
  • 2021-10-07
  • 2021-10-07
  • 2021-10-07
猜你喜欢
  • 2018-03-27
  • 2021-10-26
  • 2019-08-17
  • 2021-04-01
  • 2021-08-01
  • 2018-01-17
相关资源
相似解决方案