深入理解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获得linux下所有挂载点(mount points)的方法
Apr 29 Python
python字符串过滤性能比较5种方法
Jun 22 Python
Python编程使用NLTK进行自然语言处理详解
Nov 16 Python
mac下如何将python2.7改为python3
Jul 13 Python
Python使用QQ邮箱发送邮件报错smtplib.SMTPAuthenticationError
Dec 20 Python
解决python Jupyter不能导入外部包问题
Apr 15 Python
如何将PySpark导入Python的放实现(2种)
Apr 26 Python
Python unittest基本使用方法代码实例
Jun 29 Python
python进行OpenCV实战之画图(直线、矩形、圆形)
Aug 27 Python
Python中的特殊方法以及应用详解
Sep 20 Python
Python中常见的反爬机制及其破解方法总结
Jun 10 Python
Python自动化实战之接口请求的实现
May 30 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/02/19 PHP
php控制文件下载速度的方法
2015/03/24 PHP
php文件扩展名判断及获取文件扩展名的N种方法
2015/09/12 PHP
php中关于长度计算容易混淆的问题分析
2016/05/27 PHP
Laravel 批量更新多条数据的示例
2017/11/27 PHP
Prototype 学习 工具函数学习($w,$F方法)
2009/07/12 Javascript
12个非常有创意的JavaScript小游戏
2010/03/18 Javascript
解析javascript系统错误:-1072896658的解决办法
2013/07/08 Javascript
js快速排序的实现代码
2013/12/08 Javascript
在网页中插入百度地图的步骤详解
2016/12/02 Javascript
解决vue 更改计算属性后select选中值不更改的问题
2018/03/02 Javascript
Vue实现PopupWindow组件详解
2018/04/28 Javascript
vue基础之模板和过滤器用法实例分析
2019/03/12 Javascript
小程序两种滚动公告栏的实现方法
2019/09/17 Javascript
VUE页面中通过双击实现复制表格中内容的示例代码
2020/06/11 Javascript
[04:27]DOTA2官方论坛水友赛集锦
2013/09/16 DOTA
[44:50]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 TNC vs VG
2018/04/02 DOTA
Python实现把xml或xsl转换为html格式
2015/04/08 Python
详解Python编程中time模块的使用
2015/11/20 Python
浅谈Python类里的__init__方法函数,Python类的构造函数
2016/12/10 Python
Python计算一个点到所有点的欧式距离实现方法
2019/07/04 Python
基于Python检测动态物体颜色过程解析
2019/12/04 Python
Python各种扩展名区别点整理
2020/02/27 Python
详解前端HTML5几种存储方式的总结
2016/12/27 HTML / CSS
怎样实现H5+CSS3手指滑动切换图片的示例代码
2019/05/05 HTML / CSS
切尔西足球俱乐部官方网上商店:Chelsea FC
2019/06/17 全球购物
应届生保险求职信
2013/11/11 职场文书
开学典礼决心书
2014/03/11 职场文书
自我鉴定书
2014/03/24 职场文书
家长寄语大全
2014/04/02 职场文书
博士生求职信
2014/07/06 职场文书
房地产销售员岗位职责
2015/04/11 职场文书
论文致谢词范文
2015/05/14 职场文书
党支部季度考核意见
2015/06/02 职场文书
一篇文章学会Vue中间件管道
2021/06/20 Vue.js
sass 常用备忘案例详解
2021/09/15 HTML / CSS