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

①:

 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. jquery查找子元素和兄弟元素

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  2. Jmeter拓展插件可查看和lr一样的图形结果

    利用插件可通过图形直观查看CPU.Memory等的运行情况 1. JmeterPlugins.jar插件下载地址:http://jmeter-plugins.org/downloads/all 下载并 ...

  3. mysql 导入 导出

    mysql导入导出sql文件   window下 1.导出整个数据库mysqldump -u 用户名 -p 数据库名 > 导出的文件名mysqldump -u dbuser -p dbname ...

  4. openmpi-3.0.1超线程报错问题

    先简单记录一下,虽然还有一些疑惑没有解决. 之前安装openmpi是用的命令安装,版本比较低,mfix并行总出现死锁问题,于是想看看是不是openmpi版本导致,虽然目前还未找到具体原因,但是先记录下 ...

  5. Luogu P1801 黑匣子_NOI导刊2010提高(06)

    P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...

  6. SCU - 4439 最小点覆盖

    题意:求最小的染色顶点数满足所有的边至少有个一端点被染色 2015四川省赛,过题数17/120+,还以为是什么难题,这不就是裸的二分图最小点覆盖吗.. 掏出了尘封一年的破板子 #include< ...

  7. POJ - 1948 二维01背包

    T了两发,DP方程很简单粗暴 dp[i][j][k]:用前i物品使得容量分别为j和k的背包恰好装满 背包的调用只需一次即可,第一次T就是每次check都丧心病狂地背包一次 对于sum的枚举,其实i j ...

  8. C++ GUI Qt4 编程 (第二版)

    [加拿大]JasminBlanchette [英]MarkSummerfield . 电子工业 2008. 前几天的问题多是因为版本不兼容的问题. QT本身Q4 Q5就有版本问题,然后集成到VS08 ...

  9. 03-树2 List Leaves (25 分)

    Given a tree, you are supposed to list all the leaves in the order of top down, and left to right. I ...

  10. 使用PHP并发执行任务–curl_multi应用

    使用PHP并发执行任务–curl_multi应用 原网址:http://lampblog.org/category/phpdev