python生成器,递归调用
生成器
什么是生成器:只要在函数体内出现yield关键字,那么再执行函数就不会执行函数代码,会得到一个结果,该结果就是生成器
生成器就是迭代器
yield的功能
yield为我们提供了一种自定义迭代器对象的方法
yield与return的区别:
1.yield可以返回多个值
2.函数暂停和再继续是由yield帮我们保存的
只要看见函数里出现yield,那么就是生成器
例1:上面我们说到,看见函数里有yield,那么就是生成器,生成器又是迭代器,
那么提到迭代器就要想到xx.__next__()取值方式
def test():
print('=====>1')
yield 1
print('=====>2')
yield 2
print('=====>3')
yield 3
g = test() #就相当于一个容器
print(g.__next__())
print(g.__next__())
print(next(g))
运行结果:
我们知道这种方式取值之后,就会想到相同原理的另一个简单方式就是for循环
def test():
print('=====>1')
yield 1
print('=====>2')
yield 2
print('=====>3')
yield 3
g = test()
for i in g:
print(i)
运行结果:
例2:将test1的结果被test2调用,这是就需要用yield自定义一个生成器
def test1():
for i in range(10):
yield i #把0~9变成生成器返回给函数test1
g = test1() #g是个生成器
def test2(g):
for i in g:
print(i)
test2(g)
运行结果:
例3:日志报错监控器
import time
def tail(filepath): #定义一个查看文件的函数
with open(filepath, 'rb') as f: #打开形参为filepath rb是二进制读
f.seek(0,2) #把光标移动到末尾
while True: #循环监控日志
data = f.readline() #读取文件末尾
if data: #加入有数据就用yield返回
yield data
else:# 否则就睡眠0.05秒
time.sleep(0.05)
def grep(file, k): #定义过滤关键字函数
for i in tail(file): #循环生成器中的数据
if k in i.decode('utf-8'): #因为是用二进制读取方式,所以需要解码显示
print(i.decode('utf-8'))
grep('a.txt', '') #监控a.txt最新日志,并过滤500的错误代码
一旦有500出现就会被抓拍到
yield的另一用法,赋值
def test(name):
while True:
foot = yield
print('%s正在吃%s' % (name, foot)) e = test('轩轩') #e是生成器
next(e) #初始化,e.__next__()
# e.send(None) #初始化,与上一行二选一
e.send('饺子') #发送值传给foot
e.send('冰激凌') #发送值传给foot
运行结果:
递归调用
递归调用:在调用一个函数的过程中,直接或者间接又调用了函数本身,称之为递归调用
递归必备的2个阶段:1递推,2回溯
例:甲乙丙丁戊,5人吃包子,我们想知道甲吃了几个包子,但甲说比乙多吃2个,乙说比丙多吃2个,丙说比丁多吃2个,丁说比戊多吃2个,戊说他没吃,
那么因为知道戊没吃,所以根据甲乙丙丁的答案,我们可知甲吃了8个,这样一来一回的过程就是递推和回溯
age(甲) = age(乙) + 2
age(乙) = age(丙) + 2
age(丙) = age(丁) + 2
age(丁) = age(戊) + 2
age(戊) = 0
def num(n):
if n == 1:
return 0
return num(n-1) + 2
res = num(5)
print(res)
运行结果:
python生成器,递归调用的更多相关文章
- python 解决递归调用栈溢出
递归函数 2578次阅读 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact ...
- Python函数递归调用
函数的递归调用: 是函数嵌套调用的一种特殊形式 具体是指: 在调用一个函数的过程中又直接或间接地调用到了本身 # 直接调用本身 def func(): print('我是func') func() f ...
- python生成器 递归
生成器 生成器:只要函数体内出现yield关键字,那么再执行函数就不会执行函数代码,会得到一个结果,该结果就是生成器 生成器就是迭代器 yield的功能 1.yield为我们提供了一种自定义迭 ...
- python 3 递归调用与二分法
递归调用与二分法 1.递归调用 递归调用:在调用一个函数的过程中,直接或间接地调用了函数本身. 示例: def age(n): if n == 1: return 18 # 结束条件 return a ...
- python中递归调用
递归一个通俗的解释就是,在函数中调用函数本身:伪代码如下: In [31]: def fun(): ....: fun() # 这个递归没有任何作用,只是为了说明什么是递归 递归(Recursion) ...
- Python的递归
递归 是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象.在计算机编程里,递归指的是一个过程:函数不断引用自身,直到引用的对象已知.使用递归解决问题,思路清晰,代码少.但是在主流高 ...
- python 生成器和递归
生成器 1.定义 问题:python会把对象放到内存中,我们每次定义变量.列表等都会在内存中占用对应的地址块,所以当内存容量一定时,列表的容量会受到内存的限制,而且假如我们创建了一个包含200万个元素 ...
- python-学习笔记之-Day5 双层装饰器 字符串格式化 python模块 递归 生成器 迭代器 序列化
1.双层装饰器 #!/usr/bin/env python # -*- coding: utf-8 -*- # author:zml LOGIN_INFO = False IS_ADMIN = Fal ...
- Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数
Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数 目录 Pycharm使用技巧(转载) Python第一天 ...
随机推荐
- HDU-6217 BBP Formula 脑洞
题目链接:https://cn.vjudge.net/problem/HDU-6217 题意 已知: \[ \pi = \sum_{k=0}^{\infty }\frac{1}{16^{k}}(\fr ...
- redis 五大数据类型
一.String set : 添加数据 get : 获得指定 key 的 value del : 删除指定 key append : 往字符串后面添加 append k1 12345 ...
- C和C++ const的声明差异
当在C源代码文件中将变量声明为const时,可以通过以下方式实现: const int i = 2; 然后,可以在另一个模块中使用此变量,如下表示: extern const int i; 但若要获取 ...
- rabbitMQ学习笔记(四) 发布/订阅消息
前面都是一条消息只会被一个消费者处理. 如果要每个消费者都处理同一个消息,rabbitMq也提供了相应的方法. 在以前的程序中,不管是生产者端还是消费者端都必须知道一个指定的QueueName才能发送 ...
- bzoj 1266 1266: [AHOI2006]上学路线route
1266: [AHOI2006]上学路线route Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 2356 Solved: 841[Submit][S ...
- 人人都能当大厨的语音做菜神器——demo试用
开发一款语音做菜软件的想法在我脑海里闪烁了非常久,一直苦于没有时间.趁着这几天老板的项目接近了尾声,我也有时间把我当初的想法付诸于实践. 可能有朋友对我的想法还不甚了解,我这里简介一下,具体的介绍就请 ...
- XCODE插件 之 Code Pilot 无鼠标化
什么是Code Pilot? Code Pilot 是一个 Xcode 5 插件.同意你不许使用鼠标就能高速地查找项目内的文件.方法和标识符. 它使用模糊查询匹配(fuzzy query matchi ...
- jsp 传值jsp 数据库 乱码解决的攻略 全套
jsp传值给jsp中文乱码 传值给数据库乱码的解决方法 所有的用到编码的所有统一utf-8 1.装mysql的时候有选择编码的界面的那个地方选utf-8编码 2 建数据库的时候选择 字符集 排序规则所 ...
- 软件測试、ios中的測试概念以及步骤
软件測试: 软件測试的目标是应该服务于软件项目的目标,能够通过建议反馈使用更加高效的方法和工具,提升软件开发效率以及软件开发质量.同一时候还能够通过过一些手段,更早.更快.很多其它地发现缺陷.从容减少 ...
- android创建桌面快捷键shortcut
有非常多人也写过创建桌面快捷键的blog.可是大部分都仅仅讲了怎么用,事实上技术使用起来都非常easy.可是你使用后下次还知道吗? 根本原因还是不清楚原理.今天我就来讲讲shortcut创建过程. 过 ...