Python9- 生成器函数进阶-day14】的更多相关文章

1.生成器函数进阶 2.列表推导式 3.生成器表达式…
一.生成器函数进阶 需求:求取移动平均数 1.应用场景之一,在奥运会气枪射击比赛中,每打完一发都会显示平均环数! def show_avg(): print('你已进入显示移动平均环数系统!') a = yield avg = a/1 b = yield avg = (a + b)/2 print('目前的平均环数是:') yield avg generator = show_avg() generator.__next__() print(generator.send(10)) # 第一发打了…
迭代器和生成器的概念 迭代器 对于list.string.tuple.dict等这些容器对象,使用for循环遍历是很方便的.在后台for语句对容器对象调用iter()函数.iter()是python内置函数. iter()函数会返回一个定义了next()方法的迭代器对象,它在容器中逐个访问容器内的元素.next()也是python内置函数.在没有后续元素时,next()会抛出一个StopIteration异常,通知for语句循环结束. 迭代器是用来帮助我们记录每次迭代访问到的位置,当我们对迭代器…
def generator(): print(123) content = yield 1 print('=======',content) print(456) arg = yield 2 '''''' yieldg1 = generator()g2 = generator()g1.__next__()g2.__next__()print('***',generator().__next__())print('***',generator().__next__()) g = generator…
生成器进阶#send的获取下一个值的效果和next基本一致,#只不过在获取下一个值的时候,给上一个值的位置穿第一个数据 使用send的注册事项: #第一次使用生成器的时候,必须用next获取下一个值 #最后一个yield不能接受外部的值 def generator(): print(123) content = yield 1 print('======',content) print(456) yield 2 g = generator() ret = g.__next__() print('…
def generator(): print(123) content = yield 1 #content接收的是send传的值 print('=======',content) print(456) arg = yield 2 print('nihao') '''''' yield g = generator() ret = g. print('***',ret) # *** 1 ret = g.send('hello') #send的效果和next一样 # print('***',ret)…
def generator(): print(123) yield 1 print(456) yield 2 g = generator() ret = g.__next__() print('***'ret) ret = g.send(None) #send 效果和 next一样 print('***'ret) next与send 归纳: 1.send 获取下一个值得效果和next基本一致 2.只是在获取下一个值得时候,给上一个yield的位置传一个参数 使用send的注意事项 1.第一次使用…
生成器表达式: #列表推导式 # y = [1,2,3,4,5,6,7,8] # x = [1,4,9,16,25,36,49,64] # x = [] # for i in y: # x.append(i*i) # print(x) # x = [i*i for i in y] # print(x) #range(100) # x2 = [i/2 for i in range(100)] # print(x2) #生成器表达式 # x = [i*i for i in y] # print(x)…
迭代器 可迭代协议和迭代器协议 可迭代协议 只要含有__iter__方法的对象都是可迭代的 迭代器协议 内部含有__next__和__iter__方法的就是迭代器 关系 1.可以被for循环的都是可迭代的 2.可迭代的内部都有__iter__函数 3.只要是迭代器,一定可迭代 4.可迭代的对象使用__iter__方法就可以得到一个迭代器 5.迭代器中的__next__方法可以一个一个的获取值 例子 判断是否是可迭代类型 可以被for循环的类型都有__iter__()函数 dir()函数可以返回类…
1.函数进阶 1.1.名称空间 又名name space, 顾名思义就是存放名字的地方,存什么名字呢?举例说明,若变量x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方 名称空间共3种,分别如下 locals: 是函数内的名称空间,包括局部变量和形参 globals: 全局变量,函数定义所在模块的名字空间 builtins: 内置模块的名字空间 1.2.作用域 全局范围:全局存活,全局有效 局部范围:临时存活,局部有效 查看作用域方法 globals(),lo…
一,可迭代的&可迭代对象 1.一个一个的取值就是可迭代的   iterable#str list tuple set dict#可迭代的 ——对应的标志 __iter__ 2.判断一个变量是不是一个可迭代的 # print('__iter__' in dir(list))# print('__iter__' in dir([1,2,3])) 3.可迭代协议——凡是可迭代的内部都有一个__iter__方法 二,迭代器 1.将可迭代的转化成迭代器 #!/usr/bin/env python #_*_…
一.生成器的两种形式  1.生成器函数的应用 # def cloth(): # for i in range(100): # yield '衣服%s'%i # # g = cloth() # for i in g: # print(i) # for i in range(100): # print(g.__next__()) # # for i in range(50): # print(g.__next__()) 工厂做衣服 #监听文件末尾追加的例子 # def tail(): # f = o…
返回目录 本篇索引 (1)闭包 (2)装饰器 (3)生成器 (4)协程 (1)闭包 闭包(closure)是很多现代编程语言都有的特点,像C++.Java.JavaScript等都实现或部分实现了闭包功能,很多高级应用都会依靠闭包实现. 一般专业文献上对闭包的定义都比较拗口,比如:“将组成函数的语句和这些语句的执行环境打包在一起时,得到的对象称为闭包.” 其实,简单来说,你可以将闭包看成是一个轻载的类,这个类只有一个函数方法,并且只有为数不多的几个成员变量. 闭包的优点是:实现起来比类稍微轻巧一…
如何使用生成器函数实现可迭代对象 问题举例: 实现一个可迭代对象的类,它能迭代出给定范围内 的所有素数: pn = PrimeNumbers(1, 30) for x in pn: print(x) 输出结果: 2 3 5 7 11 13 17 19 23 29 解决思路 将该类的__iter__方法实现成生成器函数,每次用yield返回一个素数 代码 from collections.abc import Iterable class PrimeNumbers(Iterable): def _…
python 全栈开发 1.生成器函数 2.推导式 3.生成器表达式 一.生成器函数 1.生成器: 生成器的本质就是迭代器 (1)生成器的特点和迭代器一样.取值方式和迭代器一样(__next__(), send(): 给上一个yield传值). (2)生成器一般由生成器函数或者生成器表达式来创建 (3)其实就是手写的迭代器 2.生成器函数: (1)和普通函数没有区别. 里面有yield的函数就是生成器函数. (2)生成器函数在执行的时候. 默认不会执行函数体. 返回生成器 (3)通过生成器的__…
一.今日主要内容总览(重点) 1.生成器(目的:帮助我们创建对象) (1)生成器的本质就是迭代器 (2)一个一个的创建对象 (3)创建生成器的方式: 1.生成器函数 2.通过生成器表达式来获取生成器 3.类型转换(看不到) 2.生成器函数(重点) (1)生成器函数中包含 yield关键字,返回数据和return差不多 return会立即结束和这个函数的执行 yield 可以分段的执行一个函数 (2)大坑(五星重点): 生成器函数在执行的时候返回生成器,而不是直接执行次函数 (3)能向下执行的两个…
本节的内容,是建立在iterator遍历器知识的基础上.所以希望还没有看上一节的内容的话,最好还是看一看,当然你如果熟悉iterator就没有那个必要了. 既然你都看到这里来了,就咱们就接着往下讲... 声明Generator函数 我们要学习的这个新函数叫做:Generator函数,又称生成器函数,是ES6的一个重要的新特性. 我们来看看这个函数张什么模样: //声明一个Hello的Generator函数 function* Hello(name) { yield `hello ${name}`…
系列文章 -- ES6笔记系列 接触过Ajax请求的会遇到过异步调用的问题,为了保证调用顺序的正确性,一般我们会在回调函数中调用,也有用到一些新的解决方案如Promise相关的技术. 在异步编程中,还有一种常用的解决方案,它就是Generator生成器函数.顾名思义,它是一个生成器,它也是一个状态机,内部拥有值及相关的状态,生成器返回一个迭代器Iterator对象,我们可以通过这个迭代器,手动地遍历相关的值.状态,保证正确的执行顺序. 一.简单使用 1. 声明 Generator的声明方式类似一…
1.1迭代器 什么是迭代器: 迭代器是一个可以记住遍历的位置对象 迭代器对象从集合的第一个元素元素开始访问,直到所有元素被访问完结束,迭代器只能往前不会后退. 迭代器有两个基本方法:iter ,next 方法 内置函数iter(),next()  本质上都是用的对象.__iter__(),__next__()的方法 内置函数 iter(iterable),表示把可迭代对象 变成迭代器(iterator) 内置函数next(iterator) ,表示查看下一次迭代的值(当然也可以用 iterato…
一.什么是生成器函数(generator function)? 生成器函数是ES6的新特性之一,它是一个在执行时能中途暂时退出,后面重新调用又能重新进入继续执行的一种函数. 并且在函数内定义的变量的所有状态不受中途退出的影响. 二.语法 声明方式: function* 函数名([参数1[, 参数2[, ... 参数n]]]) { JS语句 } 调用说明: 1) 调用生成器对象时会返回一个生成器的迭代器 2) 该迭代器中有一个next()方法,它返回一个包含value和done的对象 3) 每次调…
前面的话 前面的函数系列中介绍了函数的基础用法.从本文开始,将介绍javascript函数进阶系列,本文将详细介绍高阶函数 定义 高阶函数(higher-order function)指操作函数的函数,一般地,有以下两种情况 1.函数可以作为参数被传递 2.函数可以作为返回值输出 javascript中的函数显然满足高阶函数的条件,在实际开发中,无论是将函数当作参数传递,还是让函数的执行结果返回另外一个函数,这两种情形都有很多应用场景.下面将对这两种情况进行详细介绍 参数传递 把函数当作参数传递…
生成器函数或生成器方法中包含了一个yield表达式.调用生成器函数时,会返回一个迭代子,值从迭代子中每次提取一个(通过调用其__next__()方法).每次调用__next__()时,生成器函数的yield表达式的值(如果未指定就是None)都会返回.如果生成器函数结束或执行一个return,就产生StopIteration异常. 上面的说法有点官方,下边是一些个人的理解: 1.当一个函数中包含有yield表达式时,在调用这个调用这个函数时,函数的代码并不会运行,而是返回一个迭代子,或者说是一个…
生成器函数使用function*声明. 在生成器函数内部,有一种类似return的语法:关键字yield.二者的区别是,普通函数只可以return一次,而生成器函数可以yield多次(当然也可以只yield一次).在生成器的执行过程中,遇到yield表达式立即暂停,后续可恢复执行状态. 1.next方法的参数 yield语句本身没有返回值,或者说总是返回undefined. function* foo(x){ var y=2*(yield(x+1)); var z=yield(y/3); ret…
迭代器和生成器 迭代和可迭代 什么是迭代(iteration)? 如果给定一个list或tuple,我们要想访问其中的某个元素,我们可以通过下标来,如果我们想要访问所有的元素,那我们可以用for循环来遍历这个list或者tuple,而这种遍历我们就叫做迭代. 可迭代(iterable)? 其实你已经知道,不是所有的数据类型都是可迭代的.那么可迭代的数据类型都有什么特点呢? print(dir([1,2])) print(dir((2,3))) print(dir({1:2})) print(di…
函数进阶 1.函数命名空间和作用域 命名空间一共分为三种: 全局命名空间 局部命名空间 内置命名空间 *内置命名空间中存放了python解释器为我们提供的名字:input , print , str , list , tuple... 三种命名空间之间的加载与取值顺序: 加载顺序:内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载) 取值顺序: 在局部调用:局部命名空间->全局命名空间->内置命名空间 在全局调用:全…
生成器: 生成器的本质就是迭代器 生成器一般由生成器函数或者生成器表达式来创建,其实就是手写的迭代器 def func(): print('abc') yield 222 #由于函数中有了yield ret = func() print(ret) #我们执行函数的时候实际上是获取生成器 结果: <generator object func at 0x10567ff68> 这个叫func的生成器的内存地址0x10567ff68 在Python中可以通过三种方式来获取生成器: 1.通过生成器函数…
函数进阶 1.函数作为变量 a=123 name="gao" nums=[1,2,3] data=nums#指向同一个内存地址 #查看内存地址篇章 def func(): print(123) func() 1.1函数名作为变量名使用 def func(): print("nice") v1=func#v1指向func函数的内存地址 v1()#执行内存中存放的代码 func() 1.2函数的默认返回值 def func(): print("nice&quo…
生成器函数 ''' yield类似于return 相同: 都返回出去一个值 不同: yield每次返回时, 会记录当前执行的位置 等下次调用生成器, 会从该位置向下走 return 直接终止函数 ''' # 2. 生成器函数 def mygen(): print('one') yield 1 print('two') yield 2 print('three') yield 3 # 创建生成器对象 gen = mygen() # 使用next res = next(gen) ''' 首先初始化生…
先看一个栗子: # -*- coding:UTF-8 -*- __autor__ = 'zhouli' __date__ = '2018/12/6 21:08' # 生成器函数,函数里只要有yield关键字 def gen_func(): yield 1 def func(): return 1 if __name__ == "__main__": gen = gen_func() re = func() pass 生成器函数这个对象是是什么时候产生的呢?是python编译字节码的时候…