深入理解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下的twisted框架入门指引
Apr 15 Python
Python执行时间的计算方法小结
Mar 17 Python
Python实现字符串逆序输出功能示例
Jun 24 Python
Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
Nov 23 Python
Python实现获取汉字偏旁部首的方法示例【测试可用】
Dec 18 Python
python 实现将txt文件多行合并为一行并将中间的空格去掉方法
Dec 20 Python
python+ffmpeg批量去视频开头的方法
Jan 09 Python
pyqt5 实现 下拉菜单 + 打开文件的示例代码
Jun 20 Python
解决python super()调用多重继承函数的问题
Jun 26 Python
python数据持久存储 pickle模块的基本使用方法解析
Aug 30 Python
如何解决安装python3.6.1失败
Jul 01 Python
Python爬虫教程知识点总结
Oct 19 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
mysql5写入和读出乱码解决
2006/11/25 PHP
使用PHP 5.0创建图形的巧妙方法
2010/10/12 PHP
php实现Mysql简易操作类
2015/10/11 PHP
PHP超低内存遍历目录文件和读取超大文件的方法
2019/05/01 PHP
laravel 错误处理,接口错误返回json代码
2019/10/25 PHP
php使用redis的有序集合zset实现延迟队列应用示例
2020/02/20 PHP
Javascript中的Split使用方法与技巧
2007/03/09 Javascript
JQuery Ajax通过Handler访问外部XML数据的代码
2010/06/01 Javascript
js获得参数的getParameter使用示例
2014/02/26 Javascript
基于jQuery的JavaScript模版引擎JsRender使用指南
2014/12/29 Javascript
javascript中for/in循环及使用技巧
2015/09/01 Javascript
window.location.hash知识汇总
2015/11/09 Javascript
node.js 动态执行脚本
2016/06/02 Javascript
JQuery组件基于Bootstrap的DropDownList(完整版)
2016/07/05 Javascript
Google 地图类型详解及示例代码
2016/08/06 Javascript
jQuery获取select选中的option的value值实现方法
2016/08/29 Javascript
玩转NODE.JS(四)-搭建简单的聊天室的代码
2016/11/11 Javascript
js实现水平滚动菜单导航
2017/07/21 Javascript
微信小程序使用form表单获取输入框数据的实例代码
2018/05/17 Javascript
JS寄快递地址智能解析的实现代码
2020/07/16 Javascript
ant design的table组件实现全选功能以及自定义分页
2020/11/17 Javascript
浅谈Python2获取中文文件名的编码问题
2018/01/09 Python
对django后台admin下拉框进行过滤的实例
2019/07/26 Python
Python 网络编程之TCP客户端/服务端功能示例【基于socket套接字】
2019/10/12 Python
pytorch 实现模型不同层设置不同的学习率方式
2020/01/06 Python
Python如何实现定时器功能
2020/05/28 Python
python实现简单贪吃蛇游戏
2020/09/29 Python
在pycharm中使用pipenv创建虚拟环境和安装django的详细教程
2020/11/30 Python
北京SQL新华信咨询
2016/09/30 面试题
酒店服务与管理毕业生求职信
2013/11/02 职场文书
商务日语毕业生自荐信
2013/11/23 职场文书
微博营销计划书
2014/01/10 职场文书
十佳教师事迹材料
2014/01/11 职场文书
消防战士优秀事迹材料
2014/02/13 职场文书
施工协议书范本
2014/04/22 职场文书
培训科主任岗位职责
2014/08/08 职场文书