#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 学习网站:www.liaoxuefeng.com
#****************************************************
# Python3 高级特性-生成器 *
#****************************************************
print ("--------------------分割线------------------")
#============
# 生成器
#============
'''
通过列表生成式,可以直接创建一个列表。但受内存限制,列表容量有限,而且
创建百万级元素的列表,不仅占用存储空间,如果只访问前几个元素,后面
元素占用的空间会白白浪费。
列表元素可以按照某种算法推算出来,在循环的过程中不断推算出后续的元素
这样就不必创建完整的list,节省大量的空间,这种一边循环一边计算的机制
称为生成器:generator。
'''
# 创建generator方法一:把列表生成式的[]改成()
list_a = [x*x for x in range(5)]
print( list_a ) # [0, 1, 4, 9, 16]
gen_a = (x*x for x in range(5))
print( gen_a )
# <generator object <genexpr> at 0x000002174EE158E0>
# 通过next()函数获得generator的下一个返回值,每次调用next(gen_a),就
# 计算出gen_a的下一个元素的值,直到最后一个值,没有更多元素则抛出
# StopIteration的错误
print( next(gen_a),next(gen_a) ) # 0 1
# 通常使用for循环获取generator元素
gen_b = (x*x for x in range(5))
for n in gen_b:
print(n, end=' ') # 0 1 4 9 16
print()
print ("--------------------分割线------------------")
# 如推算的算法比较复杂,用类似列表生成式的for循环无法实现的时候
# 还可以用函数来实现。
# 例:普通函数斐波那契数列 1, 1, 2, 3, 5, 8, 13,...
def fib(max):
n, a, b = 0, 0, 1
while n < max:
print( b,end=' ' )
a, b = b, a+b
n = n + 1
return 'done'
print( fib(7) ) # 1 1 2 3 5 8 13 done
# fib函数实际上定义了斐波那契数列的推算规则,把fib函数变成generator
# 只需要把print(b)改为yield b,这也是定义generator的另一种方法。
# 重新定义fib1函数,变为generator
def fib1(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a+b
n = n + 1
return 'done'
print( fib1(5) )
# <generator object fib1 at 0x0000014483FB5990>
aa = fib1(3)
print( next(aa),next(aa),next(aa) ) # 1 1 2
'''
generator与函数的执行流程不一样。函数是顺序执行,遇到return语句或者
最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候
执行,遇到yield语句返回,再次执行时,从上次返回的yield语句处继续执行。
'''
'''
在fib1循环过程中,必须要给循环设置一个条件退出循环,例如n<max,不然
就会产生一个无限数列出来。
函数变为generator后,基本不会用next()来获取下一个返回值,而是直接使用
for循环来迭代。
'''
for n in fib1(3):
print(n, end=' ') # 1 1 2
print()
print ("--------------------分割线------------------")
'''
上面for循环调用generator时,发现拿不到generator的return语句的返回值
如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在
StopIteration的value中。
'''
gen_c = fib1(5)
while True:
try:
x = next(gen_c)
print('gen_c',x)
except StopIteration as e:
print('Generator return value:', e.value)
break
'''
执行结果:
gen_c 1
gen_c 1
gen_c 2
gen_c 3
gen_c 5
Generator return value: done
'''
'''
小结:
可以简单地把列表生成式改成generator,也可以通过函数实现复杂逻辑的generator
generator工作原理:它是在for循环的过程中不断计算出下一个元素,并在适当
的条件结束for循环。对于函数改成的generator来说,遇到return语句或这执行到
函数体最后一行语句,就是结束generator的指令,for循环随之结束。
'''
# 杨辉三角:
def triangles(max):
list_x = [1]
y = 1
while y < max :
yield list_x
list_x = [1] + [ list_x[n] + list_x[n+1] for n in \
range(len(list_x)-1) ] + [1]
y = y + 1
for n in triangles(8):
print( n )
'''
执行结果:
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
'''
相关推荐
2-shell及常用命令-续.pdf
2-shell及常用命令-续.pdf
使用生成器对象_next_()方法或内置函数next()进行遍历
g = ((i+2)**2 for i in range(10))print(g) <generator object <genexpr> at 0x0000000002AECDB0> tuple(g) (4, 9, 16, 25, 36, 49, 64, 81, 100, 121) list(g) []g.__next__() ...
UDS $27服务DLL文件生成
UDS 27算法 DLL文件生成
Python3:报错generator object genexpr at 0x00000*********
Python3:报错generator object genexpr at 0x00000********* 下面是报错的代码: print(len(i for i in (iris_dataset[‘target’])if i == 1)) 原因是生成迭代器(这里不用太注意), print(len([i for i in (iris_dataset[‘target’])if i == 1])) 上面是正确的代码,用[]括起来,成功输出target为1的个数,50. ...
surfer10与Arcgis10.3 完美生成等值线和等值面方法
surfer10 与Arcgis10.3生成等值线和等值面的步骤如下: 1.准备surfer用的Book1.dat文件,格式如下: "x" "y" "z" 116.471992 40.809975 232 116.335556 40.700542 1235 116.541626 40.713333 214 116.73349 40.798607 566 2.在surfer中,选择Gr
双极性步进电机驱动技术:从H桥电路到精准控制
本文深入解析了双极性步进电机驱动技术的核心,从H桥电路的基础原理讲起,阐述了其作为实现电机正反转和精准控制的关键。文章详细介绍了H桥的工作模式、防共态导通设计,并对比了L298N、DRV8825及TMC2209等主流集成驱动芯片的选型。进一步探讨了通过微步进与电流矢量控制实现平滑、静音运行的高级技术,并提供了基于STM32的实战代码与避坑指南,帮助开发者从理论到实践全面掌握精准运动控制。
Python3 学习笔记6_字符串_20180224
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.runoob.com #**************************************************** # Python3 字符串 * #*************************...
ROS相机内参标定详细步骤指南
相机标定的目的是为了确定相机内部参数和外部参数,以便修正图像并将图像坐标映射到世界坐标,或者从世界坐标映射到图像坐标。这个过程是计算机视觉和三维感知任务的关键步骤之一,它有以下主要目的: 1. **减小畸变**:相机镜头和传感器可能引入径向和切向畸变,使得图像中的直线变得弯曲或者物体的形状不准确。通过标定相机,可以矫正这些畸变,使图像更准确。
Python3 学习笔记20_函数式编程-高阶函数-map/reduce_20180312
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.liaoxuefeng.com #**************************************************** # Python3 函数式编程-高阶函数-map/reduce * #************************...
Hermes 教程 05:多 Agent 编排
本文介绍了Hermes v0.13.0中的四种多Agent协作模式:1)delegate_task快速子任务模式,适合2-3个独立并行任务;2)spawn子Agent模式,实现零成本并行多步流水线;3)tmux交互子Agent模式,支持长期自主任务;4)全新Kanban看板系统,提供持久化AI团队协作框架。各模式在隔离级别、时长、工具访问和适用场景上存在差异,其中spawn模式通过独立上下文窗口实现零上下文成本。文章详细说明了每种模式的使用方法、限制条件和典型应用场景,并提供了具体代码示例和可视化流程图。K
★教程1:matlab学习教程入门100例目录
★基础入门 1.为什么要学习MATLAB 2.MATLAB安装 持续更新....... ★MATLAB基础编程语言熟悉
Python3 学习笔记5_数字(Number)_20180223
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.runoob.com #**************************************************** # Python3 数字(Number) * #***********************...
ACC自适应巡航系统
ACC自适应巡航系统可在高速驾驶情况下,自动控制纵向跟车距离,减轻驾驶员的工作量。该功能主要依靠安装在车辆前挡风玻璃上的摄像头和布置在格栅附近的雷达进行融合实现。
Python3 学习笔记8_元组_20180227
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.runoob.com #**************************************************** # Python3 元组 * #*************************...
YOLOv8交通管理 详细解释及代码完整示例
YOLOv8在交通管理中的应用及代码实现 摘要:本文详细介绍了YOLOv8在交通管理领域的应用场景,包括车辆检测、违规行为识别和行人安全预警等。文章提供了完整的Python代码示例,展示了如何使用YOLOv8进行交通对象检测和车辆计数统计。代码包含模型加载、对象检测、结果可视化等功能模块,并给出了性能优化和功能扩展建议。该实现基于Ultralytics框架,支持多种YOLOv8模型选择,可根据实际需求调整模型大小和检测参数。
计算机控制技术及应用
《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。
Python3 学习笔记14_递归函数_20180305
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.liaoxuefeng.com #**************************************************** # Python3 函数 * #************************...
Probability and Statistics - 4th edition
Probability and Statistics - 4th edition
Python3 学习笔记4_运算符_20180223
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.runoob.com #**************************************************** # Python3 运算符 * #*************************...
jre9下载 jdk9
(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】
Python3 学习笔记21_函数式编程-高阶函数-filter/sorted_20180312
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.liaoxuefeng.com #**************************************************** # Python3 函数式编程-高阶函数-filter/sorted * #*************************...
Python3 学习笔记13_函数的参数_20180305
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.liaoxuefeng.com #**************************************************** # Python3 函数 * #************************...
Python3 学习笔记23_函数式编程-匿名函数_20180314
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.liaoxuefeng.com #**************************************************** # Python3 函数式编程-匿名函数 * #************************...
Python3 学习笔记11_条件语句_20180301
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.runoob.com #**************************************************** # Python3 循环语句 * #*************************...
Python3 学习笔记9_字典_20180228
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.runoob.com #**************************************************** # Python3 字典 * #*************************...
Python3 学习笔记1_基础语法_20180209
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.runoob.com #**************************************************** # Python3 教程 * #*********************...
Python3 学习笔记10_条件语句_20180228
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.runoob.com #**************************************************** # Python3 条件语句 * #*************************...
Python3 学习笔记25_函数式编程-偏函数_20180315
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.liaoxuefeng.com #**************************************************** # Python3 函数式编程-偏函数 * #************************...
Python3 学习笔记3_基本数据类型_20180222
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.runoob.com #**************************************************** # Python3 基本数据类型 * #***************************...
3113



被折叠的 条评论
为什么被折叠?



