生成器

什么是生成器:只要在函数体内出现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生成器,递归调用的更多相关文章

  1. python 解决递归调用栈溢出

    递归函数 2578次阅读 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact ...

  2. Python函数递归调用

    函数的递归调用: 是函数嵌套调用的一种特殊形式 具体是指: 在调用一个函数的过程中又直接或间接地调用到了本身 # 直接调用本身 def func(): print('我是func') func() f ...

  3. python生成器 递归

    生成器 生成器:只要函数体内出现yield关键字,那么再执行函数就不会执行函数代码,会得到一个结果,该结果就是生成器   生成器就是迭代器   yield的功能 1.yield为我们提供了一种自定义迭 ...

  4. python 3 递归调用与二分法

    递归调用与二分法 1.递归调用 递归调用:在调用一个函数的过程中,直接或间接地调用了函数本身. 示例: def age(n): if n == 1: return 18 # 结束条件 return a ...

  5. python中递归调用

    递归一个通俗的解释就是,在函数中调用函数本身:伪代码如下: In [31]: def fun(): ....: fun() # 这个递归没有任何作用,只是为了说明什么是递归 递归(Recursion) ...

  6. Python的递归

    递归 是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象.在计算机编程里,递归指的是一个过程:函数不断引用自身,直到引用的对象已知.使用递归解决问题,思路清晰,代码少.但是在主流高 ...

  7. python 生成器和递归

    生成器 1.定义 问题:python会把对象放到内存中,我们每次定义变量.列表等都会在内存中占用对应的地址块,所以当内存容量一定时,列表的容量会受到内存的限制,而且假如我们创建了一个包含200万个元素 ...

  8. python-学习笔记之-Day5 双层装饰器 字符串格式化 python模块 递归 生成器 迭代器 序列化

    1.双层装饰器 #!/usr/bin/env python # -*- coding: utf-8 -*- # author:zml LOGIN_INFO = False IS_ADMIN = Fal ...

  9. Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数

    Python第七天   函数  函数参数   函数里的变量   函数返回值  多类型传值     函数递归调用   匿名函数   内置函数 目录 Pycharm使用技巧(转载) Python第一天   ...

随机推荐

  1. [luogu3952 noip2017] 逛公园 (计数dp+最短路)

    传送门 Description Input Output 输出文件包含 T 行,每行一个整数代表答案. Sample Input 2 5 7 2 10 1 2 1 2 4 0 4 5 2 2 3 2 ...

  2. P3369 【模板】普通平衡树 (splay 模板)

    题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询x数的排名(排名定义为比当前数小的数的个数+1.若有多 ...

  3. Linux 获取帮助

    Linux中获取帮助的方法  方法:    COMMAND --help 或者 help COMMAND    whatis    man或info    本地帮助文档 /usr/share/doc/ ...

  4. Problem 7

    Problem 7 # Problem_7.py """ By listing the first six prime numbers: 2, 3, 5, 7, 11, ...

  5. HDU 4268 Alice and Bob(贪心+Multiset的应用)

     题意: Alice和Bob有n个长方形,有长度和宽度,一个矩形能够覆盖还有一个矩形的条件的是,本身长度大于等于还有一个矩形,且宽度大于等于还有一个矩形.矩形不可旋转.问你Alice最多能覆盖Bo ...

  6. hdoj 5092 Seam Carving 【树塔DP变形 + 路径输出】 【简单题】

    Seam Carving Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Tot ...

  7. wpf获取目录路径

    AppDomain.CurrentDomain.BaseDirectory +文件名即可,简单吧? //获取启动了应用程序的可执行文件的路径,不包括可执行文件的名称. string str5=Appl ...

  8. 使用dbms_metadata.get_ddl遇到ORA-31603

    建了一个外部表,想看看这个表的信息,一查就报错了: SQL> select dbms_metadata.get_ddl('TABLE','ext_case1') from dual; ERROR ...

  9. Spring Boot + Bootstrap + jQuery + Freemarker

    Spring Boot + Bootstrap + jQuery + Freemarker 原文地址:http://qilu.me/post/tech/2018-03-18 最近在写一些Web的东西, ...

  10. 【POJ 2828】Buy Tickets

    [题目链接] http://poj.org/problem?id=2828 [算法] 离线用线段树维护序列即可 [代码] #include <algorithm> #include < ...