yield

yield的表示形式

独自空忆成欢 提交于 2020-03-02 10:46:45
yield表达式, 四种形式: a. 不接受输入值或者输入值是None yield 1 b. 接受输入值 s = yield 1 c. 接受输入,但不返回数据,这样默认返回None s = yield d.既不接受输入,也不返回值,默认返回None yield 第一种:当函数调用到yield时,返回yield的右边经过计算的值 ,这里说计算的意思是,yield后面可以写成函数,表达式等, 第二种:当函数调用到yield时,必须传入一个值,该值存入s中,然后返回yield后面的表达式的值并保存当前状态 第三种:只是将数据接受进来,然后执行yield后的语句,再次执行到yield时,保存当前状态并返回,这样的用例一般是只打印一些处理消息,而不需要结果的方式。 第四种:这样的只能遍历generator内部的数据了。 来源: https://www.cnblogs.com/ranyihang/p/12394090.html

Python协程的引入与原理分析

故事扮演 提交于 2020-03-02 03:52:40
相关概念 并发: 指一个时间段内,有几个程序在同一个 cpu 上运行,但是任意时刻只有一个程序在cpu上运行。比如说在一秒内cpu切换了100个进程,就可以认为cpu的并发是100。 并行: 值任意时刻点上,有多个程序同时运行在cpu上,可以理解为多个cpu,每个cpu独立运行自己程序,互不干扰。并行数量和cpu数量是一致的。 我们平时常说的高并发而不是高并行,是因为cpu的数量是有限的,不可以增加。 形象的理解:cpu对应一个人,程序对应喝茶,人要喝茶需要四个步骤(可以对应程序需要开启四个线程):1烧水,2备茶叶,3洗茶杯,4泡茶。 并发方式:烧水的同时做好2备茶叶,3洗茶杯,等水烧好之后执行4泡茶。这样比顺序执行1234要省时间。 并行方式:叫来四个人(开启四个进程),分别执行任务1234,整个程序执行时间取决于耗时最多的步骤。 同步 ( 注意同步和异步只是针对于I/O操作来讲的 )值调用IO操作时,必须等待IO操作完成后才开始新的的调用方式。 异步  指调用IO操作时,不必等待IO操作完成就开始新的的调用方式。 阻塞 指调用 函数 的时候,当前线程被挂起。 非阻塞 指调用 函数 的时候,当前线程不会被挂起,而是立即返回。 IO多路复用   sllect, poll, epoll都是IO多路复用的机制。IO多路复用就是通过这样一种机制:一个进程可以监听多个描述符

IEnumerable、IEnumerator与yield的学习

孤街浪徒 提交于 2020-03-02 02:58:38
我们知道数组对象可以使用foreach迭代进行遍历,同时我们发现类ArrayList和List也可以使用foreach进行迭代。如果我们自己编写的类也需要使用foreach进行迭代时该怎么办呢? IEnumerable: 1 public interface IEnumerable 2 { 3 IEnumerator GetEnumerator(); 4 } 如果自己编写的类需要foreach进行迭代就需要实现IEnumerable接口,表示当前的类可以进行迭代。 我们发现该接口唯一的方法返回的是另一个接口IEnumerator,下面看看这个接口是干嘛的。 IEnumerator: 1 public interface IEnumerator 2 { 3 object Current { get; } 4 bool MoveNext(); 5 void Reset(); 6 } 如果说IEnumerable接口是表示当前类可以进行迭代,那么IEnumerator则是实现迭代逻辑的接口,我们需要编写一个实现IEnumerator接口的类并在其中编写好迭代逻辑。 下面直接上一个例子: People.cs: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System

PHP协程入门详解

