python协程

Python迭代器和生成器

孤人 提交于 2019-12-27 03:48:19
一、 楔子 假如我现在有一个列表l=['a','b','c','d','e'],我想取列表中的内容,有几种方式? 首先,我可以通过索引取值l[0],其次我们是不是还可以用for循环来取值呀? 你有没有仔细思考过,用索引取值和for循环取值是有着微妙区别的。 如果用索引取值,你可以取到任意位置的值,前提是你要知道这个值在什么位置。 如果用for循环来取值,我们把每一个值都取到,不需要关心每一个值的位置,因为只能顺序的取值,并不能跳过任何一个直接去取其他位置的值。 但你有没有想过,我们为什么可以使用for循环来取值? for循环内部是怎么工作的呢? 二、迭代器 2.1 python中的for循环 要了解for循环是怎么回事儿,咱们还是要从代码的角度出发。 首先,我们对一个列表进行for循环。 for i in [1,2,3,4]: print(i) 上面这段代码肯定是没有问题的,但是我们换一种情况,来循环一个数字1234试试 for i in 1234 print(i) 结果: Traceback (most recent call last): File "test.py", line 4, in <module> for i in 1234: TypeError: 'int' object is not iterable 看,报错了!报了什么错呢?“TypeError: 'int'

python函数-迭代器&生成器

只谈情不闲聊 提交于 2019-12-27 03:45:11
python函数-迭代器&生成器 一、迭代器 1 可迭代协议 迭代:就是类似for循环,将某个数据集内的数据可以“一个挨着一个取出来” 可迭代协议:     ① 协议内容:内部实现__iter__方法     ② 验证方法:dir()方法。通过dir()方法查看是否含有__iter__方法     ③ __iter__方法的作用:可迭代的数据类型执行__iter__方法后会生成一个迭代器对象 print([1,2].__iter__()) 结果 <list_iterator object at 0x1024784a8> 2 迭代器协议   1 引出 ''' dir([1,2].__iter__())是列表迭代器中实现的所有方法,dir([1,2])是列表中实现的所有方法,都是以列表的形式返回给我们的,为了看的更清楚,我们分别把他们转换成集合, 然后取差集。 '''#实现的所有方法 print(dir([1,2].__iter__())) print(dir([1,2]))#取差集 print(set(dir([1,2].__iter__()))-set(dir([1,2]))) 结果: {'__length_hint__', '__next__', '__setstate__'}   我们看到在列表迭代器中多了三个方法,那么这三个方法都分别做了什么事呢? iter_l = [1,2

python菜鸟学习Day12(yield)

家住魔仙堡 提交于 2019-12-26 19:38:44
在python中,带yield的函数称为生成器(generator),python对协程的支持也是通过生成器实现的。 yield 首先将yield当成一个断点标记,中断,return 。当程序执行到yield处,返回yield后边的变量,中断。其他程序获取这个变量,调用生成器的next()函数,程序又回到生成器,接着向下执行。 一个带有 yield 的函数就是一个 generator,它和普通函数不同,生成一个 generator 看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()(在 for 循环中会自动调用 next())才开始执行。虽然执行流程仍按函数的流程执行,但每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。 def foo ( ) : print ( "starting..." ) while True : res = yield 4 print ( "res:" , res ) g = foo ( ) print ( next ( g ) ) print ( "*" * 20 ) print ( next ( g ) ) 执行结果 starting . . . 4 ** ** **

Python核心技术与实战 笔记

梦想的初衷 提交于 2019-12-26 16:37:22
基础篇 Jupyter Notebook 优点 整合所有的资源 交互性编程体验 零成本重现结果 实践站点 Jupyter 官方 Google Research 提供的 Colab 环境 安装 运行 列表与元组 列表和元组,都是 一个可以放置任意数据类型的有序集合 。 l = [1, 2, 'hello', 'world'] # 列表中同时含有 int 和 string 类型的元素 l [1, 2, 'hello', 'world'] tup = ('jason', 22) # 元组中同时含有 int 和 string 类型的元素 tup ('jason', 22) 列表是动态的,长度大小不固定,可以随意地增加、删减或者改变元素 (mutable) 元组是静态的,场地大小固定,无法增加删除或者改变 (immutable) 都支持负数索引; 都支持切片操作; 都可以随意嵌套; 两者可以通过 list() 和 tuple() 函数相互转换; 列表和元组存储方式的差异 由于列表是动态的,所以它需要存储指针,来指向对应的元素。增加/删除的时间复杂度均为 O(1)。 l = [] l.__sizeof__() // 空列表的存储空间为 40 字节 40 l.append(1) l.__sizeof__() 72 // 加入了元素 1 之后,列表为其分配了可以存储 4 个元素的空间 (72 -

