生成器,推导式

生成器

生成器的本质就是迭代器

通过函数变成一个生成器

 1 def func():
 2     print(1)
 3     yield 5  # 我的函数走到这了
 4     print(2)
 5     yield 9  # 我的函数走到这了
 6 
 7 g = func()  # 生成一个生成器
 8 
 9 print(g.__next__())
10 print(g.__next__())
11 print(list(range(10000)))
每次遇到yield会返回并标记
下次从yield下面的函数开始运行
一共只有一个生成器
1 def func():
2     print(1)
3     # return 5
4     yield 5
5 print(func().__next__())  # 这样生成一个生成器
6 print(func().__next__())  # 这样生成一个生成器
7 print(func().__next__())  # 这样生成一个生成器
8 print(func().__next__())  # 这样生成一个生成器
9 print(func().__next__())  # 这样生成一个生成器
遇到yield就返回 再次打印还是从头开始 每次打印都生成一个新的生成器

函数遇到return就结束 遇到yield不结束就挂起 

yield作用 挂起 返回值 接受值

生成器一定是一个迭代器 迭代器不一定是生成器

生成器是可以让程序员自己定义的一个迭代器

生成器的好处 可以节省空间

生成器的特性 一次性的 惰性机制 从上到下

send 相当于 next + 传的值 第一次接触生成器时,如果要用send  send的值必须是None  一般建议使用__next__

yield from 将可迭代对象元素挨个返回

python2 3x 版本操作区别

python2 iter() next()

python3 iter() next() __next__() __iter__()

推导式

列表推导法 [结果 语法]  [ ] 是容器

集合推导法 [结果 语法}

字典推导法 {键:值 语法}

没有元组的推导式

看着像元组的推导式 其实是一个生成器推导式 

推导器可以节省代码

推导式不宜太长 可读性差

外部需要容器包一下 里边第一个位置是结果 剩下的是语法 每个间隔用空格隔开

 

原文地址:https://www.cnblogs.com/biulo/p/10542957.html