一,迭代器

迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问完结束。迭代器只能往前不会后退.

特点:

  1. 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容

  2. 不能随机访问集合中的某个值 ,只能从头到尾依次访问

  3. 访问到一半时不能往回退

  4. 便于循环比较大的数据集合,节省内存

迭代器提供两种方法:

(1)__iter__()返回迭代器对象本身

a = iter([1,2,3,4,5])
print(a)
# <list_iterator object at 0x101402630>
print(a.__next__())#输出 1 print(a.__next__())#输出 2 print(a.__next__())# 输出3 print(a.__next__())# 输出4 print(a.__next__())# 输出5 print(a.__next__()) #超过后就会报错

(2)__next__()返回迭代器的下一个元素

names = iter(['liu', 'yao', 'sb'])

print(names)

print(names.__next__())

print(names.__next__())

print('暂停')

print(names.__next__())

输出:
<list_iterator object at 0x0000000001199898>
liu
yao
暂停
sb

(3)for...in..方法

for使用了列表支持迭代器的性质,可以每次通过调用迭代器的next()方法,来遍历到列表中的值,直到遇到StopIteration的异常

li = [1, 2, 3, 4]

for i in li:
print(i)

二,生成器

定义:

  一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator);

  如果函数中包含yield语法,那这个函数就会变成生成器

  它基于yield指令,允许停止函数并立即返回结果

特点:

  在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行

def xrange():  #带yield为生成器函数
print(11)
yield 1 print(22)
yield 2 print(33)
yield 3 r = xrange() #仅获取到第一个生成器
#生成器的__next__方法
ret = r.__next__() #获取第一次
print(ret) ret = r.__next__()#记住上次执行的,进行寻找下一个yield,再进行执行。
print(ret) ret = r.__next__()#获取第三次,如果上面没有yield可执行就报错,
print(ret)

示例

def xrangs(n):
start = 0
while True:
if start > n:
return
yield start
start += 1 obj = xrangs(5)
n1 = obj.__next__()
n2 = obj.__next__()
n3 = obj.__next__()
n4 = obj.__next__()
n5 = obj.__next__()
n6 = obj.__next__()
print(n1,n2,n3,n4,n5,n6) 输出:
0 1 2 3 4 5

三,装饰器

装饰器就是把函数的名字传入进去, 在执行函数之前, 进行一些提前的处理.

装饰器本身就是一个函数, 将所装饰的函数, 作为一个参数传进来,

然后在执行这个函数之前, 进行一个处理,这就是装饰器. 所以和正常函数执行顺序是一样的..

例:如果一个公司有运维部,开发部,测试部,设计部,等,并且公司具有基础平台架构,为公司各个部门提供数据库调用,资料查看,监控等。

当这些部门想使用这些功能的时候,直接调用这些功能的接口就可以,如下:

######基础平台提供的功能------------

def 功能1()

    print ('功能1')

def 功能2()

    print ('功能2')

def 功能3()

    print ('功能3')

def 功能4()

    print ('功能4')

当运维部门调用的时候如下:

def 功能1()

def 功能2()

def 功能3()

当开发部门调用的时候如下:

def 功能1()

def 功能2()

def 功能3()

之后要为平台提供的所有功能添加验证机制,

基础平台提供如下功能接口:

  1.让各个部门修改自己的代码

  2.在每个部门实现的功能上加上代码

  3.把验证代码变成函数 在每个功能上加入

  4.为了追寻开放封闭原则

利用装饰器的功能实现

def login(func):

    def inner():

        # 验证1

        # 验证2

        # 验证3

        return func()

    return inner

@login

def 功能1():

    print '功能1'

@login

def 功能2():

    print '功能2'

@login

def 功能3():

    print '功能3'

@login

def 功能4():

    print '功能4'

当各个部门执行 def 功能的时候

def login(func):

    def inner():

        # 验证1

        return func()

    return inner

@login

def 功能1():

    print '功能1'

当调用功能1的时候 会先把功能1的函数名带入内存地址,之后会执行login函数,func为功能1,

之后inner会将功能1的参数带入等待执行inner的验证功能后,

会将参数交给func执行功能1的命令。

实例:

1)一个装饰器

#有参数的装饰器
def outer(func):
def inner(a1,a2):
print("")
# ret = func(a1,a2)
print("")
ret = func(a1,a2) #执行index函数
return ret
return inner @outer
def index(a1,a2):
print("非常复杂")
return a1 + a2 #只要函数应用装饰器,那么函数就被重新定义,重新定义为:装饰器的内层函数
index(1,2)

2)万能的装饰器

#万能的装饰器

def outer(func):
def inner(*arg,**kwargs):
print("")
# ret = func(a1,a2)
print("")
ret = func(*arg,**kwargs) #执行index函数
return ret
return inner @outer
# @outer
# 1、执行outer函数,将index作为参数传递
# 2、将outer的返回值,重新赋值给index def index(a1,a2):
print("非常复杂")
return a1 + a2 #只要函数应用装饰器,那么函数就被重新定义,重新定义为:装饰器的内层函数
index(1,2,)

