【Python】生成器
生成器是一种特殊的迭代器
# 斐波那契数列 10
def create_num(all_num):
a, b = 0, 1
current_num = 0
while current_num < all_num:
# print(a)
yield a # 如果一个函数中有yield语句,那么这个就不在是函数,而是一个生成器的模板
a, b = b, a+b
current_num += 1
# 调用的时候,发现有yield,不是调用函数,是创建一个生成器对象
obj = create_num(10)
for i in obj:
print(i)
# send
def create_num(all_num):
a, b = 0, 1
current_num = 0
while current_num < all_num:
ret = yield a
print(">>>ret>>>", ret)
a, b = b, b+a
current_num ++ 1
obj = create_num(10)
# obj.send(None) # send一般不会放到第一次启动生成器,如果非要这样做 那么传递None
ret = next(obj)
print(ret)
# send里面的数据会 传递给第5行,当作yield a 的结果,然后ret保存这个结果...
# send的结果是下一次调用yield时,yield后面的值
ret = obj.send("haha")
print(ret)
yield 实现多任务, 协程
# 协程,调用任务就像调用函数一样,使用资源最少(进程 > 线程 > 协程)
import time
def task_1():
while True:
print("---1---")
time.sleep(0.1)
yield
def task_2():
while True:
print("---2---")
time.sleep(0.1)
yield
def main():
t1 = task_1()
t2 = task_2()
while True:
next(t1)
next(t2)
if __name__ == '__main__':
main()
## greenlet
# 安装
pip install greenlet
from greenlet import greenlet
import time
def test1():
while True:
print("---a---")
gr2.switch()
time.sleep(0.5)
def test2():
while True:
print("bbbb")
gr1.switch()
time.sleep(0.5)
gr1 = greenlet(test1)
gr2 = greenlet(test2)
gr1.switch()
gevent的使用
# pip install gevent
import gevent
import time
# 遇到耗时等待,自动切换任务
from gevent import monkey
monkey.patch_all() # 耗时操作不用修改,可以使用 time.sleep 完成耗时,而非 gevent.sleep
def f1(n):
for i in range(n):
print(gevent.getcurrent(), i)
time.sleep(0.5)
# gevent.sleep(0.5)
def f2(n):
for i in range(n):
print(gevent.getcurrent(), i)
gevent.sleep(0.5) # gevent 的耗时操作
def f3(n):
for i in range(n):
print(gevent.getcurrent(), i)
gevent.sleep(0.5)
# g1 = gevent.spawn(f1, 5)
# g2 = gevent.spawn(f2, 5)
# g3 = gevent.spawn(f3, 5)
#
# g1.join()
# g2.join()
# g3.join()
gevent.joinall([
gevent.spawn(f1, 5),
gevent.spawn(f2, 5),
gevent.spawn(f3, 5)
])
gevent 怎么用?
from gevent import monkey
import gevent
import random
import time
# 有耗时操作时需要
monkey.patch_all() # 将程序中用到的耗时操作的代码,换为gevent中自己实现的模块
def coroutine_work(coroutine_name):
for i in range(10):
print(coroutine_name, i)
time.sleep(random.random())
gevent.joinall([
gevent.spawn(coroutine_work, "work1"),
gevent.spawn(coroutine_work, "work2")
])
协程图片下载器
import urllib.request
import gevent
from gevent import monkey
monkey.patch_all()
def downloader(url, name):
req = urllib.request.urlopen(url)
img_content = req.read()
with open(name, "wb") as f:
f.write(img_content)
def main():
gevent.joinall([
gevent.spawn(downloader, "https://rpic.douyucdn.cn/asrpic/191118/1554733_6854945_7c3f7_2_1502.jpg/webpdy1", "1.jpg"),
gevent.spawn(downloader, "https://rpic.douyucdn.cn/asrpic/191118/1282190_3853457_1abda_2_1450.jpg/webpdy1", "2.jpg")
])
if __name__ == '__main__':
main()
【Python】生成器的更多相关文章
- python——生成器
python——生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个 ...
- Python生成器-博文读后感
Windows 10家庭中文版,Python 3.6.4, 上午看过了一篇讲Python生成器的博文: 提高你的Python: 解释‘yield’和‘Generators(生成器)’(英文原文) 这篇 ...
- 小学生都能学会的python(生成器)
小学生都能学会的python(生成器) 1. 生成器 生成器的本质就是迭代器. 生成器由生成器函数来创建或者通过生成器表达式来创建 # def func(): # lst = [] # for i i ...
- Python 生成器 (generator) & 迭代器 (iterator)
python 生成器 & 迭代器 生成器 (generator) 列表生成式 列表生成式用来生成一个列表,虽然写的是表达式,但是储存的是计算出来的结果,因此生成的列表受到内存大小的限制 示例: ...
- python生成器学习
python生成器学习: 案例分析一: def demo(): for i in range(4): yield i g=demo() g1=(i for i in g) #(i for i in d ...
- 【python之路29】python生成器generator与迭代器
一.python生成器 python生成器原理: 只要函数中存在yield,则函数就变为生成器函数 #!usr/bin/env python # -*- coding:utf-8 -*- def xr ...
- Generator - Python 生成器
Generator, python 生成器, 先熟悉一下儿相关定义, generator function 生成器函数, 生成器函数是一个在定义体中存有 'yield' 关键字的函数. 当生成器函数被 ...
- python生成器原理剖析
python生成器原理剖析 函数的调用满足"后进先出"的原则,也就是说,最后被调用的函数应该第一个返回,函数的递归调用就是一个经典的例子.显然,内存中以"后进先出&quo ...
- 什么是Python生成器?与迭代器的关系是什么?
生成器是一个特殊的迭代器,它保存的是算法,每次调用next()或send()就计算出下一个元素的值,直到计算出最后一个元素,没有更多的元素时,抛出StopIteration.生成器有两种类型,一种是生 ...
- Python 生成器与迭代器 yield 案例分析
前几天刚开始看 Python ,后因为项目突然到来,导致Python的学习搁置了几天.然后今天看回Python 发现 Yield 这个忽然想不起是干嘛用的了(所以,好记性不如烂笔头.).然后只能 花点 ...
随机推荐
- Lotus words
We are going to memorize a lot of words in the fourth grade of primary school. It's very difficult f ...
- c# json序列化不包括某列
.[Newtonsoft.Json.JsonIgnore]特性:使用Newtonsoft.Json序列化时字段不会被序列化. .[System.Web.Script.Serialization.Scr ...
- linux运维 技能树
linux运维 技能树:: 初级运维: 基础:mysql基础,网络基础,计算机基础,linux系统vim, nginx ,grep ,awk,sed ,zaabix和常用开源软件,java tomca ...
- “/usr/local/lib/libosipparser2.so.7: could not read symbols: Invalid operation” 异常解决
编译c代码报错如下 /usr/bin/ld: /tmp/ccl8nBND.o: undefined reference to symbol 'osip_message_get_body' /usr/b ...
- Ubuntu 在终端关闭情况下仍然运行进程
参考: 让Linux关闭终端(关闭SSH等)后,程序继续运行 Ubuntu 在终端关闭情况下仍然运行进程 在 Ubuntu 16.04 系统下使用 screen 命令在终端关闭情况下仍然运行进程.具体 ...
- PostgreSQL的pg_hba.conf文件讲解
pg_hba.conf为PostgreSQL的访问策略配置文件,默认位于/var/lib/pgsql/10/data/目录(PostgreSQL10). 该配置文件有5个参数,分别为:TYPE(主机类 ...
- rpc通讯
dotnet core各rpc组件的性能测试 一般rpc通讯组件都具有高性特性,因为大部分rpc都是基于二进制和连接复用的特点,相对于HTTP(2.0以下的版本)来说有着很大的性能优势,非常适合服务间 ...
- Navicat 连接远程数据库报错:2003 - Can‘’t connect to MySQL server on 'XX.XX.XX.XX' (10061)
Navicat 连接远程数据库报错:2003 - Can‘’t connect to MySQL server on '172.22.69.190' (10061) 一.原因 远程数据库使用了默认设 ...
- LongAdder源码分析
AtomicLong是作用是对长整形进行原子操作,显而易见,在java1.8中新加入了一个新的原子类LongAdder,该类也可以保证Long类型操作的原子性,相对于AtomicLong,LongAd ...
- 前端与算法 leetcode 125. 验证回文串
目录 # 前端与算法 leetcode 125. 验证回文串 题目描述 概要 提示 解析 解法一:api侠 解法二:双指针 算法 传入测试用例的运行结果 执行结果 GitHub仓库 查看更多 # 前端 ...