深入理解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 12306抢火车票脚本 Python京东抢手机脚本
Feb 06 Python
对python sklearn one-hot编码详解
Jul 10 Python
Python 删除整个文本中的空格,并实现按行显示
Jul 24 Python
python 处理string到hex脚本的方法
Oct 26 Python
利用Django模版生成树状结构实例代码
May 19 Python
python判断链表是否有环的实例代码
Jan 31 Python
基于python实现ROC曲线绘制广场解析
Jun 28 Python
PyCharm2020.1.1与Python3.7.7的安装教程图文详解
Aug 07 Python
基于Python的图像阈值化分割(迭代法)
Nov 20 Python
python爬虫scrapy基于CrawlSpider类的全站数据爬取示例解析
Feb 20 Python
Pytorch DataLoader shuffle验证方式
Jun 02 Python
python 实现两个变量值进行交换的n种操作
Jun 02 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
asp.net下利用js实现返回上一页的实现方法小集
2009/11/24 Javascript
Safari5中alert的无限循环BUG
2011/04/07 Javascript
关于全局变量和局部变量的那些事
2013/01/11 Javascript
JS的参数传递示例介绍
2014/02/08 Javascript
jquery动态分页效果堪比时光网
2014/09/25 Javascript
input输入框鼠标焦点提示信息
2015/03/17 Javascript
jquery滚动特效集锦
2015/06/03 Javascript
JS截取与分割字符串常用技巧总结
2015/11/10 Javascript
全面详细的jQuery常见开发技巧手册
2016/02/21 Javascript
Bootstrap每天必学之日期控制
2016/03/07 Javascript
快速掌握Node.js模块封装及使用
2016/03/21 Javascript
第五章之BootStrap 栅格系统
2016/04/25 Javascript
AngularJS基础 ng-init 指令简单示例
2016/08/02 Javascript
javascript ES6中箭头函数注意细节小结
2017/02/17 Javascript
浅析vue-router jquery和params传参(接收参数)$router $route的区别
2018/08/03 jQuery
RequireJS用法简单示例
2018/08/20 Javascript
node.js监听文件变化的实现方法
2019/04/17 Javascript
[00:30]明星选手化身超级英雄!2018DOTA2亚洲邀请赛全明星赛来临!
2018/04/06 DOTA
Python 爬虫模拟登陆知乎
2016/09/23 Python
Python的互斥锁与信号量详解
2019/09/12 Python
Python3读取和写入excel表格数据的示例代码
2020/06/09 Python
通过实例解析Python文件操作实现步骤
2020/09/21 Python
python实现网页录音效果
2020/10/26 Python
python 实现数据库中数据添加、查询与更新的示例代码
2020/12/07 Python
世界上最大的乐器零售商:Guitar Center
2017/11/07 全球购物
心碎乌托邦的创业计划书范文
2013/12/26 职场文书
2014最新党员违纪检讨书
2014/10/12 职场文书
工厂清洁工岗位职责
2015/02/14 职场文书
交通事故赔偿起诉书
2015/05/20 职场文书
小学感恩主题班会
2015/08/12 职场文书
自荐信范文
2019/05/20 职场文书
导游词之香港-太平山顶
2019/10/18 职场文书
如何使用Python对NetCDF数据做空间相关分析
2021/04/21 Python
MongoDB修改oplog大小的四种方法
2022/04/11 MongoDB
vue3不同环境下实现配置代理
2022/05/25 Vue.js
小程序自定义轮播图圆点组件
2022/06/25 Javascript