Python核心技术与实战 笔记

柔情痞子 提交于 2019-12-26 16:36:48
基础篇 Jupyter Notebook 优点 整合所有的资源 交互性编程体验 零成本重现结果 实践站点 Jupyter 官方 Google Research 提供的 Colab 环境 安装 运行 列表与元组 列表和元组,都是 一个可以放置任意数据类型的有序集合。 l = [1, 2, 'hello', 'world'] # 列表中同时含有 int 和 string 类型的元素 l [1, 2, 'hello', 'world'] tup = ('jason', 22) # 元组中同时含有 int 和 string 类型的元素 tup ('jason', 22) 列表是动态的,长度大小不固定,可以随意地增加、删减或者改变元素 (mutable) 元组是静态的,场地大小固定,无法增加删除或者改变 (immutable) 都支持负数索引; 都支持切片操作; 都可以随意嵌套; 两者可以通过 list() 和 tuple() 函数相互转换; 列表和元组存储方式的差异 由于列表是动态的,所以它需要存储指针,来指向对应的元素。增加/删除的时间复杂度均为 O(1)。 l = [] l.__sizeof__() // 空列表的存储空间为 40 字节 40 l.append(1) l.__sizeof__() 72 // 加入了元素 1 之后,列表为其分配了可以存储 4 个元素的空间 (72 -

Python并行编程的几个要点

a 夏天 提交于 2019-12-26 00:56:56
一、基于线程的并行编程 如何使用Python的线程模块 如何定义一个线程 如何探测一个线程 如何在一个子类中使用线程 Lock 和 RLock 实现线程同步 信号实现线程同步 条件(condition)实现线程同步 事件(event)实现线程同步 如何使用 with 语句 使用队列实现线程消息传递 如何评估多线程应用的性能 兑现成编程的危险 二、基于进程的并行编程 如何使用Python的 multiprocessing 模块 如何生成一个进程 如何命名一个进程 如何在后台运行一个进程 如何杀死一个进程 如何在子类中使用进程 如何在进程间交换对象 使用队列在进程间交换对象 使用管道在进程间交换对象 如何实现进程同步 如何管理不同进程间的状态 如何使用进程池 如何使用Python的 mpi4py 模块 端到段通信 避免死锁问题 使用广播(broadcast)进行集体间通信 使用散点(scatter)函数进行集体间通信 三、异步编程 如何使用 concurrent.futures 模块 Asyncio 事件循环管理 Asyncio 处理协程 Asyncio 任务管理 Dealing with Asyncio and Futures Gevent Tornado Twsited 四、分布式Python 使用Celery分布任务 如何通过Celery创建任务 SCOOP科学计算

python之concurrent.futures模块

丶灬走出姿态 提交于 2019-12-26 00:50:18
最新Python异步编程详解:https://www.jianshu.com/p/b036e6e97c18 Python之禅 完全理解Python迭代对象、迭代器、生成器:https://foofish.net/iterators-vs-generators.html 使用Python进行并发编程:http://python.jobbole.com/81255/ Python通过future处理并发 python之concurrent.futures模块 python协程面试题(一):https://blog.csdn.net/leon_wzm/article/details/79085235 python异步爬虫: https://blog.csdn.net/whuhan2013/article/details/52529477 来源: https://www.cnblogs.com/charlieLeo/p/9492911.html

python并发编程之多进程、多线程、异步、协程、通信队列Queue和池Pool的实现和应用

