深入理解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开启多个子进程并行运行的方法
Apr 18 Python
研究Python的ORM框架中的SQLAlchemy库的映射关系
Apr 25 Python
python字典键值对的添加和遍历方法
Sep 11 Python
Python实现K折交叉验证法的方法步骤
Jul 11 Python
Python学习笔记之字符串和字符串方法实例详解
Aug 22 Python
Python 私有化操作实例分析
Nov 21 Python
Python绘制全球疫情变化地图的实例代码
Apr 20 Python
keras实现theano和tensorflow训练的模型相互转换
Jun 19 Python
python自动统计zabbix系统监控覆盖率的示例代码
Apr 03 Python
教你如何使用Python实现二叉树结构及三种遍历
Jun 18 Python
python 中的jieba分词库
Nov 23 Python
一行Python命令实现批量加水印
Apr 07 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开发者事半功倍的十大技巧小结
2010/04/20 PHP
Windows下部署Apache+PHP+MySQL运行环境实战
2012/08/31 PHP
php+mysql+ajax实现单表多字段多关键词查询的方法
2017/04/15 PHP
JavaScript中void(0)的具体含义解释
2007/02/27 Javascript
js实现仿Discuz文本框弹出层效果
2015/08/13 Javascript
Jquery1.9.1源码分析系列(十五)动画处理之外篇
2015/12/04 Javascript
轻量级jQuery插件slideBox实现带底栏轮播(焦点图)代码
2016/03/28 Javascript
jQuery+CSS实现一个侧滑导航菜单代码
2016/05/09 Javascript
javascript获取select标签选中的值
2016/06/04 Javascript
利用JQuery直接调用asp.net后台的简单方法
2016/10/27 Javascript
JS实现搜索框文字可删除功能
2016/12/28 Javascript
JavaScript定义全局对象的方法示例
2017/01/12 Javascript
在点击div中的p时,如何阻止事件冒泡
2017/02/07 Javascript
浅谈AngularJS中使用$resource(已更新)
2017/09/14 Javascript
Three.js开发实现3D地图的实践过程总结
2017/11/20 Javascript
layui 给数据表格加序号的方法
2018/08/20 Javascript
JS原型与继承操作示例
2019/05/09 Javascript
python 解析XML python模块xml.dom解析xml实例代码
2014/02/07 Python
Python的requests网络编程包使用教程
2016/07/11 Python
Python简单实现安全开关文件的两种方式
2016/09/19 Python
django实现登录时候输入密码错误5次锁定用户十分钟
2017/11/05 Python
TensorFlow实现RNN循环神经网络
2018/02/28 Python
python实现数独游戏 java简单实现数独游戏
2018/03/30 Python
paramiko使用tail实时获取服务器的日志输出详解
2020/12/06 Python
斯图尔特·韦茨曼鞋加拿大官网:Stuart Weitzman加拿大
2019/10/13 全球购物
在阿尔卑斯山或希腊度过快乐假期:Alpine Elements
2019/12/28 全球购物
五年后的职业生涯规划
2014/03/04 职场文书
争先创优心得体会
2014/09/12 职场文书
医生党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
小学秋季运动会报道稿
2014/09/30 职场文书
校园新闻广播稿5篇
2014/10/10 职场文书
专业技术人员年度考核评语
2014/12/31 职场文书
房地产销售员岗位职责
2015/04/11 职场文书
煤矿隐患排查制度
2015/08/05 职场文书
神州牡丹园的导游词
2019/11/20 职场文书
MySQL事务的隔离级别详情
2022/07/15 MySQL