深入理解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使用筛选法计算小于给定数字的所有素数
Mar 19 Python
TensorFlow实现非线性支持向量机的实现方法
Apr 28 Python
python-str,list,set间的转换实例
Jun 27 Python
python代码过长的换行方法
Jul 19 Python
Pandas之排序函数sort_values()的实现
Jul 09 Python
基于python实现的百度新歌榜、热歌榜下载器(附代码)
Aug 05 Python
Django使用Jinja2模板引擎的示例代码
Aug 09 Python
详解PyTorch手写数字识别(MNIST数据集)
Aug 16 Python
Tensorflow实现部分参数梯度更新操作
Jan 23 Python
Python实现网络聊天室的示例代码(支持多人聊天与私聊)
Jan 27 Python
Python使用pyecharts控件绘制图表
Jun 05 Python
Django数据库(SQlite)基本入门使用教程
Jul 07 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将字符串随机分割成不同长度数组的方法
2015/06/01 PHP
php设计模式之工厂模式用法经典实例分析
2019/09/20 PHP
在视频前插入广告
2006/11/20 Javascript
Extjs4.0设置Ext.data.Store传参的请求方式(默认为GET)
2013/04/02 Javascript
JS中setInterval、setTimeout不能传递带参数的函数的解决方案
2013/04/28 Javascript
几种延迟加载JS代码的方法加快网页的访问速度
2013/10/12 Javascript
javascript获取选中的文本的方法代码
2013/10/30 Javascript
javascript中indexOf技术详解
2015/05/07 Javascript
Ionic默认的Tabs模板使用实例
2016/08/29 Javascript
JS实现超简单的汉字转拼音功能示例
2016/12/22 Javascript
angular学习之从零搭建一个angular4.0项目
2017/07/10 Javascript
mui 打开新窗口的方式总结及注意事项
2017/08/20 Javascript
Nodejs调用WebService的示例代码
2017/09/29 NodeJs
利用js实现前后台传送Json的示例代码
2018/03/29 Javascript
深入了解Hybrid App技术的相关知识
2019/07/17 Javascript
vue实现登录拦截
2020/06/29 Javascript
vue结合el-upload实现腾讯云视频上传功能
2020/07/01 Javascript
Jquery cookie插件实现原理代码解析
2020/08/04 jQuery
python实现DES加密解密方法实例详解
2015/06/30 Python
python3 拼接字符串的7种方法
2018/09/12 Python
python对日志进行处理的实例代码
2018/10/06 Python
python+opencv实现霍夫变换检测直线
2020/10/23 Python
解决python super()调用多重继承函数的问题
2019/06/26 Python
Python函数中参数是传递值还是引用详解
2019/07/02 Python
Python实现线性插值和三次样条插值的示例代码
2019/11/13 Python
利用python画出AUC曲线的实例
2020/02/28 Python
利用Python实现Json序列化库的方法步骤
2020/09/09 Python
5分钟快速掌握Python定时任务框架的实现
2021/01/26 Python
aec加密 php_php aes加密解密类(兼容php5、php7)
2021/03/14 PHP
加热夹克:RAVEAN
2018/10/19 全球购物
英语专业大学生求职简历的自我评价
2013/10/18 职场文书
食品安全工作方案
2014/05/07 职场文书
十佳中学生事迹材料
2014/06/02 职场文书
安全在我心中演讲稿
2014/09/01 职场文书
某集团股份有限公司委托书样本
2014/09/24 职场文书
欠条样本
2015/07/03 职场文书