什么是生成器:
只要函数内部包含有yield关键字,那么函数名()的到的结果(生成器地址)就是生成器,
再调用函数不会执行函数内部代码
这个生成器本身有  _iter_  he  _next_功能(即生成器就是一个迭代器)

为什么要用生成器:
生成器是一种自定义迭代器的方式

总结yield的功能
1、提供一种自定义迭代器的方式
2、yield可以暂停住函数,返回值

yield he return
相同点:都是用在函数内,都可以返回值,没有类型限制,没有个数限制
不同点:return只能返回一次值,yield可以返回多次值

1.生成器next取值,例如1:
def func():                          #第一步:定义函数
    print('first1')
    print('first2')
    print('first3')
    yield 1 #暂停
    print('second1')
    print('second2')
    print('second3')
    yield 2  #暂停
    print('third')
    yield 3 #暂停
    print('fourth')
g=func()                             #调用函数,不执行函数体代码(只是得到了生成器即迭代器)
print(g)
res1=next(g) #把yield后面的返回值赋值给res1  #取到一个值,这个值是由func中的yield控制的,所以next后会逐一从上到下打印           
print('第一次的返回值:',res1)

print('='*100)
res2=next(g)
print('第二次的返回值:',res2)

输出结果为:
<generator object func at 0x05597BD0>
first1
first2
first3
第一次的返回值: 1
===============================================================
second1
second2
second3
第二次的返回值: 2

1.生成器next取值(for循环),例如2:

for item in g:  #g=iner(g)  #item=next(g)
    pass        #注意next(g)只会打印函数体print的结果,碰到yield会暂停pass,yield,继续下次循环

输出结果:
first1
first2
first3
second1
second2
second3
third
fourth

实际每次yield的值已经赋值给了item=next(g),item,只是上面没有打印
for item in g:
    print(item)
first1
first2
first3
1
second1
second2
second3
2
third
3
fourth

2.自定义range函数模型(例如:my_range)
def my_range(start,stop,step=1):
    while start < stop:
        yield start
        start+=step

obj=my_range(1,7,2) #顾头不顾尾只能从1,2,3,4,5,6中取值
print(next(obj))    #1
print(next(obj))    #3
print(next(obj))    #5
print(next(obj))   #报错StopIteration

3.三元表达式 (条件成立时返回值 if 条件 else 条件不成立时返回值)
x=10
y=20
res = x if x > 10 else y
print(res)

4.列表生成式:(值放在for循环的左边))(给一筐鸡蛋)

#原始取值
l=[]
for i in range(1,11):
    l.append(i)
    print(l)
 
改进为:
l=[i for i in range(1,11)]
print(l)     #[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]  得到的是一组列表,占内存空间大

例如1:
names=['alex','wxx','lxx']
names=[name+'SB' for name in names]
print(names)  #['alexSB', 'wxxSB', 'lxxSB']

5.生成器表达式:(给一只鸡)
# 相对列生成式省空间,刚开始什么都不执行,t本身就是一个迭代器,需要逐一取值
t=(i for i in range(100000000))
print(t)       #<generator object <genexpr> at 0x05057BD0> 得到的是一个生成器不占内存空间
print(next(t))  #0
print(next(t))  #1
print(next(t))  #2

6.字典生成式:()
keys=['name','age','sex']
values=['egon',18,'male']
res=zip(keys,values)
print(list(res))    #[('name', 'egon'), ('age', 18), ('sex', 'male')]
方式一
d={ }
for k,v in zip(keys,values):
    d[k]=v
print(d)   #{'name': 'egon', 'age': 18, 'sex': 'male'}

方式二
d={k:v for k,v in zip(keys,values)}
print(d)   #{'name': 'egon', 'age': 18, 'sex': 'male'}

7.zip()拉链函数:
s='hello'
l=[1,2,3,]
res=zip(s,l)
print(list(res))    #[('h', 1), ('e', 2), ('l', 3)]

8.max函数(取位数最长的值len)
情况1:
with open('a.txt',encoding='utf-8') as f:
    nums=[len(line) for line in f]  #【】nums里面已经把值全部存放到列表中
    print(max(nums))                   #返回值32
print(max(nums))   #在任何地方取都OK   #返回值32
# 情况2:
with open('a.txt',encoding='utf-8') as f:
    nums=(len(line) for line in f)  #如果(),nums是迭代器对象,每取一次里面就没有了
    print(max(nums))                   #返回值32
print(max(nums))   #max() arg is an empty sequence 上面已经去过最大值,再取提示为空

最新文章

  1. Pip Permittion Issue on MacOS
  2. 1 、Linux-Rhel6终端介绍-Shell提示符
  3. DBHelper 数据库帮助类
  4. C#委托(Delegate)学习日记
  5. IOS的工程目录结构和生命周期
  6. 那些年被我坑过的Python——牵一发动全身 第十一章MySQL、ORM
  7. 未在本地计算机上注册“Microsoft.Ace.OleDB.12.0”
  8. Java中的clone()----深复制,浅复制
  9. nginx.conf配置文件的简单说明
  10. CCF系列之画图(201409-2)
  11. awk 实用技巧
  12. 我眼中的Linux设备树(五 根节点)
  13. 子线程更新UI界面的2种方法
  14. Linux VNC安装
  15. S2 深入.NET和C#编程 笔试测试错题积累
  16. harbor镜像仓库-01-搭建部署
  17. 根据条件设置poplist的值集
  18. suggest parentheses around comparison in operand of &amp;|
  19. 封装的一套简单轻量级JS 类库(RapidDevelopmentFramework.JS)
  20. test20181029 宝藏

热门文章

  1. WebView全面学习(一)--常用类和方法
  2. HDU 4507 吉哥系列故事——恨7不成妻 (数位DP)
  3. 【Python图像特征的音乐序列生成】深度卷积网络,以及网络核心
  4. UVA1602 Lattice Animals 网格动物 (暴力,STL)
  5. 2018.3.31 java中的递归
  6. eclipse报错GC overhead limit exceed,卡顿
  7. DROP OPERATOR CLASS - 删除一个操作符类
  8. Java写诗程序
  9. JavaScript无提示关闭当前页面窗口,兼容IE/Firefox/Chrome
  10. python-IE浏览器调用