生成器

什么是生成器:只要在函数体内出现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. Mysql 忘记数据库密码

    windows下忘记MySQL密码的修改方法 1.关闭正在运行的Mysql服务: A.命令下运行   net stop mysql B.找到mysql服务停止mysql的服务 C.在任务管理器中结束M ...

  2. CF55C. Pie or die

    /* CF55C. Pie or die http://codeforces.com/problemset/problem/55/C 博弈论 乱搞 获胜条件是存在一个棋子到边界的值小于5 */ #in ...

  3. hdu 1385 floyd记录路径

    可以用floyd 直接记录相应路径 太棒了! http://blog.csdn.net/ice_crazy/article/details/7785111 #include"stdio.h& ...

  4. rails create方法ActiveModel::ForbiddenAttribute的问题

    rails create方法ActiveModel::ForbiddenAttribute的问题 def create @ad = Ad.new(ad_params) @ad.save end pri ...

  5. C++ 嵌入汇编程序提高计算效率

    因为汇编语言比C++更接近硬件底层,所以在性能要求高的程序中往往能够採取在C++代码中嵌入汇编的方式来给程序提速. 在VC中能够简单的通过 __asm { //在这里加入汇编代码 } 来实现. 以下通 ...

  6. cocos2dx项目创建

    射击类游戏文档 作者:浙江传媒学院  新媒体  张勇 1>编译环境 首先我们先去cocos2dx官网上下载cocos2dx最新版本号 http://www.cocos2d-x.org/ 我下载的 ...

  7. linux:共享内存

    #include <sys/ipc.h> #include <sys/shm.h> #include <string.h> #include <stdio.h ...

  8. 数据结构(Java语言)——LinkedList简单实现

    下面是一个能够使用的LinkedList泛型类的实现.这里的链表类名为MyLinkedList,避免与类库中反复. MyLinkedList将作为双链表实现,并且保留到该表两端的引用.这样仅仅要操作发 ...

  9. (LeetCode)二叉树中和为某一值的路径

    原体例如以下: Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that addin ...

  10. 【MySQL】MySQL删除匿名用户,保证登录安全

    博客地址已迁往 www.virtclouds.com 原文地址 http://www.virtclouds.com/538.html 很多MySQL程序都会带有匿名登录的功能. 在刚刚安装完MySQL ...