深入理解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 相关文章推荐
Django1.7+python 2.78+pycharm配置mysql数据库教程
Nov 18 Python
Python利用Nagios增加微信报警通知的功能
Feb 18 Python
Python利用Beautiful Soup模块创建对象详解
Mar 27 Python
Python3实现带附件的定时发送邮件功能
Dec 22 Python
Python cookbook(字符串与文本)在字符串的开头或结尾处进行文本匹配操作
Apr 20 Python
基于数据归一化以及Python实现方式
Jul 11 Python
Python全排列操作实例分析
Jul 24 Python
python/sympy求解矩阵方程的方法
Nov 08 Python
python 中Arduino串口传输数据到电脑并保存至excel表格
Oct 14 Python
python异常处理和日志处理方式
Dec 24 Python
Python统计学一数据的概括性度量详解
Mar 03 Python
Python logging日志库空间不足问题解决
Sep 14 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
Sony CFR 320 修复改造
2020/03/14 无线电
测试php连接mysql是否成功的代码分享
2014/01/24 PHP
Thinkphp框架开发移动端接口(1)
2016/08/18 PHP
使用 laravel sms 构建短信验证码发送校验功能
2017/11/06 PHP
PHP回调函数简单用法示例
2019/05/08 PHP
location.href 在IE6中不跳转的解决方法与推荐使用代码
2010/07/08 Javascript
小试JQuery的AutoComplete插件
2011/05/04 Javascript
jQuery调用WebService的实现代码
2011/06/19 Javascript
js获取某月的最后一天日期的简单实例
2013/06/22 Javascript
Javascript四舍五入Math.round()与Math.pow()使用介绍
2013/12/27 Javascript
js判断设备是否为PC并调整图片大小
2014/02/12 Javascript
使用jQuery.wechat构建微信WEB应用
2014/10/09 Javascript
基于jquery和svg实现超炫酷的动画特效
2014/12/09 Javascript
JavaScript正则表达式中的ignoreCase属性使用详解
2015/06/16 Javascript
js简单实现表单中点击按钮动态增加输入框数量的方法
2015/08/18 Javascript
jquery实现未经美化的简洁TAB菜单效果
2015/08/28 Javascript
JavaScript中Textarea滚动条不能拖动的解决方法
2015/12/15 Javascript
JS文件上传神器bootstrap fileinput详解
2021/01/28 Javascript
js 数据存储和DOM编程
2017/02/09 Javascript
jQuery实现点击下拉框中的值累加到文本框中的方法示例
2017/10/28 jQuery
微信小程序实现笑脸评分功能
2018/11/03 Javascript
nuxt.js 在middleware(中间件)中实现路由鉴权操作
2020/11/06 Javascript
python字符串,数值计算
2016/10/05 Python
Python输出各行命令详解
2018/02/01 Python
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
2018/04/22 Python
利用Python如何批量更新服务器文件
2018/07/29 Python
Python动态参数/命名空间/函数嵌套/global和nonlocal
2019/05/29 Python
python三大神器之fabric使用教程
2019/06/10 Python
tensorflow2.0保存和恢复模型3种方法
2020/02/03 Python
Big Green Smile德国网上商店:提供各种天然产品
2018/05/23 全球购物
Linux Interview Questions For software testers
2012/06/02 面试题
模范班主任事迹材料
2014/12/17 职场文书
在职证明范本
2015/06/15 职场文书
2015国庆节感想
2015/08/04 职场文书
css3 实现文字闪烁效果的三种方式示例代码
2021/04/25 HTML / CSS
微软PC Health Check电脑健康状况检查应用下载(Win11配置检测工具)
2021/06/26 数码科技