[关闭]
@myles 2018-06-09T23:08:06.000000Z 字数 2845 阅读 813

生成器学习

老男孩基础


一、三元表达式

三元表达式又称条件表达式,这些表达式基于真(true)/假(false)的条件判断,在Python 2.4以上才有了三元操作。

  1. #如果条件为真,返回真 否则返回假
  2. condition_is_true if condition else condition_is_false
  1. n = 10
  2. print("%s:条件为真执行"%n) if n>5 else print("%s: 条件为假执行"%n)
  3. 10:条件为真执行

二、列表生成器

列表生成式就是一个用来生成列表的特定语法形式的表达式。

1、基本语法格式

  1. [exp x for var in iterable]
  1. >>> [x+2 for x in range(10)]
  2. [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

2、结合三元表达式的语法格式

  1. [exp if if_exp else else_exp for var in iterable]
  1. [x if x<5 else x*2 for x in range(10)]
  2. [0, 1, 2, 3, 4, 10, 12, 14, 16, 18]

3、循环嵌套语法格式

  1. [exp for var_A in iterable_A for var_B in iterable_B]
  1. L = []
  2. for iter_var_A in iterable_A:
  3. for iter_var_B in iterable_B:
  4. L.append(exp)
  1. >>> [(x,y) for x in range(5) for y in 'ABCDE']
  2. [(0, 'A'), (0, 'B'), (0, 'C'), (0, 'D'), (0, 'E'), (1, 'A'), (1, 'B'), (1, 'C'), (1, 'D'), (1, 'E'), (2, 'A'), (2, 'B'), (2, 'C'), (2, 'D'), (2, 'E'), (3, 'A'), (3, 'B'), (3, 'C'), (3, 'D'), (3, 'E'), (4, 'A'), (4, 'B'), (4, 'C'), (4, 'D'), (4, 'E')]

4、列表生成器与map()、filter()高阶函数的功能对比

实际举例比较感受然的不同

  1. >>> L = ['Myles', 10, 'Jhon']
  2. # map 函数实现
  3. >>> list(map(lambda x:x.lower() if isinstance(x,str) else x,L))
  4. ['myles', 10, 'jhon']
  5. # 列表生成器实现
  6. # >>> [x.lower() if isinstance(x,str) else x for x in L]
  7. ['myles', 10, 'jhon']
  1. # 列表推导式实现
  2. >>> [x.lower() for x in L if isinstance(x,str)]
  3. ['myles', 'jhon']
  4. # map() 结合 filter()实现
  5. list(map(lambda x:x.lower(),filter(lambda x:isinstance(x,str),L)))
  6. ['myles', 'jhon']

通过以上的比较,可以很明显的了解到"列表生成器"使用起来更加方便简单。

三、生成器

从名字上来看,生成器应该是用来生成数据的。

1、生成器的作用

按照某种算法不断生成新的数据,直到满足某一个指定的条件结束。

2、生成器的构造方式

构造生成器的两种方式:

(1)使用类似列表生成式的方式生成 (2*n + 1 for n in range(3, 11))
(2)使用包含yield的函数来生成

如果计算过程比较简单,可以直接把列表生成式改成generator;但是,如果计算过程比较复杂,就只能通过包含yield的函数来构造generator。

3、生成器构造实例

  1. g = (x**2+1 for x in range(1,10))
  2. g
  3. <generator object <genexpr> at 0x000001E8CA1E4830>
  4. for x in g:
  5. print(x)
  6. 2
  7. 5
  8. 10
  9. 17
  10. 26
  11. 37
  12. 50
  13. 65
  14. 82
  15. # 方法2:使用包含yield函数构造生成器
  16. def num(x,y):
  17. for n in range(x,y):
  18. yield n**2+1
  19. g = num(1,10)
  20. for x in g:
  21. print(x)
  22. 2
  23. 5
  24. 10
  25. 17
  26. 26
  27. 37
  28. 50
  29. 65
  30. 82

4、生成器的执行过程与特性

5、调用生成器产生新的元素,有两种方式

  1. g = (x**2 for x in range(10))
  2. next(g)
  3. 0
  4. next(g)
  5. 1
  6. next(g)
  7. 4
  8. next(g)
  9. 9
  1. g = (x**2 for x in range(10,20))
  2. for x in g:
  3. print(x)
  4. 100
  5. 121
  6. 144
  7. 169
  8. 196
  9. 225
  10. 256
  11. 289
  12. 324
  13. 361

学习心得(1)

yield 收获

  1. >>> def fib(max):
  2. n,a,b = 0,0,1
  3. while n<max:
  4. a,b = b,a+b
  5. print("before yield b")
  6. yield b #(1)生成一个"generator";(2)冻结程序执行;(3)将结果返回到函数之外
  7. print('b')
  8. n = n + 1
  9. return 'Done'
  10. >>> f = fib(5) # 返回一个生成器
  11. >>> f
  12. <generator object fib at 0x000001E8CA1E4AF0>
  13. >>> next(f) # 第一次执行,执行到yield就停止了,并将结果返回到函数之外
  14. before yield b
  15. 1
  16. >>> next(f) # 第二次执行,执行"print('b'),然后执行"print("before yield b")",最后执行到"yield"就停止了,并返回结果。
  17. b # 执行"print('b')
  18. before yield b # 执行"print("before yield b")"
  19. 2 # 最后执行到"yield"就停止了,并返回结果
  20. >>> next(f)
  21. b
  22. before yield b
  23. 3
  24. >>> next(f)
  25. b
  26. before yield b
  27. 5

学习参考

https://www.cnblogs.com/yyds/p/6281453.html

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注