python莫名其妙的yield, yield from, yield.send

练了几行代码,

慢慢找感觉。

TASK,多线程,异步,很多地方都用到的呢。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
from contextlib import contextmanager
from concurrent.futures import ThreadPoolExecutor

class Task:
    def __init__(self, gen):
        self._gen = gen

    def step(self, value=None, exc=None):
        try:
            if exc:
                fut = self._gen.throw(exc)
            else:
                fut = self._gen.send(value)
            fut.add_done_callback(self._wakeup)
        except StopIteration as exc:
            pass

    def _wakeup(self, fut):
        try:
            result = fut.result()
            self.step(result, None)
        except Exception as exc:
            self.step(None, exc)

def func(x, y):
    'Some function. Nothing too interesting'
    import time
    time.sleep(2)
    return x + y

def do_func(x, y):
    try:
        result = yield pool.submit(func, x, y)
        print("Got: ", result)
    except Exception as e:
        print("Failed: ", repr(e))

def do_many(n):
    while n > 0:
        result = yield pool.submit(func, n, n)
        print("Got: ", result)
        n -= 1

def after(delay, gen):
    yield from pool.submit(time.sleep, delay)
    yield from gen
    print("GOOOOT: ", result)
    '''
    result = None
    try:
        while True:
            f = gen.send(result)
            result = yield f
        # print("GOOOT: ", result)
    except StopIteration:
        pass
    print("GOOOT: ", result)
    '''

pool = ThreadPoolExecutor(max_workers=8)
# fut = pool.submit(func, 2, 3)
# r = fut.result()
# print('Got:', r)

t = Task(do_func(2, 3))
t.step()
t = Task(do_func(2, "Hello"))
t.step()
Task(after(3, do_func(2, 3))).step()
t = Task(do_many(10))
t.step()

def countdown(n):
    print ("Counting down from ", n)
    while n > 0:
        yield n
        n -= 1

def coroutine(func):
    def start(*args, **kwargs):
        cr = func(*args, **kwargs)
        next(cr)
        return cr
    return start

@coroutine
def grep(pattern):
    print ("Looking for %s " % pattern)
    try:
        while True:
            line = (yield)
            if pattern in line:
                print (line,)
    except GeneratorExit:
        print ("Going away. Goodbye.")

g = grep("python")
g.send("Yeah, but no, but yeah")
g.send("python generatores rock!")
g.close()

def receiver():
    while True:
        item = yield
        print("Got ", item)

recv = receiver()
next(recv)
recv.send("hello")
recv.send("world")

def chain(x, y):
    yield from x
    yield from y

a = [1, 2, 3]
b = [4, 5, 6]
for x in chain(a, b):
    print(x, end=" ")

 

时间: 2024-08-02 09:08:55

python莫名其妙的yield, yield from, yield.send的相关文章

python raw socket构造packet后能send,但是recv不了?

问题描述 python raw socket构造packet后能send,但是recv不了? s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW) # IP Header ipobj = IP(src_host, dst_host) iph = ipobj.pack() # TCP Header tcpobj = TCP(1234, 80) tcpobj.data_length = len(data) # U

转-[Python 学习]2.5版yield之学习心得

在 shhgs 发布了关于< Py 2.5 what's new 之 yield>之后,原来我不是特别关注 yield 的用法,因为对于2.3中加入的yield相对来说功能简单,它是作为一个 generator 不可缺少的一条语句,只要包含它的函数即是一个 generator .但在2.3中,generator 不能重入,不能在运行过程中修改,不能引发异常,你要么是顺序调用,要么就创建一个新的 generator.而且 generator 中的 yield 只是一个语句.但到了 2.5 版之后

python下yield(生成器)

python下的协程: 1 #encoding=utf-8 2 """ 3 协程----微小的进程 4 yield生成器-----生成一个可迭代对象比如list, tuple,dir 5 1.包含yield的函数,则是一个可迭代对象(list, tuple等) 6 每次运行到yield即结束,并保留现场 7 2.生产者.消费者行为: 8 9 3.无需立即执行,需要时才执行 10 """ 11 12 a = [1, 2, 3, 4] 13 for

Python yield与实现

yield的功能类似于return,但是不同之处在于它返回的是生成器. 生成器 生成器是通过一个或多个yield表达式构成的函数,每一个生成器都是一个迭代器(但是迭代器不一定是生成器). 如果一个函数包含yield关键字,这个函数就会变为一个生成器. 生成器并不会一次返回所有结果,而是每次遇到yield关键字后返回相应结果,并保留函数当前的运行状态,等待下一次的调用. 由于生成器也是一个迭代器,那么它就应该支持next方法来获取下一个值. 基本操作 # 通过`yield`来创建生成器 def f

python中yield的用法详解

列表解析: [expr for iter_var in iterable if cond_expr] 生成器表达式: (expr for iter_var in iterable if cond_expr) 生成器最大的却别是它并不返回一个真正的数组 rows = [1,2,3,17]   def cols():     yield 56     yield 2     yield 1     abc = cols()   for i in abc:     print i   print ro

Python yield使用方法示例_python

1. iterator叠代器最简单例子应该是数组下标了,且看下面的c++代码: 复制代码 代码如下: int array[10];for ( int i = 0; i < 10; i++ )    printf("%d ", array[i]); 叠代器工作在一个容器里(array[10]),它按一定顺序(i++)从容器里取出值(array[i])并进行操作(printf("%d ", array[i]). 上面的代码翻译成python:   复制代码 代码如

Python Yield Generator详解

本文将由浅入深详细介绍yield以及generator,包括以下内容:什么generator,生成generator的方法,generator的特点,generator基础及高级应用场景,generator使用中的注意事项.本文不包括enhanced generator即pep342相关内容. generator基础 在python的函数(function)定义中,只要出现了yield表达式(Yield expression),那么事实上定义的是一个generator function, 调用这

python 之 yield表达式

如果在某个函数中包含了yield, 这意味着这个函数已经是一个Generator, 它的执行 会和其他普通的函数有很多不同. 比如: def   h(): print    'To   be  brave' yield   5 h() 可以看到,调用h()之后,print语句并没有执行, 这就是yield,  那么,如何让print语句执行呢? 这就是接下来要讨论的问题: yield 是一个表达式(expression) m  =  yield   5 表达式(yield 5)的返回值将赋值给m

python通过yield实现数组全排列的方法_python

本文实例讲述了python通过yield实现数组全排列的方法.分享给大家供大家参考.具体分析如下: 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列.当m=n时所有的排列情况叫全排列. 这段代码用到了yield方法,全排列速度加倍 def perm(arr, pos = 0): if pos == len(arr): yield arr for i in range(pos, len(arr)): arr[pos], arr[i] = a