深入理解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中用于求最小值的min()方法
May 15 Python
详解Django中的权限和组以及消息
Jul 23 Python
在python中使用requests 模拟浏览器发送请求数据的方法
Dec 26 Python
python+selenium实现QQ邮箱自动发送功能
Jan 23 Python
Python列表与元组的异同详解
Jul 02 Python
python应用文件读取与登录注册功能
Sep 23 Python
python中p-value的实现方式
Dec 16 Python
python+opencv3生成一个自定义纯色图教程
Feb 19 Python
Keras loss函数剖析
Jul 06 Python
Python如何发送与接收大型数组
Aug 07 Python
关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题
Nov 24 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
如何在HTML 中嵌入 PHP 代码
2015/05/13 PHP
功能强大的php文件上传类
2016/08/29 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
PHP中number_format()函数的用法讲解
2019/04/08 PHP
模仿jQuery each函数的链式调用
2009/07/22 Javascript
表单提交前触发函数返回true表单才会提交
2014/03/11 Javascript
禁止iframe脚本弹出的窗口覆盖了父窗口的方法
2014/09/06 Javascript
微信小程序-小说阅读小程序实例(demo)
2017/01/12 Javascript
详解使用React进行组件库开发
2018/02/06 Javascript
mongodb初始化并使用node.js实现mongodb操作封装方法
2019/04/02 Javascript
用Vue.js方法创建模板并使用多个模板合成
2019/06/28 Javascript
vue-cli2与vue-cli3在一台电脑共存的实现方法
2019/09/25 Javascript
Python写的一个简单DNS服务器实例
2014/06/04 Python
Python装饰器的函数式编程详解
2015/02/27 Python
python实现的系统实用log类实例
2015/06/30 Python
Python封装原理与实现方法详解
2018/08/28 Python
Python使用googletrans报错的解决方法
2018/09/25 Python
对pandas数据判断是否为NaN值的方法详解
2018/11/06 Python
python进行TCP端口扫描的实现
2018/12/21 Python
对python中大文件的导入与导出方法详解
2018/12/28 Python
Pandas数据离散化原理及实例解析
2019/11/16 Python
谷歌浏览器小字体处理方案即12px以下字体
2013/12/17 HTML / CSS
HTML5超文本标记语言的实现方法
2020/09/24 HTML / CSS
英国奢华护肤、美容和Spa品牌:Temple Spa
2019/11/02 全球购物
T3官网:头发造型工具
2019/12/26 全球购物
得到Class的三个过程是什么
2012/08/10 面试题
毕业学生推荐信
2013/12/01 职场文书
学雷锋志愿者活动方案
2014/08/21 职场文书
销售活动策划方案
2014/08/26 职场文书
自动化专业大学生职业生涯规划范文:爱拚才会赢
2014/09/12 职场文书
财务务虚会发言材料
2014/10/20 职场文书
医院见习报告范文
2014/11/03 职场文书
2015年留守儿童工作总结
2015/05/22 职场文书
会计主管竞聘书
2015/09/15 职场文书
2017元旦晚会开幕词
2016/03/03 职场文书
Java使用jmeter进行压力测试
2021/07/09 Java/Android