╄→尐↘猪︶ㄣ 提交于 2020-03-01 03:56:54
概念 咱们知道多进程和多线程是实现并发的有效方式。但多进程的上下文切换资源开销太大;多线程开销相比要小很多,也是现在主流的做法,但其的控制权在内核,从而使用户(程序员)失去了对代码的控制,而且线程的上下文切换也是有一定开销的。 这时为了解决以上问题,"协程"(coroutine)的概念就产生了。你可以将协程理解为更轻量级的线程。这种线程叫做“用户空间线程“。协程,有下面两个特点: 协同。因为是由程序员自己写的调度策略,其通过协作而不是抢占来进行切换 在用户态完成创建,切换和销毁 PHP对协程的支持是在 迭代生成器 的基础上, 增加了可以回送数据给生成器的功能(调用者发送数据给被调用的生成器函数)。 这就把生成器到调用者的单向通信转变为两者之间的双向通信。 迭代器 迭代器的概念这里就不赘述了。下面看看我们自己实现的一个迭代器。 class MyIterator implements Iterator { private $var = array(); public function __construct($array) { if (is_array($array)) { $this->var = $array; } } public function rewind() { // 第一次迭代时候会执行(或调用该方法的时候),后面的迭代将不会执行。 echo "rewinding\n"

Python----多任务----协程

被刻印的时光 ゝ 提交于 2020-02-29 20:49:48
Python学习之路,点击有全套Python笔记 协程是什么 简单点说协程是进程和线程的升级版,进程和线程都面临着内核态和用户态的切换问题而耗费许多切换时间,而协程就是用户自己控制切换的时机,不再需要陷入系统的内核态. 迭代器 迭代器就是用于迭代操作(for 循环的对象),它像列表一样可以迭代获取其中的每一个元素,任何实现了__next__方法的对象都可以称为迭代器。 它与列表的区别在于,构建迭代器的时候,不像列表把所有元素一次性加载到内存,而是以一种延迟计算方式返回元素。它并没有把所有元素装在到内存中,而是等到调用next方法的时候才返回元素 生成器 方法一:把列表生成器的[]改成() 方法二:只要函数里有yield关键字,就被称为生成器 yield关键字有两点作用: 保存当前运行状态(断点),然后暂停执行,即将生成器(函数)挂起 将yield关键字后面表达式的值作为返回值返回,此时可以理解为起到了return的作用 可以使用next()函数让生成器从断点处继续执行,即唤醒生成器(函数) Python3中的生成器可以使用return返回最终运行的返回值。 # 用yield实现协程 import time def task_1 ( ) : while True : print ( "-----1-----" ) time . sleep ( 0.1 ) yield def task

迭代访问列表的最“ pythonic”方法是什么?

我是研究僧i 提交于 2020-02-28 03:23:24
我有一个Python脚本,它将一个整数列表作为输入,我需要一次处理四个整数。 不幸的是,我无法控制输入,或者将其作为四元素元组的列表传递。 目前,我正在以这种方式对其进行迭代: for i in xrange(0, len(ints), 4): # dummy op for example code foo += ints[i] * ints[i + 1] + ints[i + 2] * ints[i + 3] 不过,它看起来很像“ C思维”,这使我怀疑还有一种处理这种情况的更Python的方法。 该列表在迭代后被丢弃,因此不需要保留。 也许这样的事情会更好? while ints: foo += ints[0] * ints[1] + ints[2] * ints[3] ints[0:4] = [] 不过,还是不太“正确”。 :-/ 相关问题: 如何在Python中将列表分成均匀大小的块? #1楼 此问题的理想解决方案适用于迭代器(而不仅仅是序列)。 它也应该很快。 这是itertools文档提供的解决方案: def grouper(n, iterable, fillvalue=None): #"grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx" args = [iter(iterable)] * n return itertools.izip

Behaviour of Python's “yield”

时间秒杀一切 提交于 2020-02-27 19:34:43
问题 I'm reading about the yield keyword in python, and trying to understand running this sample: def countfrom(n): while True: print "before yield" yield n n += 1 print "after yield" for i in countfrom(10): print "enter for loop" if i <= 20: print i else: break The output is: before yield enter for loop 10 after yield before yield enter for loop 11 after yield before yield enter for loop 12 after yield before yield enter for loop 13 after yield before yield enter for loop 14 after yield before

Behaviour of Python's “yield”

半世苍凉 提交于 2020-02-27 19:32:19
问题 I'm reading about the yield keyword in python, and trying to understand running this sample: def countfrom(n): while True: print "before yield" yield n n += 1 print "after yield" for i in countfrom(10): print "enter for loop" if i <= 20: print i else: break The output is: before yield enter for loop 10 after yield before yield enter for loop 11 after yield before yield enter for loop 12 after yield before yield enter for loop 13 after yield before yield enter for loop 14 after yield before

拼合不规则的列表

帅比萌擦擦* 提交于 2020-02-26 09:15:23
是的,我知道以前已经讨论过这个主题( 在这里 , 这里 , 这里 , 这里 ),但是据我所知,除一个解决方案外,所有解决方案在这样的列表上均失败: L = [[[1, 2, 3], [4, 5]], 6] 所需的输出是 [1, 2, 3, 4, 5, 6] 甚至更好的迭代器。 这个问题 是我看到的唯一适用于任意嵌套的解决方案: def flatten(x): result = [] for el in x: if hasattr(el, "__iter__") and not isinstance(el, basestring): result.extend(flatten(el)) else: result.append(el) return result flatten(L) 这是最好的模型吗? 我有事吗 任何问题? #1楼 使用递归和鸭子类型生成器(针对Python 3更新): def flatten(L): for item in L: try: yield from flatten(item) except TypeError: yield item list(flatten([[[1, 2, 3], [4, 5]], 6])) >>>[1, 2, 3, 4, 5, 6] #2楼 尝试创建一个可以平化Python中不规则列表的函数很有趣,但是当然这就是Python的目的

迭代器、生成器、面向过程编程

怎甘沉沦 提交于 2020-02-26 09:09:34
阅读目录 一 迭代器 二 生成器 三 面向过程编程 一 迭代器 一 迭代的概念 #迭代器即迭代的工具,那什么是迭代呢?#迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单纯地重复,因而不是迭代 print('===>') l=[1,2,3] count=0 while count < len(l): #迭代 print(l[count]) count+=1 二 为何要有迭代器?什么是可迭代对象?什么是迭代器对象? #1、为何要有迭代器? 对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器 #2、什么是可迭代对象? 可迭代对象指的是内置有__iter__方法的对象,即obj.__iter__,如下 'hello'.__iter__ (1,2,3).__iter__ [1,2,3].__iter__ {'a':1}.__iter__ {'a','b'}.__iter__ open('a.txt').__iter__ #3、什么是迭代器对象? 可迭代对象执行obj.__iter__()得到的结果就是迭代器对象 而迭代器对象指的是即内置有__iter__又内置有__next_