1.迭代器(Iterator)

迭代器是访问集合元素的一种方式。有下面特点:

1)每次调用__next__()方法只访问一个元素,而且不能后退,便于循环比较大的数据集合,节省内存;(当容器中没有可访问的元素后,next()方法将会抛出一个StopIteration异常终止迭代器)

2)只能从头到尾访问,不能随机访问某个值;

3)迭代器提供了一个统一的访问集合的接口,只要定义了iter()方法对象,就可以使用迭代器访问。

迭代器使用:

lis=['a','b','c','d']
a=iter(lis)
print(a.__next__())
print(a.__next__())
print(a.__next__())
print(a.__next__())
print(a.__next__()) #没有元素获取,导致StopIteration报错 #运行结果
a
b
c
d
Traceback (most recent call last):
File "F:/Python/pythoncode/s12/study/study5.py", line , in <module>
print(a.__next__())
StopIteration

使用for循环访问迭代器:

lis=['a','b','c','d']
a=iter(lis)
for st in a:
print(st) #运行结果
a
b
c
d

2.生成器(Generator)

一个调用返回迭代器的函数,就叫做生成器。函数中包含yield语法,这个函数就会变成生成器。

1)生成器表达式

用来生成有规律的生成器

格式:generator_name=('生成规则’ for i range(num) if 'i的条件‘)

 a=('a' for i in range() if i%)
b=(i+ for i in range())
print(a,type(a))
print(b,type(b))
print(b.__next__())
print(b.__next__())
print(b.__next__())
print(b.__next__())
print(b.__next__()) #运行结果
<generator object <genexpr> at 0x00F9CAE0> <class 'generator'>
<generator object <genexpr> at 0x00F9CC90> <class 'generator'>

生成式表达式

2)yield创建生成器

def fun_ex(a):
yield 1
re=fun_ex(2)
print(re.__next__(),type(re)) #运行结果
1 <class 'generator'>

3)生成器实现单线程的异步并发效果

def gen_ex(a):
while a>0:
a-=1
yield 1
print('hello')
re=gen_ex(2)
print(re.__next__())
print('中断打印')
print(re.__next__()) #运行结果
1
中断打印
hello
1

生成器是每次调用返回一次数据,所以可以在中途插入其他操作,形成一种异步效果,如例子中先来个“中断打印”

4)生成器中的send()方法使用

def gen_ex(a):
while a>0:
a-=1
b=yield
print(b)
re=gen_ex(5)
re.__next__()
re.send(5)
print('中断打印')
re.send(6) #运行结果
5
中断打印
6

send()可以给yield传参数,yield作为接收。这里yield的运行情况和return在函数上起的作用有些区别。

如生成器使用一个__next__()方法,它会运行到yield这行,而停止。但是再使用send()方法,函数直接从yield这行开始运行,并赋值给b,然后运行下去循环一次到yield这行停止。

3.装饰器

装饰器的作用在于,对已有函数,在不改变它内在封装上扩展它的功能。如:

def start(func):
def inner(arg):
print('how are you!')
func(arg)
return inner @start
def user(arg):
print('hello %s'%arg) # user=start(user) #这条功能和@start一样
user('olive') #运行结果
how are you!
hello olive

上例中,start就是实现装饰器功能,@start和user=start(user)一样的功能效果,@start更具有装饰器特征。

上面是传单参数装饰器,也可以多参数或n参数,如:

 def start(func):
def inner(*args,**kwargs):
print('how are you!')
func(*args,**kwargs)
return inner @start
def user(*args,**kwargs):
print('hello ' ) user('olive','a','b') #运行结果
how are you!
hello

多参数装饰器

装饰器可以写一个装饰器框架,把装饰器当函数调用。

