深入理解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 相关文章推荐
py中的目录与文件判别代码
Jul 16 Python
Python实现针对含中文字符串的截取功能示例
Sep 22 Python
Python抓取聚划算商品分析页面获取商品信息并以XML格式保存到本地
Feb 23 Python
python 2.7.13 安装配置方法图文教程
Sep 18 Python
python  文件的基本操作 菜中菜功能的实例代码
Jul 17 Python
python PyAutoGUI 模拟鼠标键盘操作和截屏功能
Aug 04 Python
自定义Django默认的sitemap站点地图样式
Mar 04 Python
Python xml、字典、json、类四种数据类型如何实现互相转换
May 27 Python
Python利用命名空间解析XML文档
Aug 10 Python
Python常用模块函数代码汇总解析
Aug 31 Python
解决python便携版无法直接运行py文件的问题
Sep 01 Python
详解Python生成器和基于生成器的协程
Jun 03 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:风雨欲来 路在何方?
2006/10/09 PHP
PHP操作文件方法问答
2007/03/16 PHP
ThinkPHP基本的增删查改操作实例教程
2014/08/22 PHP
PHP响应post请求上传文件的方法
2015/12/17 PHP
PHP版本的选择5.2.17 5.3.27 5.3.28 5.4 5.5兼容性问题分析
2016/04/04 PHP
php判断str字符串是否是xml格式数据的方法示例
2017/07/26 PHP
php表单处理操作
2017/11/16 PHP
Thinkphp集成抖音SDK的实现方法
2020/04/28 PHP
有道JavaScript监听浏览器的问题
2010/06/23 Javascript
轻松创建nodejs服务器(3):代码模块化
2014/12/18 NodeJs
详解JavaScript的Date对象(制作简易钟表)
2020/04/07 Javascript
理解javascript中的严格模式
2016/02/01 Javascript
JavaScript学习笔记整理_关于表达式和语句
2016/09/19 Javascript
jQuery动态生成不规则表格(前后端)
2017/02/21 Javascript
Vue.js实现按钮的动态绑定效果及实现代码
2017/08/21 Javascript
微信小程序实现的贪吃蛇游戏【附源码下载】
2018/01/03 Javascript
Javascript将图片的绝对路径转换为base64编码的方法
2018/01/11 Javascript
JS实现简单的星期格式转换功能示例
2018/07/23 Javascript
JavaScript创建对象方法实例小结
2018/09/03 Javascript
vue+echarts实现动态折线图的方法与注意
2020/09/01 Javascript
vuejs实现下拉框菜单选择
2020/10/23 Javascript
python使用电子邮件模块smtplib的方法
2016/08/28 Python
Python生成验证码、计算具体日期是一年中的第几天实例代码详解
2019/10/16 Python
Django高并发负载均衡实现原理详解
2020/04/04 Python
使用ITK-SNAP进行抠图操作并保存mask的实例
2020/07/01 Python
TripAdvisor瑞典:全球领先的旅游网站
2017/12/11 全球购物
Zadig&Voltaire官网:法国时装品牌
2018/01/05 全球购物
《望洞庭》教学反思
2014/02/16 职场文书
大学生档案自我鉴定(2篇)
2014/10/14 职场文书
2014年政协委员工作总结
2014/12/01 职场文书
瘦西湖导游词
2015/02/03 职场文书
教师工作能力自我评价
2015/03/04 职场文书
2015年酒店客房部工作总结
2015/04/25 职场文书
少先队工作总结2015
2015/05/13 职场文书
第一军规观后感
2015/06/12 职场文书
2016幼儿园新学期寄语
2015/12/03 职场文书