今天我们在进一步了解一下,生成器。

①:

 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的更多相关文章

  1. Python进阶-VI 生成器函数进阶、生成器表达式、推导式

    一.生成器函数进阶 需求:求取移动平均数 1.应用场景之一,在奥运会气枪射击比赛中,每打完一发都会显示平均环数! def show_avg(): print('你已进入显示移动平均环数系统!') a ...

  2. python开发函数进阶:生成器表达式&各种推导式

    一,生成器表达式 #生成器表达式比列表解析更省内存,因为惰性运算 #!/usr/bin/env python #_*_coding:utf-8_*_ new_2 = (i*i for i in ran ...

  3. python语法基础-函数-迭代器和生成器-长期维护

    ###############    迭代器    ############## """ 迭代器 这是一个新的知识点 我们学习过的可以迭代的对象有哪些? list str ...

  4. 5 Python3 函数进阶&迭代器与生成器

    1.函数进阶 1.1.名称空间 又名name space, 顾名思义就是存放名字的地方,存什么名字呢?举例说明,若变量x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的 ...

  5. Python全栈开发之路 【第五篇】:Python基础之函数进阶(装饰器、生成器&迭代器)

    本节内容 一.名称空间 又名name space,就是存放名字的地方.举例说明,若变量x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方. 名称空间共3种,分别如下 ...

  6. [PY3]——函数——生成器(yield关键字)

    函数—生成器篇 1. 认识和区分可迭代or生成器 1.1 可迭代对象 当你建立了一个列表,你可以逐项地读取这个列表,这叫做一个可迭代对象 当你使用一个列表生成式来建立一个列表的时候,就建立了一个可迭代 ...

  7. 巨蟒python全栈开发-第12天 生成器函数 各种推导式 yield from

    一.今日主要内容总览(重点) 1.生成器(目的:帮助我们创建对象) (1)生成器的本质就是迭代器 (2)一个一个的创建对象 (3)创建生成器的方式: 1.生成器函数 2.通过生成器表达式来获取生成器 ...

  8. day4 内置函数 迭代器&生成器 yield总结 三元运算 闭包

    内置函数: 内置函数 # abs()返回一个数字的绝对值.如果给出复数,返回值就是该复数的模. b = -100 print(b) print(abs(b)) # all() 所有为真才为真,只要有一 ...

  9. 2018.11.06 生成器函数进阶&列表推导式&生成器表达式

    1.生成器函数进阶 2.列表推导式 3.生成器表达式

随机推荐

  1. SDUT OJ 顺序表应用3:元素位置互换之移位算法

    顺序表应用3:元素位置互换之移位算法 Time Limit: 1000 ms Memory Limit: 570 KiB Submit Statistic Discuss Problem Descri ...

  2. phpstorm利用database连接mysql数据库

    首先声明一点,database只能连接一个已存在的数据库,不能创建数据库 连接一个已存在的数据库步骤: 1,找到database:连续点击俩次shift,输入database就能找到了 2,点击绿色的 ...

  3. 【语义分割】large kernel matters中GCN模块的pytorch实现

    GCN模块的实现比较简单,在giuhub上看到两种实现,轻微不同 实现一:https://github.com/ycszen/pytorch-segmentation/blob/master/gcn. ...

  4. 制作一句话图片马(NO)

  5. php Apache No input file

    RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] 变为 RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]

  6. asp.net 同时执行js事件和代码事件 导出 excel

     onclick="return bnQuery_onclick()" onserverclick="bnQuery_ServerClick"   public ...

  7. Just a Hook(线段树区间修改值)-------------蓝桥备战系列

    In the game of DotA, Pudge's meat hook is actually the most horrible thing for most of the heroes. T ...

  8. POJ - 1061 扩展gcd

    题意:求\((n-m)t+Lk=x-y\)的解\(t\) #include<iostream> #include<algorithm> #include<cstdio&g ...

  9. HDU - 2087 求不可重复字符串的匹配次数

    只要KMP里对f[i]进行限制即可 /*H E A D*/ int nxt[maxn],f[maxn],ans; char T[maxn],P[maxn]; void buildNext(){ int ...

  10. springboot(六)-使用shiro

    前提 写之前纠结了一番,这一节放在shiro里面还是springboot里面.后来想了下,还是放springboot里吧,因为这里没有shiro的新东西,只有springboot添加了新东西的使用. ...