[py]函数中yield多次返回,延迟计算特性-杨辉三角
搞清什么是杨辉三角
每行是一个数组,
第一行: [1]
第二行: [1, 1]
第三行: [1, 2, 2, 1]
...
画的好看点就是,不过没啥卵用
1
/ \
1 1
/ \ / \
1 2 1
/ \ / \ / \
1 3 3 1
/ \ / \ / \ / \
1 4 6 4 1
/ \ / \ / \ / \ / \
1 5 10 10 5 1
打印杨辉三角
首先要解决一个函数,多次返回值, 我们知道py函数返回多个值,没啥问题. 但是要多次返回值呢?需要借助生成器来完成, 生成器的好处是可以保留现场,延迟操作
套路是 函数里使用yield关键字,相当于return, 不过可以有多个yield,但是不可以有多个return.
yield可以返回一个generator类型的值, 可以for in遍历
那么可不可以手动创建一个yield值呢? 可以
方法: 将列表推导式(一股脑生成所有值,为了简化for代码)的方括号改成圆括号即可.
x = [x * x for x in range(10)]
g = (x * x for x in range(10)) #2种遍历方法: 法1: next(g) 需处理StopIteration异常, 法2: for i in g
>>> next(g)
0
>>> next(g)
1
>>> next(g)
4
>>> next(g)
...
生成器小结:
凡是可作用于for循环的对象都是Iterable类型;
凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
- Python的for循环本质上就是通过不断调用next()函数实现的,例如:
for x in [1, 2, 3, 4, 5]:
pass
实际上完全等价于:
# 首先获得Iterator对象:
it = iter([1, 2, 3, 4, 5])
# 循环:
while True:
try:
# 获得下一个值:
x = next(it)
except StopIteration:
# 遇到StopIteration就退出循环
break
先搞清楚生成器-用在函数里,多次返回值,具有保留现场,延迟操作的功效
这个程序执行过程, for语句一股脑构造好arr数据后一次性返回
def sc(N):
arr = []
for i in range(N):
arr.append(i**2)
return arr
for i in sc(10):
print(i)
改成yield(相当于return,所以一定写在函数里,但可以写多条.)
执行过程: 遇到yield即刻保留现场,yield的内容返回给调用者. 再次调用函数时,从上次yield下一条语句开始执行,遇到下一个yield直接返回内容.
def sc(N):
for i in range(N):
yield i ** 2
for i in sc(10):
print(i)
如果还不太清楚,且看
yield返回的是generator
def odd():
print('step 1')
g = odd()
print(type(odd)) #<class 'function'>
print(type(g)) #<class 'NoneType'>
def odd():
print('step 1')
yield (1)
print('step 2')
yield (2)
print('step 3')
yield (3)
g = odd()
print(type(odd))#<class 'function'>
print(type(g)) #<class 'generator'>
yield调用过程, 和调用的2种方法
def odd():
print('step 1')
yield (1)
print('step 2')
yield (2)
print('step 3')
yield (3)
g = odd()
print(type(g))
print(type(odd))
#遍历生成器,方法1: 最后没值了后异常(StopIteration)
next(g)
next(g)
next(g)
#遍历生成器,方法2: 不用关心StopIteration异常
for i in g:
print(g)
---
step 1
1
step 2
2
step 3
3
打印杨辉三角
# 期待输出:
# [1]
# [1, 1]
# [1, 2, 2, 1]
# [1, 3, 3, 1]
# [1, 4, 6, 4, 1]
# [1, 5, 10, 10, 5, 1]
# [1, 6, 15, 20, 15, 6, 1]
# [1, 7, 21, 35, 35, 21, 7, 1]
# [1, 8, 28, 56, 70, 56, 28, 8, 1]
# [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
- 首先构造这样的数列
#第1次返回[1]
#第2次返回[1, 1]
#第3次返回[1, 2, 1]
# 每行的模式
[1, 2, 2, 1] = [1,2]+[2,1]
for i in range(n):
i=i+1
arr = list(range(1, i))
arr = arr + list(reversed(arr))
- 其次yield实现多次返回
def yanghui():
yield [1]
yield [1, 1]
yield [1, 2, 2, 1]
for i in yanghui():
print(i)
---
[1]
[1, 1]
[1, 2, 2, 1]
最终实现
def yanghui(n):
for i in range(n):
#
i=i+1
arr = list(range(1, i))
arr = arr + list(reversed(arr))
# list(range(1, 1)) ==> []
if arr == []:
arr = [1]
yield arr
for i in yanghui(10):
print(i)
[py]函数中yield多次返回,延迟计算特性-杨辉三角的更多相关文章
- Python使用函数实现杨辉三角
运行效果: 可在函数中指定阶层数,输出对应的杨辉三角 源代码如下: 1 # -*-coding:utf-8 -*- 2 ''' 3 chapter4_do.py 4 函数yanghui(n)用于输出n ...
- js中实现杨辉三角
实现效果:杨辉三角 即: 提示用户输入要实现的杨辉三角行数: 请输入杨辉三角的行数: 8 代码实现后的效果如下: 1 1.1 1.2.1 1.3.3.1 1.4.6.4.1 1.5.10.10.5.1 ...
- 理解 ES6 语法中 yield 关键字的返回值
在 ES6 中新增了生成器函数的语法,本文解释了生成器函数内 yield 关键字的返回值. 描述 根据语法规范,yield 关键字用来暂停和继续执行一个生成器函数.当外部调用生成器的 next() 方 ...
- 以杨辉三角为例,从内存角度简单分析C语言中的动态二维数组
学C语言,一定绕不过指针这一大难关,而指针最让人头疼的就是各种指向关系,一阶的指针还比较容易掌握,但一旦阶数一高,就很容易理不清楚其中的指向关系,现在我将通过杨辉三角为例,我会用四种方法从内存的角度简 ...
- 【Python入门学习】列表生成和函数生成器的方式实现杨辉三角
列表生成: L = [i for i in range(10)] 列表生成器: g = (i for i in range(10)) 函数生成器使用的关键字yield实现 例如fib生成器 def f ...
- 利用yield关键字输出杨辉三角
最近学习了下python,发现里面也有yield的用法,本来对C#里的yield不甚了解,但是通过学习python,对于C#的yield理解更深了!! 不多说了,小学生水平的表达能力伤不起.... 直 ...
- 返回闭包不能引用循环变量,请改写count()函数,让它正确返回能计算1x1、2x2、3x3的函数。
错误写法: 正确写法:
- 给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
从第0行开始,输出第k行,传的参数为第几行,所以在方法中先将所传参数加1,然后将最后一行加入集合中返回. 代码如下: public static List<Integer> generat ...
- Java小题,通过JNI调用本地C++共享库中的对应方法实现杨辉三角的绘制
1.在Eclipse中配置Javah,配置如下 位置是你javah.exe在你电脑磁盘上的路径 位置:C:\Program Files\Java\jdk1.8.0_112\bin\javah.exe ...
随机推荐
- Linux下的XAMPP基本配置技巧(设置虚拟主机、添加FTP账户等)
xampp安装好之后就只有一个默认站点及一个默认nobody的ftp账户,这显然不符合我们平时的需求了,那么下面就来讲一下如何设置并管理多个虚拟主机及ftp账户了,至于xampp的安装不在此讨论范围, ...
- linux禁止IPv6
1. 禁止加载IPv6模块 # echo "install ipv6 /bin/true" > /etc/modprobe.d/disable-ipv6.conf 每当系统需 ...
- django进阶-1
前言: 各位久等了,django进阶篇来了. 一.get与post 接口规范: url不能写动词,只能写名词 django默认只支持两种方式: get, post get是获取数据 ?user=zcl ...
- c++ malloc与free
今天看STL内存配置器的时候,第一级配置器就是直接用malloc.free来管理内存. 而free和malloc都只需要传入或传出一个指针就能分配和释放内存了. 编译器是如何知道,这个指针指向的空间的 ...
- Metrics.Net构建指标监控中心
Metrics.NET(https://github.com/etishor/Metrics.NET)是一个给CLR 提供度量工具的包,它是移植自Java的metrics,支持的平台 .NET 4.5 ...
- STM8L外部中断 为何 死循环 寄存器操作
STM8L 系列单片机是 ST公司推出的低功耗单片机,与STM8S系列相比功耗降低了很多,但内部结构也删减了很多,使用时一定要仔细阅读手册. 这是第一次使用STM8,实现功能不是很复杂就没想研究库函 ...
- Nhibernate学习
Contains 缓存中是否存在SessionFactoryBizCom.GetInstance().GetCurrentSession().Contains(t1) Evict 临时状态(Trans ...
- Unity3D笔记十五 碰撞、移动
碰撞 Collision. [kəˈliʒən] 碰撞:冲突:(意见,看法)的抵触:(政党等的)倾轧 选择一个需要添加碰撞器的游戏对象后 Component->Physics- Unity一共为 ...
- jquery ajax中事件的执行顺序
jquery中各个事件执行顺序如下: 1.ajaxStart(全局事件) 2.beforeSend 3.ajaxSend(全局事件) 4.success 5.ajaxSuccess(全局事件) 6.e ...
- AngularJS初始(一)
什么是AngularJs? angularjs是一个为动态WEB应用设计的结构框架.它能让你使用HTML作为模板语言,通过扩展HTML的语法,让你能更清楚.简洁地构建你的应用组件.它的创新点在于,利用 ...