函数进阶3 —— 生成器、yield from
今天我们在进一步了解一下,生成器。
①:
def func():
print('这是函数func')
return '函数func'
func()
结果是
这是函数func
②:
def func1():
print('这是函数func1')
yield '函数func'
func1()
③:
def func1():
print('这是函数func1')
yield '函数func'
print(func1())
结果:
<generator object func1 at 0x0000000002138E58> 返回的是func1的内存地址。
有没有发现这三个的值不一样。
那么 return 和yield 的区别是什么呢?
return是返回值,直接停止这个函数,
yield是分段停止这个函数。
1.生成器的本质就是迭代器
2.通过函数变成一个生成器
def func():
print(1)
yield 5 # 我的函数走到这了
print(2)
yield 9 # 我的函数走到这了 g = func() # 生成一个生成器 print(g.__next__())
print(g.__next__())
def func():
print(1)
# return 5
yield 5
print(func().__next__()) # 这样生成一个生成器
print(func().__next__()) # 这样生成一个生成器
print(func().__next__()) # 这样生成一个生成器
print(func().__next__()) # 这样生成一个生成器
def func():
print(1)
yield 5 # 我的函数走到这了
print(2)
yield 9 # 我的函数走到这了 g = func() # 生成一个生成器
print(g.__next__())
print(g.__next__()) 碰到return就结束函数
碰到yield不结束就挂起
生成器的好处,非常节省内存
def func():
print(1)
a = yield 2 # 1.挂起 2.返回值 3.接受值
print(a) # '123'
print(3)
b = yield 4
print(b) #'234'
c = yield 9
g = func() print(g.__next__()) #1 2 g.send(None)
print(g.send('')) # send = next+传值
print(g.send('')) # send = next+传值
# 第一次调用生成器的时候使用send里边的值必须是None
def func():
yield 1
yield 2 g = func()
ret = g.__next__()
print(ret+4)
print(g.__next__())
2.yield from
def func():
li = [1,2,3,4]
# yield li
yield from li #(= for yield in li) ret = func() # 把生成器的地址给了ret
print('is ret',ret.__next__()) #一个生成器
print('is ret',ret.__next__())
# 执行ret这个变量的指向的生成器地址:
print('is ret',ret)
# # 在全局空间找到一个变量叫做ret的,打印它的值 值就是生成器的地址
def func():
li = [1,2,3,4]
l2 = [5,6,7,8]
# yield from li
# yield from l2
for i in li:
yield i for em in l2:
yield em
#
ret = func() # 把生成器的地址给了ret
print('is ret',ret.__next__())
print('is ret',ret.__next__())
print('is ret',ret.__next__())
print('is ret',ret.__next__())
print('is ret',ret.__next__())
yield from li = for i in li
yield i
# 总结:
# 1.生成器的本质就是一个迭代器
# 2.生成器一定是一个迭代器,迭代器不一定是一个生成器
# 3.生成器是可以让程序员自己定义的一个迭代器
# 4.生成器的好处,节省内存空间
# 5.生成器的特性 一次性的,惰性机制,从上向下
# 6.send相当于 next+传值,第一次触生成器的时候,如果使用send(None)
# 值必须是None,一般我建议你们使用__next__
# 7. python2 iter() next()
# python3 iter() next() __next__() __iter__()
# 8.yield from 将可迭代对象元素逐个返回
3.推导式
一个容器包在最外面,结果,语法:
[结果,语法] #容器
# 列表推导式
li = []
for i in range(10):
li.append(i)
print(li) print([i for i in range(10)])
li = []
for i in range(10):
if i%2 == 1:
li.append(i)
print(li) print([i for i in range(10) if i%2 == 0]) # 过滤(筛选)
for循环的嵌套:
li = []
for i in range(3):
for em in range(3):
li.append(em)
print(li) # print([j for i in range(10) for em in range(3) for j in range(5)])
其字典、集合的推导式同列表推导式,没有元组推导式。
g = (i for i in range(10))
print(g) 结果:<generator object <genexpr> at 0x0000000002168E58>
函数进阶3 —— 生成器、yield from的更多相关文章
- Python进阶-VI 生成器函数进阶、生成器表达式、推导式
一.生成器函数进阶 需求:求取移动平均数 1.应用场景之一,在奥运会气枪射击比赛中,每打完一发都会显示平均环数! def show_avg(): print('你已进入显示移动平均环数系统!') a ...
- python开发函数进阶:生成器表达式&各种推导式
一,生成器表达式 #生成器表达式比列表解析更省内存,因为惰性运算 #!/usr/bin/env python #_*_coding:utf-8_*_ new_2 = (i*i for i in ran ...
- python语法基础-函数-迭代器和生成器-长期维护
############### 迭代器 ############## """ 迭代器 这是一个新的知识点 我们学习过的可以迭代的对象有哪些? list str ...
- 5 Python3 函数进阶&迭代器与生成器
1.函数进阶 1.1.名称空间 又名name space, 顾名思义就是存放名字的地方,存什么名字呢?举例说明,若变量x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的 ...
- Python全栈开发之路 【第五篇】:Python基础之函数进阶(装饰器、生成器&迭代器)
本节内容 一.名称空间 又名name space,就是存放名字的地方.举例说明,若变量x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方. 名称空间共3种,分别如下 ...
- [PY3]——函数——生成器(yield关键字)
函数—生成器篇 1. 认识和区分可迭代or生成器 1.1 可迭代对象 当你建立了一个列表,你可以逐项地读取这个列表,这叫做一个可迭代对象 当你使用一个列表生成式来建立一个列表的时候,就建立了一个可迭代 ...
- 巨蟒python全栈开发-第12天 生成器函数 各种推导式 yield from
一.今日主要内容总览(重点) 1.生成器(目的:帮助我们创建对象) (1)生成器的本质就是迭代器 (2)一个一个的创建对象 (3)创建生成器的方式: 1.生成器函数 2.通过生成器表达式来获取生成器 ...
- day4 内置函数 迭代器&生成器 yield总结 三元运算 闭包
内置函数: 内置函数 # abs()返回一个数字的绝对值.如果给出复数,返回值就是该复数的模. b = -100 print(b) print(abs(b)) # all() 所有为真才为真,只要有一 ...
- 2018.11.06 生成器函数进阶&列表推导式&生成器表达式
1.生成器函数进阶 2.列表推导式 3.生成器表达式
随机推荐
- SDUT OJ 顺序表应用3:元素位置互换之移位算法
顺序表应用3:元素位置互换之移位算法 Time Limit: 1000 ms Memory Limit: 570 KiB Submit Statistic Discuss Problem Descri ...
- phpstorm利用database连接mysql数据库
首先声明一点,database只能连接一个已存在的数据库,不能创建数据库 连接一个已存在的数据库步骤: 1,找到database:连续点击俩次shift,输入database就能找到了 2,点击绿色的 ...
- 【语义分割】large kernel matters中GCN模块的pytorch实现
GCN模块的实现比较简单,在giuhub上看到两种实现,轻微不同 实现一:https://github.com/ycszen/pytorch-segmentation/blob/master/gcn. ...
- 制作一句话图片马(NO)
- php Apache No input file
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] 变为 RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]
- asp.net 同时执行js事件和代码事件 导出 excel
onclick="return bnQuery_onclick()" onserverclick="bnQuery_ServerClick" public ...
- Just a Hook(线段树区间修改值)-------------蓝桥备战系列
In the game of DotA, Pudge's meat hook is actually the most horrible thing for most of the heroes. T ...
- POJ - 1061 扩展gcd
题意:求\((n-m)t+Lk=x-y\)的解\(t\) #include<iostream> #include<algorithm> #include<cstdio&g ...
- HDU - 2087 求不可重复字符串的匹配次数
只要KMP里对f[i]进行限制即可 /*H E A D*/ int nxt[maxn],f[maxn],ans; char T[maxn],P[maxn]; void buildNext(){ int ...
- springboot(六)-使用shiro
前提 写之前纠结了一番,这一节放在shiro里面还是springboot里面.后来想了下,还是放springboot里吧,因为这里没有shiro的新东西,只有springboot添加了新东西的使用. ...