python3 生成器和生成器表达式
'''普通函数'''
def func():
print(111)
return 222 ret = func() #
print(ret) #
111
222
'''函数中含有yield就是生成器'''
def func():
print(111)
yield 222 gen = func()
print(gen) # <generator object func at 0x0000000006085D00>
ret1 = gen.__next__() #
print(ret1) #
<generator object func at 0x0000000007A8BB48>
111
222
def func():
print(111)
yield 22
print(333)
yield 444 gen = func()
ret = gen.__next__() #
print(ret) #
ret2 = gen.__next__() #
print(ret2) #
ret3 = gen.__next__() # StopIteration: # 值取空,就报StopIteration
print(ret3)
111
22
333
444
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-25-9050db3134ee> in <module>()
10 ret2 = gen.__next__()
11 print(ret2)
---> 12 ret3 = gen.__next__()
13 print(ret3) StopIteration:
'''send和__next__()区别
1.send和next()都是让生成器向下走一次
2.send可以给上一个yield的位置传递值,不能给最后一个yield发送值,在第一次执行生成器代码的时候不能使用send()
'''
def func():
print(111)
a = yield "aaa"
print("a = ", a)
b = yield "bbb"
print("b = ", b)
c = yield "ccc"
print("c = ", c)
yield "Bye" gen = func()
print(gen.__next__()) # 111 aaa
print(gen.__next__()) # a = None bbb
print(gen.__next__()) # b = None ccc
print(gen.__next__()) # c = None Bye
print(gen.__next__()) # StopIteration
111
aaa
a = None
bbb
b = None
ccc
c = None
Bye
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-26-e1ddf9d0af94> in <module>()
14 print(gen.__next__()) # b = bbb ccc
15 print(gen.__next__()) # c = ccc Bye
---> 16 print(gen.__next__()) # StopIteration StopIteration:
def func():
print(111)
a = yield "aaa"
print("a = ", a)
b = yield "bbb"
print("b = ", b)
c = yield "ccc"
print("c = ", c)
yield "Bye" gen = func()
print(gen.__next__()) # 111 aaa
ret1 = gen.send("apple") # a = apple
print(ret1) # bbb
ret2 = gen.send("banana") # b = banana
print(ret2) # ccc
ret3 = gen.send("orange") # c = orange
print(ret3) # Bye
ret4 = gen.send("pear") # StopIteration
111
aaa
a = apple
bbb
b = banana
ccc
c = orange
Bye
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-27-3a8a2fe89824> in <module>()
17 ret3 = gen.send("orange") # c = orange
18 print(ret3) # Bye
---> 19 ret4 = gen.send("pear") # StopIteration StopIteration:
'''生成器可以使用for循环去内部的元素'''
def func():
print(111)
yield 222
print(333)
yield 444
print(555)
yield 666 gen = func()
for i in gen:
print(i)
111
222
333
444
555
666
'''yield在循环体内'''
def func(n):
print("start...")
count = 0
while count < n:
count += 1
yield count
print("end...") g = func(5) for i in g: #for循环本质就是next下一个元素
print(i) 返回结果:
start...
1
2
3
4
5
end...
'''注意区分send()给上一个yield位置传递一个值,yield是向外返回一个值'''
def func():
print("apple")
y1 = yield 2
print(y1, " = banana")
y2 = yield 1
print(y2, " = orange")
y3 = yield 3
print(y3) g = func()
print(g.__next__())
print(next(g))
print(g.send("big")) 返回结果:
apple
2
None = banana
1
big = orange
3
'''生成器表达式(结果 for循环 if语句)'''
# lst = [i*i for i in range(5)]
# print(lst) #列表生成式,直接生成一个列表,下面把中括号换为小括号,就是一个生成器
# g = (i*i for i in range(5))
# print(g) #生成器对象,省内存
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g)) #StopIteration
'''yield from是将列表中的每一个元素返回'''
def gen():
lst = ["apple", "banana", "pear", "orange"]
yield from lst g = gen()
for i in g:
print(i)
apple
banana
pear
orange
def gen():
lst = ["apple", "banana", "orange", "pear"]
lst2 = ["peach", "watermelon", "strawberry", "blueberry"]
yield from lst
yield from lst2 g = gen()
print(list(g)) # ['apple', 'banana', 'orange', 'pear', 'peach', 'watermelon', 'strawberry', 'blueberry']
['apple', 'banana', 'orange', 'pear', 'peach', 'watermelon', 'strawberry', 'blueberry']
'''
一个面试题,难度系数50000000000颗星
'''
# def add(a, b):
# return a + b
#
# def test():
# for r_i in range(4):
# yield r_i
#
# g = test() #g是一个生成器,也是一个迭代器
#
# for n in [2, 10]:
# g = (add(n, i) for i in g)
#
# print(list(g))
'''
分析,当n=2时, g = (add(n, i) for i in g) 右边是一个生成器表达式, g就是一个生成器
当n=10时, g = (add(n, i) for i in (add(n, i) for i in g)) 右边是一个生成器表达式, g就是一个生成器
当程序执行到list(g)时,开始取生成器里的值
当n=10时,g = (add(10, i) for i in (add(10, i) for i in g))
g = (add(10, i) for i in (10, 11, 12, 13))
g = (20, 21, 22, 23)
所以打印出来的值就是[20, 21, 22, 23]
'''
python3 生成器和生成器表达式的更多相关文章
- python全栈开发-前方高能-生成器和生成器表达式
python_day_13 今日主要内容1. 生成器和生成器函数生成器的本质就是迭代器生成器的三种创建办法: 1.通过生成器函数 2.通过生成器表达式创建生成器 3.通过数据转换 生成器函数: 函数中 ...
- python之序列去重以及生成器、生成器函数、生成器表达式与迭代器浅谈
首先要明确序列值类型是否可哈希,因为可哈希的值很简单就可以用 in /not in 写个生成器去判断,如果是不可哈希的就要去转换为可哈希的再用 in/not in 去判断 原地不可变类型(可哈希): ...
- Python3+迭代器与生成器
转载Python3 迭代器与生成器 迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素 ...
- 初识生成器与生成器表达式 Day12
一.生成器 1,生成器基本概念 生成器的实质是迭代器 迭代器:Iterator 内部同时包含了__iter__()和__next__()函数 可迭代对象:Iterable 内部包含__iter__() ...
- python day12 ——1.生成器2.生成器表达式 3.列表推导式
一.生成器 什么是生成器. 生成器实质就是迭代器. 在python中有三种方式来获取生成器: 1. 通过生成器函数. 2. 通过各种推导式来实现生成器 . 3. 通过数据的转换也可以获取生成器. 1. ...
- Python学习笔记(4):容器、迭代对象、迭代器、生成器、生成器表达式
在了解Python的数据结构时,容器(container).可迭代对象(iterable).迭代器(iterator).生成器(generator).列表/集合/字典推导式(list,set,dict ...
- Python3.x:生成器简介
Python3.x:生成器简介 概念 任何使用yield的函数都称之为生成器:使用yield,可以让函数生成一个序列,该函数返回的对象类型是"generator",通过该对象连续调 ...
- Python入门-生成器和生成器表达式
昨天我们说了迭代器,那么和今天说的生成器是什么关系呢? 一.生成器 什么是生成器?说白了生成器的本质就是迭代器. 在Python中中有三种方式来获取生成器. 1.通过生成器函数 2.通过各种推导式来实 ...
- python基础之生成器,三元表达式,列表生产式
生成器 1.什么是生成器? 在函数内但凡出现yield关键字,再调用函数就不会执行函数体代码,会返回一个值,该值称为生成器. 生成器的本质就是迭代器. 2.为什么要用生成器? 生成器是一种自定义迭代器 ...
- python基础之生成器、三元表达式、列表生成式、生成器表达式
生成器 生成器函数:函数体内包含有yield关键字,该函数执行的结果是生成器,生成器在本质上就是迭代器. def foo(): print('first------>') yield 1 pri ...
随机推荐
- Linux 解决Linux下火狐浏览器中文乱码成方块显示问题
解决Linux下火狐浏览器中文乱码成方块显示问题 by:授客 QQ:1033553122 测试环境: CentOS-6.0-x86_64 问题描述: 浏览器页面显示如下 解决方法: 安装中文支 ...
- C# 利用ReportViewer生成报表
本文主要是利用微软自带的控件ReportViewer进行报表设计的小例子,仅供学习分享使用,如有不足之处,还请指正. 涉及知识点: ReportViewer :位于Microsoft.Reportin ...
- Android-TextView 控件常用属性以及基本用法
github地址:https://github.com/1165863642/TextViewDemo 前言 这是我第一次写博客,第一次的笔记,不足之处多谅解.开门见山,这一篇博客主要讲一下在Andr ...
- Android智能指针SP WP使用方法介绍
Android手机操作系统既然是开源的操作系统.那么在具体的文件夹中就会存放着各种相关功能的开源代码.我们在使用的时候可以根据这些源代码进行相应的修改就能轻松的完成我们所需的功能.在这里大家就一起来看 ...
- recovery&linux系统升级数据更新分析总结
先说说对升级的理解吧.系统升级是软件更新及BUG修复的主要方式,升级的主要原理就是数据搬移的过程,把我们需要的数据,从某个地方,更新到另外的一个地方.这个过程就叫做升级.一般是当我们系统有了新的功能增 ...
- 遇到一个很古怪的问题,C++类static const成员的初始化
在我的文件里有这class NFDuration, NFDuration.h里是这样的: // A Duration represents the elapsed time between two i ...
- mssql sqlserver 取消数值四舍五入的方法分享
摘要: 下文讲述使用round sql函数,对数值型数据进行舍入操作 实验环境:sqlserver 2008 转自: http://www.maomao365.com/?p=6454 最近接到用户需求 ...
- 自动化测试基础篇--Selenium简介
摘自https://www.cnblogs.com/sanzangTst/p/7452636.html 一.软件开发的一般流程 二.什么叫软件测试? 软件测试(英语:Software Testing) ...
- 一、JSP标签介绍,自定义标签
一.JSP标签介绍 1. 标签库有什么作用 自定义标签库是一种优秀的表现层技术,之前介绍的MVC模式,我们使用jsp作为表现层,但是jsp语法嵌套在html页面,美工还是很难直接参与开发,并且jsp脚 ...
- 解决终端SSH连接服务器一段时间不操作之后卡死的问题
卡死是因为LIUNX安全设置问题,在一段时间内没有使用数据的情况下会自动断开,解决方法就是让本地或者服务器隔一段时间发送一个请求给对方即可 在本地打开配置文件(不建议在server端设置) sudo ...