Python的迭代器、 生成器和修饰器


1、 迭代器是访问集合元素的一种方式,从第一个到最后,只许前进不许后退。

优点:不要求事先准备好整个迭代过程中的所有元素,仅仅在迭代到某个元素时才计算该元素,而在这之前或者之后,元素可以不存在或被销毁。

特点:

  • 访问者是不需要关心迭代器内部的结构,仅需要通过next()方法不断去取下一个内容。
  • 不能随机访问集合中的某个值,只能从头到尾依次访问。
  • 访问到一半时不能往回退
  • 便于循环比较大的数据集合,节省内存
 names = iter(['alex','jack','list'])
print(names)
print(names.__next__())
print(names.__next__())
print(names.__next__())

结果:

<list_iterator object at 0x005CC410>

alex

jack

list

2、  生成器

定义:

  一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会发生生成器。

作用:

  这个yield的主要效果,就是可以使函数中断,并保存中断状态,中断后,代码可以继续往下执行,过一段时间还可以再重新调用这个函数,从上次yield的下一句开始执行。

例1:

 def cash_money(amount):
while amount > 0:
amount -= 100
yield 100
print("取钱啦again")
atm = cash_money(500)
print(type(atm))
print(atm.__next__())
print(atm.__next__())
print("go to 相声")
print(atm.__next__())

结果:

<class 'generator'>

100

取钱啦again

100

go to 相声

取钱啦again

100

一共五百块,先去两百块钱,然后去听相声,之后在回来取100 。 一个循环我可以先跳出去做其他事,然后再回来继续做这件事。

例2:用yield实现单线程中的异步

 import time
def consumer(name):
print("%s 准备吃包子啦!"%name)
while True:
baozi=yield #接收别人发送给他的值
print("包子%s 来了,被%s吃了!" % (baozi,name)) def producer(name):
c = consumer('A')
c2 = consumer('B')
c.__next__()
c2.__next__()
print("准备做包子啦")
for i in range(10):
time.sleep(1)
print("I finished two baozi!")
c.send('Alex')#通过send给yield发送i
c2.send(i) producer("Young")

可以设置断点,单步运行查看程序运行的过程

3、  装饰器

开放封闭原则:已实现的功能代码不允许被修改,但是可以被扩展

开放:对扩展开放

封闭:以实现的功能代码块

没有使用装饰器

 def login(func):
print("登录验证.")
return func def home(name):
print("Welcome [%s] to home page"%name)
def tv(name):
print("Welcome [%s] to tv page"%name)
def movie(name):
print("Welcome [%s] to movie page"%name)
tv = login(tv)
tv("Young")

结果:

登录验证.

Welcome [Young] to tv page

使用装饰器:

 def login(func):
def inner(arg):
print("登录验证.")
func(arg)
return inner def home(name):
print("Welcome [%s] to home page"%name) @login # 程序一执行就相当于执行tv = login(tv)
def tv(name):
print("Welcome [%s] to tv page"%name)
def movie(name):
print("Welcome [%s] to movie page"%name)
#tv = login(tv)#相当于@login
tv("Young")

返回值

 def login(func):
def inner(*args,**kwagrs):
print("登录验证.")
return func(*args,**kwagrs)
return inner def home(name):
print("Welcome [%s] to home page"%name) @login # 程序一执行就相当于执行tv = login(tv)
def tv(name,passwd=123):
print("Welcome [%s] to tv page"%name)
return 4
@login
def movie(name):
print("Welcome [%s] to movie page"%name)
#tv = login(tv)#相当于@login
ret = tv("Young",passwd=123)
print(ret)
movie("Young")

以下部分一是对上述内容中装饰器的解释和补充,另一个视为下面的复杂应用做铺垫。

 def w1(main_func):
def outer(request,kargs):
print('before')
main_func(request,kargs)
print('after')
return outer
@w1
def show():
pass

解析:

首先开始执行@w1,然后执行def  w1(main_func):。

对于def  w1(main_func): 主要包括两部分内容 def outer(request,kargs): 和 return outer 两个部分,对于def outer(request,kargs): 只是函数定义,没有调用,所以不会执行函数内容;然后执行return outer 返回outer。然后show函数被重新定义,即w1(show)的返回值outer = 新 show 。

以下内容详细看看(作为理解即可,很多时候用不到):

 def Filter(before_func,after_func):
def outer(main_func):
def wrapper(request,kargs):
before_func(request,kargs)
main_func(request,kargs)
after_func(request,kargs)
return wrapper
return outer @Filter(before,after)
def Index(request,kargs):
print('Index') 
  1. 执行Filter(before,after),注意是Filter而不是@,而Filter()的内容是def outer()和return outer(注:这里outer并没有被调用,所以函数的内容并没有执行)
  2. 因为1、  的返回值是outer ,所以开始执行@outer,@outer会将index作为参数,开始执行到def  outer():(但是wrapper函数内容并没有执行),接下来执行return wrapper ,即返回值是wrapper
  3. 此时新的Insex = wrapper,   最后执行的Index=新Index

