深入理解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中使用PIL模块处理图像的教程
Apr 29 Python
在Python的Django框架中调用方法和处理无效变量
Jul 15 Python
Python中异常重试的解决方案详解
May 05 Python
Python 调用Java实例详解
Jun 02 Python
在unittest中使用 logging 模块记录测试数据的方法
Nov 30 Python
python 实现语音聊天机器人的示例代码
Dec 02 Python
python按照多个条件排序的方法
Feb 08 Python
利用pytorch实现对CIFAR-10数据集的分类
Jan 14 Python
基于tensorflow指定GPU运行及GPU资源分配的几种方式小结
Feb 03 Python
Python利用逻辑回归分类实现模板
Feb 15 Python
JupyterNotebook 输出窗口的显示效果调整方法
Apr 13 Python
Python中使用ipython的详细教程
Jun 22 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
星际争霸任务指南——神族
2020/03/04 星际争霸
php在程序中将网页生成word文档并提供下载的代码
2012/10/09 PHP
php配置php-fpm启动参数及配置详解
2013/11/04 PHP
PHP序列化的四种实现方法与横向对比
2018/11/29 PHP
PHP连接SQL server数据库测试脚本运行实例
2020/08/24 PHP
用JavaScript隐藏控件的方法
2009/09/21 Javascript
使用jQuery简化Ajax开发 Ajax开发入门
2009/10/14 Javascript
jquery插件开发方法(初学者)
2012/02/03 Javascript
JS获取鼠标坐标的实例方法
2013/07/18 Javascript
Node.js中的事件驱动编程详解
2014/08/16 Javascript
js clearInterval()方法的定义和用法
2015/11/11 Javascript
理解javascript封装
2016/02/23 Javascript
js 获取当前web应用的上下文路径实现方法
2016/08/19 Javascript
微信小程序 Tab页切换更新数据
2017/01/05 Javascript
JS中cookie的使用及缺点讲解
2017/05/13 Javascript
深究AngularJS中$sce的使用
2017/06/12 Javascript
es6新特性之 class 基本用法解析
2018/05/05 Javascript
element vue Array数组和Map对象的添加与删除操作
2018/11/14 Javascript
JS实现音乐钢琴特效
2020/01/06 Javascript
[01:50]WODOTA制作 DOTA2中文宣传片《HERO》
2013/04/28 DOTA
在Gnumeric下使用Python脚本操作表格的教程
2015/04/14 Python
python3+opencv3识别图片中的物体并截取的方法
2018/12/05 Python
解决IDEA 的 plugins 搜不到任何的插件问题
2020/05/04 Python
CSS中垂直居中的简单实现方法
2015/07/06 HTML / CSS
HTML5 canvas基本绘图之绘制线条
2016/06/27 HTML / CSS
Silk’n激光脱毛器官网:silkn.com
2016/10/06 全球购物
美国全球旅游运营商:Pacific Holidays
2018/06/18 全球购物
日本即尚网:JSHOPPERS.com(支持中文)
2019/12/03 全球购物
简历中自我评价分享
2013/10/09 职场文书
素质拓展感言
2014/01/29 职场文书
心理学专业大学生职业生涯规划范文
2014/02/19 职场文书
《雪儿》教学反思
2014/04/17 职场文书
毕业生找工作求职信
2014/08/05 职场文书
活动经费申请报告
2015/05/15 职场文书
2015年小学校长工作总结
2015/05/19 职场文书
MySQL命令无法输入中文问题的解决方式
2021/08/30 MySQL