深入理解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中numpy数组的合并实例讲解
Apr 04 Python
Python使用Phantomjs截屏网页的方法
May 17 Python
利用Anaconda简单安装scrapy框架的方法
Jun 13 Python
Django 通过JS实现ajax过程详解
Jul 30 Python
解决Mac下使用python的坑
Aug 13 Python
python调用支付宝支付接口流程
Aug 15 Python
如何安装2019Pycharm最新版本(详细教程)
Sep 26 Python
Python自动化完成tb喵币任务的操作方法
Oct 30 Python
python+Selenium自动化测试——输入,点击操作
Mar 06 Python
查看已安装tensorflow版本的方法示例
Apr 19 Python
pandas的resample重采样的使用
Apr 24 Python
python如何控制进程或者线程的个数
Oct 16 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
CodeIgniter自定义控制器MY_Controller用法分析
2016/01/20 PHP
增强的 JavaScript 的 trim 函数的代码
2007/08/13 Javascript
自动完成JS类(纯JS, Ajax模式)
2009/03/12 Javascript
js 实现复制到粘贴板的功能代码
2010/05/13 Javascript
javascript删除数组元素并且数组长度减小的简单实例
2014/02/14 Javascript
javascript中兼容主流浏览器的动态生成iframe方法
2014/05/05 Javascript
jquery列表拖动排列(由项目提取相当好用)
2014/06/17 Javascript
原生javascript实现的分页插件pagenav
2014/08/28 Javascript
Javascript学习指南
2014/12/01 Javascript
JavaScript 事件入门知识
2015/04/13 Javascript
JavaScript的jQuery库中ready方法的学习教程
2015/08/14 Javascript
JS实现超简洁网页title标题跑动闪烁提示效果代码
2015/10/23 Javascript
js判断当前页面在移动设备还是在PC端中打开
2016/01/06 Javascript
JQuery学习总结【二】
2016/12/01 Javascript
jQuery图片切换动画效果
2017/02/28 Javascript
Bootstrap table使用方法总结
2017/05/10 Javascript
解决vue 中 echart 在子组件中只显示一次的问题
2018/08/07 Javascript
koa router 多文件引入的方法示例
2019/05/22 Javascript
vue-property-decorator用法详解
2019/12/12 Javascript
在Vue中创建可重用的 Transition的方法
2020/06/02 Javascript
python为tornado添加recaptcha验证码功能
2014/02/26 Python
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
2016/05/27 Python
python实现协同过滤推荐算法完整代码示例
2017/12/15 Python
在python中实现将一张图片剪切成四份的方法
2018/12/05 Python
学习和使用python的13个理由
2019/07/30 Python
python中的&amp;&amp;及||的实现示例
2019/08/07 Python
使用Python爬虫库requests发送请求、传递URL参数、定制headers
2020/01/25 Python
澳大利亚巧克力花束和礼品网站:Tastebuds
2019/03/15 全球购物
波兰家居和花园家具专家:4Home
2019/05/26 全球购物
拉丁舞学习者的自我评价
2013/10/27 职场文书
国际贸易毕业生求职信范文
2014/02/21 职场文书
爱国主义教育活动总结
2014/05/07 职场文书
个人对照检查材料思想汇报(四风问题)
2014/09/25 职场文书
离开雷锋的日子观后感
2015/06/09 职场文书
Js类的构建与继承案例详解
2021/09/15 Javascript
使用pipenv管理python虚拟环境的全过程
2021/09/25 Python