深入理解python函数递归和生成器


Posted in Python onJune 06, 2016

一、什么是递归

如果函数包含了对其自身的调用,该函数就是递归的。递归做为一种算法在程序设计语言中广泛应用,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。例如,要计算1-9的9位数字的乘积,直观的算法是1*2*3*4*5*6*7*8*9,如果要计算1-10000的乘积,直观的算法就难于实现出,而递归就可以很简单的实现。请看示例:

def fact(n):#计算给定数字到一的乘积
   if n<=1:
     return 1
   else:
     return n * fact(n-1) 
print (fact(7))

结果为:5040

下面我们用示例来看看递归的执行过程:

def calc(n):
   print(n)
   if n/2 > 1:
     res = calc(n/2)
   return n
 calc(8)

结果为:

8
4.0
2.0

再看这一个示例:

def calc(n):
  print(n)
  if n/2 > 1:
    res = calc(n/2)
    print('res:',res)
  print("N:",n)
  return n
calc(8)

结果为:

8
4.0
2.0
N: 2.0
res: 2.0
N: 4.0
res: 4.0
N: 8

二、生成器

生成器是一个带 yield 语句的函数。一个函数或者子 程序只返回一次,但一个生成器能暂停执行并返回一个中间的结果,返 回一个值给调用者并暂停执行。当生成器的 next()方法被调用的时候,它会准确地从离开地方继续

下面看示例:

def func():
  print('11111111')
  yield [1]
  print(2222222222)
  yield 2
  print(3333333333)
  yield 3

ret=func()
r1=ret.__next__()
print(r1)
r2=ret.__next__()
print(r2)
r3=ret.__next__()
print(r3)

结果为:

11111111
[1]
2222222222
2
3333333333
3

由于 python 的 for 循环有 next()调用和对 StopIteration 的处理, 使用一个 for 循环而不是手 动迭代穿过一个生成器(或者那种事物的迭代器)总是要简洁漂亮得多。例:

def func():
  print('11111111')
  yield [1]
  print(2222222222)
  yield 2
  print(3333333333)
  yield 3
ret=func()
for i in ret:
  print(i)

结果同前面相同。

这些简单的例子应该让你有点明白生成器是如何工作的。除了 next()来获得下个生成的值,用户 可以将值回送给生成器[send()],在生成器中抛出异常,以及要求生成器退出[close()]

下面是一个展示了这些特性的,简单的例子。

def counter(start_at=0):
count = start_at

while True:


val = (yield count) if val is not None:


count = val

else:


count += 1

生成器带有一个初始化的值,对每次对生成器[next()]调用以 1 累加计数。用户已可以选择重 置这个值,如果他们非常想要用新的值来调用 send()不是调用 next()。这个生成器是永远运行的,所以如果你想要终结它,调用 close()方法。如果我们交互的运行这段代码,会得到如下输出:

>>> count = counter(5)
>>> count.next()
5
>>> count.next()
6
>>> count.send(9)
9
>>> count.next()
10
>>> count.close()
>>> count.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration

以上这篇深入理解python函数递归和生成器就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用mailbox打印电子邮件的方法
Apr 30 Python
Python selenium如何设置等待时间
Sep 15 Python
Python基于csv模块实现读取与写入csv数据的方法
Jan 18 Python
Python编程实现从字典中提取子集的方法分析
Feb 09 Python
python topk()函数求最大和最小值实例
Apr 02 Python
python torch.utils.data.DataLoader使用方法
Apr 02 Python
解决jupyter notebook import error但是命令提示符import正常的问题
Apr 15 Python
完美解决python针对hdfs上传和下载的问题
Jun 05 Python
关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题
Nov 24 Python
Python urlopen()参数代码示例解析
Dec 10 Python
详解用 python-docx 创建浮动图片
Jan 24 Python
python 爬取豆瓣网页的示例
Apr 13 Python
python下调用pytesseract识别某网站验证码的实现方法
Jun 06 #Python
浅析AST抽象语法树及Python代码实现
Jun 06 #Python
使用Python的Flask框架构建大型Web应用程序的结构示例
Jun 04 #Python
在Python的Flask框架中构建Web表单的教程
Jun 04 #Python
Python中规范定义命名空间的一些建议
Jun 04 #Python
全面理解Python中self的用法
Jun 04 #Python
举例讲解Python中字典的合并值相加与异或对比
Jun 04 #Python
You might like
php中让上传的文件大小在上传前就受限制的两种解决方法
2013/06/24 PHP
php将字符串转换成16进制的方法
2015/03/17 PHP
Yii框架组件和事件行为管理详解
2016/05/20 PHP
建立良好体验度的Web注册系统ajax
2007/07/09 Javascript
不用AJAX和IFRAME,说说真正意义上的ASP+JS无刷新技术
2008/09/25 Javascript
IE6下js通过css隐藏select的一个bug
2010/08/16 Javascript
基于jQuery的可用于选项卡及幻灯的切换插件
2011/03/28 Javascript
js事件(Event)知识整理
2012/10/11 Javascript
jQuery在html有效在jsp无效的原因及解决方法
2013/08/02 Javascript
js监听鼠标事件控制textarea输入字符串的个数
2014/09/29 Javascript
jq实现左滑显示删除按钮,点击删除实现删除数据功能(推荐)
2016/08/23 Javascript
jQuery实现的小图列表,大图展示效果幻灯片示例
2016/10/25 Javascript
基于jQuery的select下拉框选择触发事件实例分析
2016/11/18 Javascript
理解nodejs的stream和pipe机制的原理和实现
2017/08/12 NodeJs
JavaScript解析机制与闭包原理实例详解
2019/03/08 Javascript
angular组件间传值测试的方法详解
2020/05/07 Javascript
15个简单的JS编码标准让你的代码更整洁(小结)
2020/07/16 Javascript
JavaScript中Object、map、weakmap的区别分析
2020/12/15 Javascript
[01:03:41]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第三场 2月2日
2021/03/11 DOTA
python的描述符(descriptor)、装饰器(property)造成的一个无限递归问题分享
2014/07/09 Python
python中reduce()函数的使用方法示例
2017/09/29 Python
Python语言实现百度语音识别API的使用实例
2017/12/13 Python
python的re正则表达式实例代码
2018/01/24 Python
windows下numpy下载与安装图文教程
2019/04/02 Python
python中matplotlib条件背景颜色的实现
2019/09/02 Python
如何在VSCode下使用Jupyter的教程详解
2020/07/13 Python
python统计mysql数据量变化并调用接口告警的示例代码
2020/09/21 Python
amazeui时间组件的实现示例
2020/08/18 HTML / CSS
伦敦高级内衣品牌:Agent Provocateur(大内密探)
2016/08/23 全球购物
法国娇韵诗官方旗舰店:Clarins是来自法国的天然护肤品牌
2018/06/30 全球购物
英国信箱在线鲜花速递公司:Bloom & Wild
2019/03/10 全球购物
篝火晚会策划方案
2014/05/16 职场文书
学习之星事迹材料
2014/05/17 职场文书
心得体会格式及范文
2016/01/25 职场文书
分享几个简单MySQL优化小妙招
2022/03/31 MySQL
MySQL count(*)统计总数问题汇总
2022/09/23 MySQL