深入理解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读写excel的方法
Nov 18 Python
解决python文件字符串转列表时遇到空行的问题
Jul 09 Python
Python 编码规范(Google Python Style Guide)
May 05 Python
解决tensorflow模型参数保存和加载的问题
Jul 26 Python
pycharm 将python文件打包为exe格式的方法
Jan 16 Python
Python2与Python3的区别详解
Feb 09 Python
使用 pytorch 创建神经网络拟合sin函数的实现
Feb 24 Python
python seaborn heatmap可视化相关性矩阵实例
Jun 03 Python
浅谈python 调用open()打开文件时路径出错的原因
Jun 05 Python
python3爬虫中引用Queue的实例讲解
Nov 24 Python
Python修改DBF文件指定列
Dec 19 Python
OpenCV-Python实现怀旧滤镜与连环画滤镜
Jun 09 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 破解防盗链图片函数
2008/12/09 PHP
setInterval 和 setTimeout会产生内存溢出
2008/02/15 Javascript
不用AJAX和IFRAME,说说真正意义上的ASP+JS无刷新技术
2008/09/25 Javascript
浅析onsubmit校验表单时利用ajax的return false无效问题
2013/07/10 Javascript
jQuery点击弹出下拉菜单的小例子
2013/08/01 Javascript
Javascript实现滚动图片新闻的实例代码
2013/11/27 Javascript
javascript格式化json显示实例分析
2015/04/21 Javascript
基于Node.js的强大爬虫 能直接发布抓取的文章哦
2016/01/10 Javascript
JS组件Bootstrap导航条使用方法详解
2016/04/29 Javascript
JavaScript 对象字面量讲解
2016/06/06 Javascript
一个炫酷的Bootstrap导航菜单
2016/12/28 Javascript
jQuery实现遍历复选框的方法示例
2017/03/06 Javascript
js中获取键盘按下键值event.keyCode、event.charCode和event.which的兼容性详解
2017/03/15 Javascript
Node.js 使用命令行工具检查更新
2017/06/08 Javascript
解决vue 更改计算属性后select选中值不更改的问题
2018/03/02 Javascript
面试题:react和vue的区别分析
2019/04/08 Javascript
一个小时快速搭建微信小程序的方法步骤
2019/04/15 Javascript
基于vue-cli、elementUI的Vue超简单入门小例子(推荐)
2019/04/17 Javascript
对Layer弹窗使用及返回数据接收的实例详解
2019/09/26 Javascript
深入解析微信小程序开发中遇到的几个小问题
2020/07/11 Javascript
Vue自动构建发布脚本的方法示例
2020/07/24 Javascript
Python 正则表达式(转义问题)
2014/12/15 Python
用scikit-learn和pandas学习线性回归的方法
2019/06/21 Python
Jupyter notebook快速入门教程(推荐)
2020/05/18 Python
简述Html5 IphoneX 适配方法
2018/02/08 HTML / CSS
MANGO官方网站:西班牙芒果服装品牌
2017/01/15 全球购物
绘儿乐产品官方在线商店:Crayola.com
2019/09/07 全球购物
英国男女豪华配饰和礼品网站:Black.co.uk
2020/02/28 全球购物
乡镇干部先进性教育活动个人整改措施
2014/09/16 职场文书
2014年城管工作总结
2014/11/20 职场文书
2015年党支部公开承诺书
2015/01/22 职场文书
内乡县衙导游词
2015/02/05 职场文书
2015年大学生工作总结
2015/04/21 职场文书
MYSQL 表的全面总结
2021/11/11 MySQL
排查并解决Oracle sysaux表空间异常增长
2022/04/20 Oracle
Python OpenGL基本配置方式
2022/05/20 Python