3)多个装饰器

#两个装饰器

def outer_0(func):
def inner(*arg,**kwargs):
print("3.5")
ret = func(*arg,**kwargs)
return ret
return inner def outer(func):
def inner(*arg,**kwargs):
print("")
# ret = func(a1,a2)
print("")
ret = func(*arg,**kwargs) #执行index函数
return ret
return inner @outer_0
@outer
def index(a1,a2):
print("非常复杂")
return a1 + a2 #只要函数应用装饰器,那么函数就被重新定义,重新定义为:装饰器的内层函数
index(1,2,) @outer
def f1(a1,a2,a3):
print("f1")
return f1 f1(6,7,8)

python 迭代器、生成器、装饰器的更多相关文章

  1. Python 迭代器&生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发

    本节大纲 迭代器&生成器 装饰器  基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - ...

  2. 4.python迭代器生成器装饰器

    容器(container) 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中.通常这类数据结构把所有的元素存储在内存中 ...

  3. Python迭代器&生成器&装饰器

    1. 迭代器 1.1 可迭代对象(Iterator) 迭代器协议:某对象必须提供一个__next__()方法,执行方法要么返回迭代中的下一项,要么引起一个Stopiteration异常,以终止迭代(只 ...

  4. Python迭代器,生成器,装饰器

    迭代器 通常来讲从一个对象中依次取出数据,这个过程叫做遍历,这个手段称为迭代(重复执行某一段代码块,并将每一次迭代得到的结果作为下一次迭代的初始值). 可迭代对象(iterable):是指该对象可以被 ...

  5. Python(迭代器 生成器 装饰器 递归 斐波那契数列)

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

  6. Python基础-迭代器&生成器&装饰器

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 我现在有个需求,看 ...

  7. 迭代器/生成器/装饰器 /Json & pickle 数据序列化

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需 ...

  8. Day04 - Python 迭代器、装饰器、软件开发规范

    1. 列表生成式 实现对列表中每个数值都加一 第一种,使用for循环,取列表中的值,值加一后,添加到一空列表中,并将新列表赋值给原列表 >>> a = [0, 1, 2, 3, 4, ...

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

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

  10. python中的迭代器&&生成器&&装饰器

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

随机推荐

  1. Google将数十亿行代码储存在单一的源码库

    过去16年,Google使用一个中心化源码控制系统去管理一个日益庞大的单一共享源码库.它的代码库包含了约10亿个文件(有重复文件和分支)和 3500万行注解,86TB数据,900万唯一源文件中含有大约 ...

  2. [mysql] Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'loser.tank_admin.login_ip' which is not functionally dependent on columns in GROUP BY clause; this is

    执行SQL: SELECT login_name,login_ip,sex FROM tank_admin GROUP BY login_name ; 时抛出异常. Expression #2 of ...

  3. TP控制器(Controller)

    控制器的一些方法: Maincontroller.class.php文件: <?php namespace Home\Controller; use Think\Controller; clas ...

  4. [转]wireshark 实用过滤表达式(针对ip、协议、端口、长度和内容)

    首先说几个最常用的关键字,“eq” 和 “==”等同,可以使用 “and” 表示并且,“or”表示或者.“!" 和 "not” 都表示取反. 一.针对wireshark最常用的自然 ...

  5. UI-动画

    // ------------------UIImageView的动画------------------ // ------------------UIView的动画---------------- ...

  6. 战胜忧虑<1>——不要让忧郁侵入你的生活

    1.不要让忧郁侵入你的生活. 备注:忧郁:一种情绪与心理状态,指一个人呈现哀伤.心情低落的状况,绝望与沮丧为其特色. 解决方法:奥斯勒博士说的那样:用铁门把过去和未来隔断,生活在完全独立的今天. 现在 ...

  7. HAML学习

    来源:http://ningandjiao.iteye.com/blog/1772845 一个技术能够风靡,一定是有它的原因的,在熟悉之前,我们没有资格去对它做任何的判断. Haml 是一种简洁优美的 ...

  8. C语言每日一题之No.5

    总在想,但凡编程基础正常点,都不至于惨败到这个地步.也像大多数人毕业出来,新鲜的第一份工作,如果做得好还可以略有成就感,做得一般还有提升的空间,但至少不至于像我这样基本没基础的被鄙视得一塌糊涂,被外界 ...

  9. activiti自定义流程之Spring整合activiti-modeler5.16实例(八):完成个人任务

    注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建        (2)创建流程模型:activiti自定义流程之Spring ...

  10. J2EE学习中一些值得研究的开源项(转)

    这篇文章写在我研究J2SE.J2EE近三年后.前3年我研究了J2SE的Swing.Applet.Net.RMI.Collections. IO.JNI……研究了J2EE的JDBC.Sevlet.JSP ...