yield

ES6-Generator基础用法

柔情痞子 提交于 2020-02-13 04:17:21
Generator简介:   生成器,本身是函数,执行后返回迭代对象,函数内部要配合yield使用Generator函数会分段执行,遇到yield暂停。 使用Generator注意点:function 和函数名之间需要带 * function* text(){ } Generator的yield注意点:yield是ES6新关键字,作用是使Generator(生成器)函数暂停。 function* text(){ yield 'a'; yield 'b'; yield 'c'; return 'd'; } let iterationObj = text(); console.log(iterationObj.next());//{value: "a", done: false} console.log(iterationObj.next());//{value: "b", done: false} console.log(iterationObj.next());//{value: "c", done: false} console.log(iterationObj.next());//{value: "d", done: true} yield后,必须return最后一个值,如果不return最后一个值value为undefined。 当每次执行后返回{value, done

Python3基础

让人想犯罪 __ 提交于 2020-02-12 13:00:36
一、Requests模块:用于发送网络请求 import requests Res = requests.get("http://www.baidu.com") 使用requests方法后,会返回一个response对象,其存储了服务器响应的内容: Res.status_code #响应状态码 Res.raw #返回原始响应体,也就是 urllib 的 response 对象,使用 r.raw.read() 读取 Res.content #字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩 Res.text #字符串方式的响应体,会自动根据响应头部的字符编码进行解码 Res.headers #以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None Res.enxoding #返回编码方式 #*特殊方法*# Res.json() #Requests中内置的JSON解码器 Res.raise_for_status() #失败请求(非200响应)抛出异常 1.传递参数: Requests允许你使用params关键字参数,以一个字符串字典来提供参数以手工构建URL payload = {'key1':value1','key2':'value2'} r = requests.get("http://httpbin.org/get',

迭代器、生成器、可迭代对象

