python基础-生成器
生成器
概念:但凡在函数内部定义了一个yield,调用函数时,函数体代码不会执行,会返回一个结果,该结果就是生成器。本质上是迭代器,一个自定义的迭代器。
# python内获取迭代器的方式
def iter_func():
list1 = [1, 2, 3, 8, 4]
# 获取一个迭代器
iter_list = list1.__iter__()
while True:
try: # 捕获异常
# 执行__next__取值
print(iter_list.__next__())
except StopIteration:
break # 执行iter_func
iter_func() # 自定义一个迭代器
def func():
print("hello world!")
yield "dawn" res = func()
# 直接调用,返回了一个生成器:<generator object func at 0x000002376172F1C8>
print(res) # 如何获取生成器的内容呢?
# 生成器的本质是迭代器,迭代器对象取值通过.__next__
# 通过__next__ 取值时,才会执行函数体代码。
print(res.__next__())
输出结果:
hello world!
dawn
生成器如何实现:通过
yield关键字实现。yield只能在函数内部定义

每一次yield 都会往生成器传一个值。
可以保存函数的暂停状态
def yield_func():
print("自定义生成器开始……")
print("第一个yield:")
yield "yield--1"
print("第二个yield:")
yield "yield--2"
print("第三个yield:")
yield "yield--3"
print("最后一个yield:")
yield "yield--4"
print("查看,是否还有yield") res = yield_func()
print(res.__next__())
输出:
自定义生成器开始……
第一个yield:
yield--1
yield 和 return
- 相同点:返回值的个数无限制
- 不同点:return 有且只能返回一个值;yield 可返回多个值
# yield
def yield_func():
list1 = [2, 3, 4, 1]
dict1 = {"name": "dawn", "age": 18, "hobby": "read"}
tuple1 = (1, 'a', 2, 'b')
set1 = {23, 34, 'e'} yield list1
yield dict1
yield tuple1, set1 # return
def return_func():
list1 = [2, 3, 4, 1]
dict1 = {"name": "dawn", "age": 18, "hobby": "read"}
tuple1 = (1, 'a', 2, 'b')
set1 = {23, 34, 'e'} return list1,tuple1
#此处代码执行不到,函数代码题遇到return 以后就结束了
return dict1
使用yield 自定义一个range
"""
python2:range(1,5) ---→ [1,2,3,4]
python3:range(1,5) ---→ range对象 ---→ 生成器 ---→ 迭代器 range(start,stop,step)
"""
def my_range(start,end,step=1):
while start < end:
yield start
start += move
python基础-生成器的更多相关文章
- 第五章:Python基础の生成器、迭代器、序列化和虚拟环境的应用
本课主题 生成器介紹和操作实战 迭代器介紹和操作实战 序例化和反序例化 Json 和 Pickle 操作实战 字符串格式化的应用 创建虚拟环境实战 本周作业 生成器介紹和操作实战 什么是生成器,生成器 ...
- python基础——生成器表达式
生成器表达式 1 生成器表达式定义 生成器表达式并不真正的创建数字列表,而是返回一个生成器对象,此对象在每次计算出一个条目后,把这个条目"产生"(yield)出来.生成器表达式使用 ...
- Python菜鸟之路:Python基础-生成器和迭代器、递归
一.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问完结束.迭代器只能往前不会后退. 1. 迭代器优点 对于无法随机访问的数据结构(比如set)而言, ...
- python基础 生成器 迭代器
列表生成式: a=[1,2,3] print a b=[i*2 for i in range(10)] #i循环10次,每一个i的值乘2就是列表中的值.列表生成式 print b >>[1 ...
- Python基础-生成器和迭代器
生成器都是迭代器,迭代器不一定是生成器 def fansik(max): n, before, after = 0, 0, 1 while n < max: print(before) befo ...
- python基础——生成器与迭代器
生成器 def func(): print("111") yield 1 print("222") yield 3 print("333") ...
- python基础—迭代器、生成器
python基础-迭代器.生成器 1 迭代器定义 迭代的意思是重复做一些事很多次,就像在循环中做的那样. 只要该对象可以实现__iter__方法,就可以进行迭代. 迭代对象调用__iter__方法会返 ...
- 十三. Python基础(13)--生成器进阶
十三. Python基础(13)--生成器进阶 1 ● send()方法 generator.send(value) Resumes the execution, and "sends&qu ...
- 十二. Python基础(12)--生成器
十二. Python基础(12)--生成器 1 ● 可迭代对象(iterable) An object capable of returning its members one at a time. ...
随机推荐
- SpringMVC 给请求路径加上统一前缀
最开始想到的是通过硬编码的方式手动在每个路径上加上前缀, 后面发现这种方式太不智能了,万一要修改那还不得改死, Spring既然支持EL表达式, 那能不能通过EL表达式的方式去读取配置文件里面的属性来 ...
- activiti 术语 国际化文件
activiti-explorer editor-app 国际化文件 - 大强的博客 - CSDN博客https://blog.csdn.net/daqiang012/article/details/ ...
- Java8 Stream流方法
流是Java API的新成员,它允许以声明性方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现).就现在来说,可以把它们看成遍历数据集的高级迭代器.此外,流还可以透明地并行处理,无需写任何多 ...
- [LeetCode] 636. Exclusive Time of Functions 函数的独家时间
Given the running logs of n functions that are executed in a nonpreemptive single threaded CPU, find ...
- Redis 主从配置密码以及哨兵
目录: Redis 主从介绍 哨兵机制 Redis 主从配置 环境 安装 启动服务 检查主从状态 测试数据同步 默认是读写分离的 Redis Sentinel 配置 主Redis宕机测试 配置多个哨兵 ...
- ProtoStuff无法反序列化Deprecated注解成员问题记录
在开发过程中,遇到一个鬼畜的问题,在DO的某个成员上添加@Deprecated注解之后,通过ProtoStuff反序列化得到的DO中,这个成员一直为null:花了不少时间才定位这个问题,特此记录一下 ...
- java的byte[]与String相互转换
String转byte[] byte[] sInput = new byte[0]; try { // 可以指定编码,默认也只UTF-8 sInput = "这是内容".getBy ...
- Python开发之virtualenv和virtualenvwrapper详解
在使用 Python 开发的过程中,工程一多,难免会碰到不同的工程依赖不同版本的库的问题: 亦或者是在开发过程中不想让物理环境里充斥各种各样的库,引发未来的依赖灾难. 此时,我们需要对于不同的工程使用 ...
- 数据分析——Pandas的用法(Series,DataFrame)
我们先要了解,pandas是基于Numpy构建的,pandas中很多的用法和numpy一致.pandas中又有series和DataFrame,Series是DataFrame的基础. pandas的 ...
- memcached源码分析二-lru
在前一篇文章中介绍了memcached中的内存管理策略slab,那么需要缓存的数据是如何使用slab的呢? 1. 缓存对象item内存分布 在memcached,每一个缓存的对象都使用一个ite ...