余生颓废 提交于 2019-12-26 00:47:31
什么是多任务? 简单地说,就是操作系统可以同时运行多个任务。实现多任务有多种方式, 线程、进程、协程。 并行和并发的区别? 并发:指的是任务数多余cpu核数,通过操作系统的各种任务调度算法,实现用多个任务“一起”执行(实际上总有一些任务不在执行,因为切换任务的速度相当快,看上去一起执行而已) 并行:指的是任务数小于等于cpu核数,即任务真的是一起执行的 真的多任务叫并行,假的多任务叫并发 。 我们来了解下python中的进程,线程以及协程! 从计算机硬件角度: 计算机的核心是CPU,承担了所有的计算任务。 一个CPU,在一个时间切片里只能运行一个程序。 从操作系统的角度: 进程和线程,都是一种CPU的执行单元。 进程:表示一个程序的上下文执行活动(打开、执行、保存...) 线程:进程执行程序时候的最小调度单位(执行a,执行b...),可以简单理解为同一进程中有多个计数器,每个线程的执行时间不确定,而每个进程的时间片相等, 线程是操作系统调度执行的最小单位 一个程序至少有一个进程,一个进程至少有一个线程。 多进程/多线程: 表示可以同时执行多个任务,进程和线程的调度是由操作系统自动完成。 进程:每个进程都有自己独立的内存空间,不同进程之间的内存空间不共享。 进程之间的通信有操作系统传递,导致通讯效率低,切换开销大。 进程是系统进行资源分配的最小单位 线程:一个进程可以有多个线程

Python多进程编程

懵懂的女人 提交于 2019-12-26 00:46:47
一、多线程    多线程就是允许一个进程内存在多个控制权,以便让多个函数同时处于激活状态,从而让多个函数的操作同时运行。 即使是单CPU的计算机,也可以通过不停地在不同线程的指令间切换,从而造成多线程同时运行的效果。   多线程相当于一个并发(concunrrency)系统。并发系统一般同时执行多个任务。如果多个任务可以 共享资源 ,特别是同时写入某个变量的时候,就需要解决同步的问题,比如多线程火车售票系统:两个指令,一个指令检查票是否卖完,另一个指令,多个窗口同时卖票,可能出现卖出不存在的票。   在并发情况下,指令执行的先后顺序 由内核决定 。同一个线程内部,指令按照先后顺序执行,但不同线程之间的指令很难说清除哪一个会先执行。因此要考虑多线程同步的问题。同步(synchronization)是指在一定的时间内只允许某一个线程访问某个资源。 详情请看: Linux多线程与同步 1、thread模块 2、threading模块 threading.Thread 创建一个线程。 给判断是否有余票和卖票,加上互斥锁,这样就不会造成一个线程刚判断没有余票,而另外一个线程就执行卖票操作。 #! /usr/bin/python #-* coding: utf-8 -* # __author__ ="tyomcat" import threading import time import os

Python多进程编程

假装没事ソ 提交于 2019-12-26 00:46:10
一、多线程    多线程就是允许一个进程内存在多个控制权,以便让多个函数同时处于激活状态,从而让多个函数的操作同时运行。 即使是单CPU的计算机,也可以通过不停地在不同线程的指令间切换,从而造成多线程同时运行的效果。   多线程相当于一个并发(concunrrency)系统。并发系统一般同时执行多个任务。如果多个任务可以 共享资源 ,特别是同时写入某个变量的时候,就需要解决同步的问题,比如多线程火车售票系统:两个指令,一个指令检查票是否卖完,另一个指令,多个窗口同时卖票,可能出现卖出不存在的票。   在并发情况下,指令执行的先后顺序 由内核决定 。同一个线程内部,指令按照先后顺序执行,但不同线程之间的指令很难说清除哪一个会先执行。因此要考虑多线程同步的问题。同步(synchronization)是指在一定的时间内只允许某一个线程访问某个资源。 详情请看: Linux多线程与同步 1、thread模块 2、threading模块 threading.Thread 创建一个线程。 给判断是否有余票和卖票,加上互斥锁,这样就不会造成一个线程刚判断没有余票,而另外一个线程就执行卖票操作。 #! /usr/bin/python #-* coding: utf-8 -* # __author__ ="tyomcat" import threading import time import os