Python 从零学起(纯基础) 笔记 之 迭代器、生成器和修饰器的更多相关文章

  1. Python学习笔记——基础篇【第四周】——迭代器&生成器、装饰器、递归、算法、正则表达式

    目录 1.迭代器&生成器 2.装饰器 a.基本装饰器 b.多参数装饰器 3.递归 4.算法基础:二分查找.二维数组转换 5.正则表达式 6.常用模块学习 #作业:计算器开发 a.实现加减成熟及 ...

  2. Python3基础笔记_迭代器

    # Python3 迭代器与生成器 import sys ''' 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开 ...

  3. python全栈开发从入门到放弃之迭代器生成器

    1.python中的for循环 l = [1,2,3,4,5,6] for i in l: #根据索引取值 print(i) 输出结果: 1 2 3 4 5 6 2.iterable  可迭代的 可迭 ...

  4. Python四大神兽(迭代器&生成器&闭包&装饰器)

    一.迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式.. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不 ...

  5. Python 从零学起(纯基础) 笔记 (二)

    Day02 自学笔记  1.  对于Python,一切事物都是对象,对象基于类创建,对象具有的功能去类里找 name = ‘Young’       -   对象 Li1 = [11,22,33]   ...

  6. Python 从零学起(纯基础) 笔记 之 深浅拷贝

    深浅拷贝 1. import  copy#浅拷贝copy.copy()#深拷贝copy.deepcopy()#赋值 = 2.   对于数字和字符串而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个 ...

  7. Python 从零学起(纯基础) 笔记(一)

    作者身份:初学Python,菜鸟 ================================================= 1. 主提示符和次提示符  >>> 主提示符   ...

  8. Python 从零学起(纯基础) 笔记 之 collection系列

    Collection系列  1.  计数器(Counter) Counter是对字典类型的补充,用于追踪值的出现次数   ps  具备字典所有功能 + 自己的功能 Counter import col ...

  9. python学习笔记(5)--迭代器,生成器,装饰器,常用模块,序列化

    生成器 在Python中,一边循环一边计算的机制,称为生成器:generator. 如: >>> g = (x * x for xin range(10)) >>> ...

随机推荐

  1. MS SQL 错误:The operation could not be performed because OLE DB provider "SQLNCLI10" for linked server "test" was unable to begin a distributed transaction.

       一同事在测试服务器(系统:Windows 2008 R2 Standard 数据库:SQL SERVER 2008 R2)通过链接服务器test使用分布式事务测试时出错,出错信息如下: set ...

  2. SpringMVC 处理异常的4种方式

    springmvc处理异常有三种方式: 1.在一个controller中定义一个方法,用@ExceptionHandler注解标注.(优先级最高) @ExceptionHandler public M ...

  3. java服务器端编程

    由于要做手机端安卓程序,所以使用java来开发.后来又看了javaweb,觉得java还是很不错的,功能很强大,可以做很多事,最重要的是资源非常丰富,有很多开源的库框架之类. 最近用java做一个服务 ...

  4. Android入门笔记(一)

    第一部分,Android开发环境的搭建 1.去http://www.oracle.com/technetwork/java/javase/downloads/index.html下载最新版本jdk并安 ...

  5. POJ1151Atlantis 矩形面积并[线段树 离散化 扫描线]

    Atlantis Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 21734   Accepted: 8179 Descrip ...

  6. 第2章 Linux系统安装(1)_VMware安装与使用

    1. VMware虚拟机安装与使用 1.1 VMware简介 VMware是一款虚拟PC的软件,可以在现有的操作系统上虚拟出一个新的硬件环境,相当于模拟出一台新的PC,以此来实现一台机器上真正同时运行 ...

  7. 2016第二届陕西省网络空间安全大赛WriteUp

    2016年5月28号(正式比赛) 有选择题和实践题,俩队员在弄选择题时,我去拿了web1的一血. 0x01 web 是一道代码审计题,发包,返回了源代码: <?php if (isset($_G ...

  8. 导出本地和远程SVN项目, Export remote SVN repository

    在有服务器控制权的情况下, 源服务器上 sudo svnadmin dump ironbank/ > ~/ironbank.svn.dump 在目的服务器上 sudo svnadmin crea ...

  9. 1089 最长回文子串 V2(Manacher算法)

    1089 最长回文子串 V2(Manacher算法) 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 回文串是指aba.abba.cccbccc.aaaa ...

  10. IIS部署站点相关经验总结

    IIS部署站点相关经验总结 1.IIS和.net4.0安装是有先后顺序的,应该先安装.net framework 4.0,再安装IIS.如果按相反顺序安装的话,IIS中看不到4.0相关的东西,那么只能 ...