两盒软妹~` 提交于 2020-02-11 12:33:22
1、迭代器 可以作用于for循环的数据类型有如下几种: 1、一类是集合数据类型:list、tuple、dict、set、str等; 2、一类是generator,包括生成器和带yield的generator function; 这些可以直接作用于for循环的可迭代对象:Iterable。 可以使用isinstance()判断一个对象是否是Iterable对象: >>> from collections import Iterable >>> isinstance([], Iterable) True >>> isinstance({}, Iterable) True >>> isinstance('abc', Iterable) True >>> isinstance((x for x in range(10)), Iterable) True >>> isinstance(100, Iterable) False 而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值, 直到最后抛出StopIteration错误表示无法继续返回下一个值了。 可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。 可以使用isinstance()判断一个对象是否是Iterator对象: >>> from collections import

【ES6】Generator

蹲街弑〆低调 提交于 2020-02-10 09:53:34
基本概念 是一种异步编程解决方案,语法上可以理解Generator函数是一个状态机,封装了多个内部状态。执行Generator函数会返回一个遍历器对象,可以一次遍历Generator函数内部的每一个状态。 function* helloWorldGenerator() { yield 'hello'; yield 'world'; return 'ending'; } var hw = helloWorldGenerator(); Generator 函数的调用方法与普通函数一样,也是在函数名后面加上一对圆括号。不同的是,调用 Generator 函数后,该函数并不执行,返回的也不是函数运行结果,而是一个指向内部状态的指针对象,也就是上一章介绍的遍历器对象。 下一步,必须调用遍历器对象的 next 方法,使得指针移向下一个状态。也就是说,每次调用 next 方法,内部指针就从函数头部或上一次停下来的地方开始执行,直到遇到下一个 yield 表达式(或 return 语句)为止。换言之,Generator 函数是分段执行的, yield 表达式是暂停执行的标记,而 next 方法可以恢复执行。 yield 表达式 遇到 yield 表达式,就暂停执行后面的操作,并将紧跟在 yield 后面的那个表达式的值,作为返回的对象的 value 属性值。 下一次调用 next 方法时

Python进阶06 循环对象

≡放荡痞女 提交于 2020-02-10 05:01:46
这一部分的只要目的是为了大家在读Python程序的时候对循环对象有一个基本概念。 循环对象并不是随着Python的诞生就存在的,但它的发展迅速,特别是Python 3x的时代,循环对象正在称为循环的标准形式。 什么是循环对象 循环对象是这样一个对象,它包含有一个next()方法(__next__()方法,在Python 3x中),这个方法的目的是进行到下一个结果,而在结束一系列结果之后,举出Stopiteration错误。 当一个循环结构(比如for)调用循环对象时,他就会每次循环的时候调用next()方法,直到Stopiteration出现,for循环接收到,就知道循环已经结束,停止调用next()。 假设我们有一个test.txt的文件: 1234 abcd efggds 我们运行一下python命令行: >>> f = open('test.txt') >>>f.next() >>>f.next() ... 不断输入f.next() ,直到最后出现StopIteration open()返回的实际上是一个循环对象,包含有next()方法。而按next()方法返回的就是新的一行的内容,到达文件结尾时举出StopIteration,这样,我们相当于手工进行了循环。 自动进行的话,就是: for line in open('test.txt')   print line 在这里

为什么 generator 忽略第一次 next 调用的参数值呢?

空扰寡人 提交于 2020-02-08 11:55:13
首先要理解几个基本概念。 执行生成器不会执行生成器函数体的代码,只是获得一个遍历器 一旦调用 next ,函数体就开始执行,一旦遇到 yield 就返回执行结果,暂停执行 第二次 next 的参数会作为第一次 yield 的结果传递给函数体,以此类推,所以第一次 next 调用的参数没用 Part I – 源码加注解 // 获得一个遍历器对象 const runner = gen(3); console.log( runner.next(4) ); // { value: 3, done: false } console.log( runner.next(5) ); // { value: 5, done: false } console.log( runner.next(6) ); // { value: 14, done: true } // 定义生成器 function* gen(x) { /* 第一次调用 next(4) 开始执行, 但是参数 4 会被忽略掉, 请继续往下看。 */ const y = yield x /* 遇到 yield 立即暂停, 所以第一次 next(4) 调用就结束了, 参数 4 也就因此被忽略掉了, 返回 { value: x, done: false }。 等待下一次调用 next(5) 恢复执行, 将参数 5 作为表达式 yield x

《利用python进行数据分析》——3.2函数——生成器——读书笔记

岁酱吖の 提交于 2020-02-08 01:07:32
1. 生成器定义 一边循环一边计算的机制,称为:生成器(generator) 生成器(generator)是构造新的可迭代对象的一种简单方式。 一般的函数执行之后只会返回单个值,而生成器则是以延迟的方式返回一个值序列, 即每返回一个值之后暂停,直到下一个值被请求时再继续。 生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器 2. 为什么要有生成器 python生成器的优点: (1)延迟计算,一次返回一个结果。生成器不会一次生成所有的结果,而是一边循环一边计算,这对于大数据量处理,是个非常有用的优势。因为在编程的实际应用中,占用内存量是工程师必须考虑的一个问题。 列表所有数据都在内存中,如果有海量数据的话将会非常耗内存。 如:仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。 如果列表元素按照某种算法推算出来,那我们就可以在循环的过程中不断推算出后续的元素,这样就不必创建完整的list,从而节省大量的空间。 简单一句话:我又想要得到庞大的数据,又想让它占用空间少,那就用生成器! (2)有效提高代码可读性。使用生成器以后,代码行数更少。 3.如何创建生成器 第一种方法很简单,只要把一个列表生成式的 [] 改成 () ,就创建了一个generator: In [189]: gen = (x ** 2 for x in range(100))

Python全栈(四)高级编程技巧之10.Python多任务-协程

社会主义新天地 提交于 2020-02-07 22:00:53
文章目录 一、生成器-send方法 1.同步、异步 2.堵塞、非堵塞 3.生成器的send()方法 二、使用yield完成多任务和yield from 1.使用yield完成多任务 2.yield from的使用 三、协程-使用greenlet&gevent完成多任务 1.协程概念 2.使用greenlet完成多任务 3.使用gevent完成多任务 4.gevent简单应用 5.进程、线程和协程对比 一、生成器-send方法 1.同步、异步 同步: 是指代码调用 IO操作 时,必须等待IO操作完成才返回的调用方式。 异步: 是指代码调用 IO操作 时,不必等IO操作完成就返回的调用方式。 同步异步比较如下: 2.堵塞、非堵塞 阻塞: 从调用者的角度出发,如果在调用的时候,被卡住,不能再继续向下运行,需要等待,就说是阻塞。 堵塞的例子有: 多个用户同时操作数据库和锁机制 Socket的 accept() 方法 input() 非阻塞: 从调用者的角度出发,如果在调用的时候,没有被卡住,能够继续向下运行,无需等待,就说是非阻塞。 3.生成器的send()方法 之前讲到生成器: def create_fib ( num ) : a , b = 0 , 1 current_num = 0 while current_num < num : yield a a , b = b , a + b

scrapy使用yield返回Request的步骤(应该是最清楚的)

人盡茶涼 提交于 2020-02-07 04:18:27
scrapy使用yield返回Request的步骤是怎么样的 Python的yield是一个比较特别的关键字。 1 2 3 4 5 6 >>> def test_yield(): ... for i in range ( 3 ): ... yield i ... >>> test_yield() <generator object test_yield at 0x01AB2C88 > 很明显的看到,yield不同于return。return直接返回函数返回值。而包含yield的函数,不返回而是生成了一个对象。这个对象叫做生成器(generator)。实际上test_yield中的for循环并没有在调用test_yield函数时执行完毕,而是每次遇到yield都会停止在执行yield前,当你调用生成器的next方法时,yield就会执行,这时返回紧接着yield的变量。 1 2 3 4 5 6 7 8 9 10 11 >>> gen = test_yield() >>> gen. next () 0 >>> gen. next () 1 >>> gen. next () 2 >>> gen. next () Traceback (most recent call last): File "<stdin>" , line 1 , in <module> StopIteration

揭开yield关键字的神秘面纱

拥有回忆 提交于 2020-02-05 09:41:13
写在前言 经常会看见,python函数中带有yield关键字,那么yield是什么,有什么作用? 答案:可以理解yield是一个生成器; 作用:遇到yield关键字,函数会直接返回yield值,相当于return;不同的是下次调用的时候会从yield之后的代码开始执行。 生成器是什么? 是可以迭代的,但是你 只可以读取它一次 ,因为它并不把所有的值放在内存中,它是实时地生成数据: 有人可能会说,我直接迭代,遍历多好,为什么要用生成器,然后去遍历生成器,这多麻烦。 那么你要了解,list列表,所有数据是存储在内存中的。如果数据量非常大,会非常耗内存。 yield是一个特殊的return? 不同的是执行过程中遇到yield关键字,会阻断,yield 返回的是一个生成器。 第一次迭代中你的函数会执行,从开始到达 yield 关键字,然后返回 yield 后的值作为第一次迭代的返回值. 然后,每次执行这个函数都会继续执行你在函数内部定义的那个循环的下一次,再返回那个值,直到没有可以返回的。 注意,当函数中出现yield,该函数返回的就是一个生成器。不在是普通函数。 def func(num): n,a,b = 0,0,1 while num > n: yield b #阻断,返回b a,b = b,a + b n+=1 for i in func(19): #func(19)是一个生成器