深入理解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实现获取网站PR及百度权重
Jan 21 Python
Python随机生成一个6位的验证码代码分享
Mar 24 Python
python字典多键值及重复键值的使用方法(详解)
Oct 31 Python
python抽取指定url页面的title方法
May 11 Python
Python 使用PyQt5 完成选择文件或目录的对话框方法
Jun 27 Python
python opencv对图像进行旋转且不裁剪图片的实现方法
Jul 09 Python
python word转pdf代码实例
Aug 16 Python
python-sys.stdout作为默认函数参数的实现
Feb 21 Python
Python中使用socks5设置全局代理的方法示例
Apr 15 Python
解决python中显示图片的plt.imshow plt.show()内存泄漏问题
Apr 24 Python
Python实现加密接口测试方法步骤详解
Jun 05 Python
python实现sm2和sm4国密(国家商用密码)算法的示例
Sep 26 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中将数组存到文件里的实现代码
2012/01/19 PHP
php数字运算验证码的实现代码
2015/07/30 PHP
laravel开发环境homestead搭建过程详解
2020/07/03 PHP
js实现ASP分页函数 HTML分页函数
2006/09/22 Javascript
formvalidator验证插件中有关ajax验证问题
2013/01/04 Javascript
js css后面所带参数含义介绍
2013/08/18 Javascript
Extjs4中Form的使用之本地hiddenfield
2013/11/26 Javascript
JavaScript中定时控制Throttle、Debounce和Immediate详解
2016/11/17 Javascript
JavaScript 中的 this 简单规则
2017/09/19 Javascript
使用html+js+css 实现页面轮播图效果(实例讲解)
2017/09/21 Javascript
Vue实现底部侧边工具栏的实例代码
2018/09/03 Javascript
Vue.js组件高级特性实例详解
2018/12/24 Javascript
10行代码实现微信小程序滑动tab切换
2018/12/28 Javascript
Nodejs中的require函数的具体使用方法
2019/04/02 NodeJs
js实现点赞按钮功能的实例代码
2020/03/06 Javascript
JS脚本实现定时到网站上签到/签退功能
2020/04/22 Javascript
JS倒计时两种实现方式代码实例
2020/07/27 Javascript
在vscode 中设置 vue模板内容的方法
2020/09/02 Javascript
python使用pil进行图像处理(等比例压缩、裁剪)实例代码
2017/12/11 Python
对Python生成汉字字库文字,以及转换为文字图片的实例详解
2019/01/29 Python
Python数据报表之Excel操作模块用法分析
2019/03/11 Python
由Python编写的MySQL管理工具代码实例
2019/04/09 Python
Python面向对象程序设计类的封装与继承用法示例
2019/04/12 Python
浅谈Python中函数的定义及其调用方法
2019/07/19 Python
图解Python中深浅copy(通俗易懂)
2020/09/03 Python
selenium如何定位span元素的实现
2021/01/13 Python
python UIAutomator2使用超详细教程
2021/02/19 Python
Python绘制词云图之可视化神器pyecharts的方法
2021/02/23 Python
德国拖鞋网站:German Slippers
2019/11/08 全球购物
斯洛伐克最大的婴儿食品和用品网上商店:Feedo.sk
2020/12/21 全球购物
CSMA/CD介质访问控制协议
2015/11/17 面试题
大四学生思想汇报
2014/01/13 职场文书
劳动实践课感言
2014/02/01 职场文书
模范教师事迹材料
2014/02/10 职场文书
旷课检讨书范文
2014/10/30 职场文书
鲁迅故居导游词
2015/02/05 职场文书