Python 迭代器与生成器及装饰器的更多相关文章

  1. python迭代器、生成器、装饰器

    1 迭代器 这里我们先来回顾一下什么是可迭代对象(Iterable)? 可以直接作用于for循环的对象统称为可迭代对象,即Iterable. # 一是集合数据类型,如list.tuple.dict.s ...

  2. python迭代器,生成器,装饰器,context模块

    迭代器iteration 是访问集合元素的一种方式,只能往前不能往后迭代器的特点:1,访问者不需要关注迭代器内部结构,只需通过next()不断取下一个内容2,访问不能回退3,循环较大数据集合时,省内存 ...

  3. python 迭代器、生成器、装饰器

    一,迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问完结束.迭代器只能往前不会后退. 特点: 访问者不需要关心迭代器内部的结构,仅需通过next()方 ...

  4. python的迭代器、生成器、装饰器

    迭代器.生成器.装饰器 在这个实验里我们学习迭代器.生成器.装饰器有关知识. 知识点 迭代器 生成器 生成器表达式 闭包 装饰器 实验步骤 1. 迭代器 Python 迭代器(Iterators)对象 ...

  5. python is、==区别;with;gil;python中tuple和list的区别;Python 中的迭代器、生成器、装饰器

    1. is 比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同 == 比较的是两个对象的内容是否相等 2. with语句时用于对try except finally 的优 ...

  6. Python 闭包、迭代器、生成器、装饰器

    Python 闭包.迭代器.生成器.装饰器 一.闭包 闭包:闭包就是内层函数对外层函数局部变量的引用. def func(): a = "哈哈" def func2(): prin ...

  7. Python3基础教程(十六)—— 迭代器、生成器、装饰器

    在这个实验里我们学习迭代器.生成器.装饰器有关知识. 这几个概念是 Python 中不容易理解透彻的概念,务必把所有的实验代码都完整的输入并理解清楚其中每一行的意思. 迭代器 Python 迭代器(I ...

  8. python基础之迭代器、生成器、装饰器

    一.列表生成式 a = [0,1,2,3,4,5,6,7,8,9] b = [] for i in a: b.append(i+1) print(b) a = b print(a) --------- ...

  9. python基础知识7——迭代器,生成器,装饰器

    迭代器 1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器 ...

随机推荐

  1. easyui datagrid 绑定从后台得到的复杂的特殊数据结构

    由于项目需要,从后台得到的数据统一为了类似{state:xxx,data:xxx,message:xxx}类型 但是easyui datagrid却只认{total:xxx,rows:xxx}...所 ...

  2. JavaScript学习笔记之CSS-DOM

    HTML负责结构层,网页的结构层由HTML或者XHTML之类的标记语言负责构建 CSS负责表示层,描述页面内容应该如何呈现. JavaScript负责行为层,负责内容应该如何响应事件这一问题. 能利用 ...

  3. thinkphp url重写

    可以通过URL重写隐藏应用的入口文件index.php,下面是相关服务器的配置参考:大理石平台精度等级 [ Apache ] httpd.conf配置文件中加载了mod_rewrite.so模块 Al ...

  4. 帝国cms把文章加入到收藏夹代码

    内容模板加这个:<a href="[!--news.url--]e/member/fava/add/?classid=[!--classid--]&id=[!--id--]&q ...

  5. 好用的日期控件jeDate

    最近做公司后台系统关于仓库的一些东西,需要根据时间范围来导出一些数据,我们使用的后台框架是基于bs的,bs也有时间控件:bootstrap-datepicker是只能选择日期的, daterangep ...

  6. (转)简单的RPC java实现 .

    转:http://blog.csdn.net/jackliang55/article/details/7580563 我也承认,RPC的名声大噪之时是在2003年,那一个“冲击波”病毒(Blaster ...

  7. 8.RabbitMQ 消息传递Java对象

    通过消息服务器传递Java对象,Java类必须实现序列化接口,可以把Java对象转化为字节数组,从消费者或生产者传递到另外一个JVM中,一定需要两个JVM共享这个类,比如是UserInfo类.   1 ...

  8. Nutz框架的优点

    轻量级 -- jar文件共约1Mb -- 针对JDBC的薄封装,无缓存. 全面 -- 提供了Dao(ORM, SQL管理),Ioc, Aop, Mvc, Json解析等必要功能. 灵活 -- 各个部分 ...

  9. java时间工具类,时间相互转换

    /* * @author XueWeiWei * @date 2019/8/26 16:22 */ package com.nps.utils; import java.text.ParseExcep ...

  10. sklearn中模型评估和预测

    一.模型验证方法如下: 通过交叉验证得分:model_sleection.cross_val_score(estimator,X) 对每个输入数据点产生交叉验证估计:model_selection.c ...