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

①:

 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. 冒泡排序 思想 JAVA实现

    已知一个数组78.75.91.36.72.94.43.64.93.46,使用冒泡排序将此数组有序. 冒泡排序是一个运行时间为O(N²)的排序算法. 算法思想:(已从小到大为例) 78.75.91.36 ...

  2. js 自定义属性

     html标签中有没有什么自带的属性可以存储成绩的----没有  本身html标签没有这个属性,自己(程序员)添加的,----自定义属性---为了存储一些数据  在html标签中添加的自定义属性,如果 ...

  3. FTP 两种连接模式

    简介 FTP协议要用到两个TCP连接, 一个是命令连接,用来在FTP客户端与服务器之间传递命令:另一个是数据连接,用来上传或下载数据.通常21端口是命令端口,20端口是数据端口.当混入主动/被动模式的 ...

  4. C++_新特性总结与未来的路

    了解C++之后,可以阅读一些高级主题和面向对象编程相关的书籍: OOP有助于开发大型的项目,并提高其可靠性: OOP方法的基本活动之一就是发明能够模拟当前情况的类.当前情况被统称为问题域. 由于实际问 ...

  5. abp + angular 项目 图标字体注意事项

    用的字体建议下载到本地,否则部署环境没有网络的话,则图片字体会不正常显示.

  6. Django settings配置文件

    由来:为什么我在用django配置的时候导入的不是我项目名下的那个settings 但是我配置了之后依然能够起作用,这是为什么? from django.conf import settings # ...

  7. 《STL详解》读书笔记

    vector 向量容器v.insert(v.begin(), num);//增加v.erase(v.begin(), v.end()); //擦除v.erase(v.begin());reverse( ...

  8. 2019.3.25 SQL语句(进阶篇1)

    运算符 基本的加减乘除取余都可以在SQL中使用 新建Employee1表并添加数据 create table Employee1 (eid int primary key auto_increment ...

  9. PIE SDK频率域滤波

    1.算法功能简介 频率域滤波的基本工作流程为:空间域图像的傅里叶变换→频率域图像→设计滤波器→傅里叶逆变换→其他应用. 低通滤波,对频率域的图像通过滤波器削弱或抑制高频部分而保留低频部分的滤波方法,可 ...

  10. PIE SDK神经网络聚类

    1.算法功能简介 神经网络是模仿人脑神经系统的组成方式与思维过程而构成的信息处理系统,具有非线性.自学性.容错性.联想记忆和可以训练性等特点.在神经网络中,知识和信息的传递是由神经元的相互连接来实现的 ...