一、迭代器

迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合

特点:

  1. 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
  2. 不能随机访问集合中的某个值 ,只能从头到尾依次访问
  3. 访问到一半时不能往回退
  4. 便于循环比较大的数据集合,节省内存

生成一个迭代器:

 >>> a= iter([,,,,])
>>> a
<list_iterator object at 0x0044ADF0> >>> a.__next__() >>> a.__next__() >>> a.__next__()

二、生成器

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

代码:

 #!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
# @time : 2017/4/22 1:00
# @author : huange
# @version : 1.1
# @file : test2.py
# @Software: PyCharm
''' def out_money(totle): while totle > 0: totle -= 1 yield 1 # yield 返回一个值 ATM = out_money(3) print("取到钱 %s 万" % ATM.__next__()) print("花掉花掉!") print("取到钱 %s 万" % ATM.__next__()) print("花掉花掉!") print("取到钱 %s 万" % ATM.__next__()) print("花掉花掉!") print("取到钱 %s 万" % ATM.__next__()) # 到这时钱就取没了,再取就报错了 print("取到钱 %s 万" % ATM.__next__())

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

可以通过yield实现在单线程的情况下实现并发运算效果

 #!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
# @time : 2017/4/22 1:00
# @author : huange
# @version : 1.1
# @file : test2.py
# @Software: PyCharm
''' import time def consumer(name):
print("%s 准备吃包子了!" %name)
while True:
baozi = yield # yield 通过 send()方法接收值
print("包子[%s]来了,被[%s]吃了" %(baozi,name)) def producer(name):
c1 = consumer('A')
c2 = consumer('B')
c3 = consumer('C') c1.__next__()
c2.__next__()
c3.__next__() print("%s 开始准备做包子了!" % name) for i in range(10):
time.sleep(1)
print('做了3个包子')
c1.send(i)
c2.send(i)
c3.send(i) producer('hh')

三、装饰器

 #!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
# @time : 2017/4/24 20:29
# @author : huange
# @version : 1.1
# @file : 装饰器.py
# @Software: PyCharm
''' # @login内部会执行一下操作:
# 1.执行login函数,并将 @login 下面的 函数 作为login函数的参数,即:@login 等价于 login(movie)
# 2.•将执行完的 login 函数返回值赋值给@login下面的函数的函数名 def login(func):
def inner(*args,**kwargs):
print("login success...")
return func(*args,**kwargs)
return inner def home():
print("welcome to Home...") @login
def movie(name,passwd):
print("welcome [%s] [%s] to movie...." % (name,passwd)) @login
def music(name):
print("welcome [%s] to music..." % name) movie('huhuan','')
music('huhuan')
home()

如上所示:被装饰的函数带有不同个数的参数,因此,装饰器需要用到动态参数!

一个函数可以被多个装饰器装饰:

 #!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
# @time : 2017/4/24 20:29
# @author : huange
# @version : 1.1
# @file : 装饰器.py
# @Software: PyCharm
'''
# 验证登陆
def login(func):
def inner(*args,**kwargs):
print("login success...")
return func(*args,**kwargs)
return inner # 验证是否是会员用户
def member(func):
def inner(*args,**kwargs):
print("welcome member...")
return func(*args,**kwargs)
return inner def home():
print("welcome to Home...") # @login内部会执行一下操作:
# 1.执行login函数,并将 @login 下面的 函数 作为login函数的参数,即:@login 等价于 login(movie)
# 2.•将执行完的 login 函数返回值赋值给@login下面的函数的函数名
@login
@member
def movie(name,passwd):
print("welcome [%s] [%s] to movie...." % (name,passwd)) @member
@login
def music(name):
print("welcome [%s] to music..." % name) movie('huhuan','')
music('huhuan')
home()

装饰器中带有参数:

 # 认证函数
def auth(request,kargs):
print("认证成功!")
# 日志函数
def log(request,kargs):
print("日志添加成功")
# 装饰器函数。接收两个参数,这两个参数应该是某个函数的名字。
def Filter(auth_func,log_func):
# 第一层封装,f1函数实际上被传递给了main_fuc这个参数
def outer(main_func):
# 第二层封装,auth和log函数的参数值被传递到了这里
def wrapper(request,kargs):
# 下面代码的判断逻辑不重要,重要的是参数的引用和返回值
before_result = auth(request,kargs)
if(before_result != None):
return before_result; main_result = main_func(request,kargs) #需要装饰的函数
if(main_result != None):
return main_result; after_result = log(request,kargs)
if(after_result != None):
return after_result; return wrapper
return outer
# 注意了,这里的装饰器函数有参数,它的意思是先执行filter函数
# 然后将filter函数的返回值作为装饰器函数的名字返回到这里,所以,
# 其实这里,Filter(auth,log) = outer , @Filter(auth,log) = @outer
@Filter(auth,log)
def f1(name,age): print("%s 正在连接业务部门1数据接口......"%name) # 调用方法
f1("jack",18) 结果:
认证成功!
jack 正在连接业务部门1数据接口......
日志添加成功

Python学习——迭代器&生成器&装饰器的更多相关文章

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

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

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

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

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

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

  4. Python之迭代器、装饰器、软件开发规范

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

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

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

  6. python学习之day5,装饰器,生成器,迭代器,json,pickle

    1.装饰器 import os import time def auth(type): def timeer(func): def inner(*args,**kwargs): start = tim ...

  7. 5.python(迭代器,装饰器,生成器,基本算法,正则)

    一,迭代器 1.迭代器  (1)迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问完结束.迭代器只能往前不会后退.  (2)对于原生支持随机访问的数据结构(如t ...

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

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

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

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

随机推荐

  1. JS结合a标签的使用

    a标签可以当作按钮使用,也可以当作连接. <a href=javascript:test(5)>弹出5</a>    会直接调用JS函数(注意中间没引号) <a href ...

  2. ROS 时间同步问题

    0. 问题 两台ubuntu主机无法与一台debian主机使用分布式通信,摄像头发出的话题机器人收不到,考虑是时间同步的问题. 也可能是系统不统一的问题; 今天在家实验了一下,时间差6min,照样可以 ...

  3. SLAM学习资料汇总

    转自 http://www.cnblogs.com/wenhust/   书籍: 1.必读经典 Thrun S, Burgard W, Fox D. <Probabilistic robotic ...

  4. .NET中制做对象的副本(二)继承对象之间的数据拷贝

    定义学生 /// <summary> /// 学生信息 /// </summary> public class Student { /// <summary> // ...

  5. 搭建RDA交叉编译器

    apt-get install subversion //安装版本控制系统,便于管理文件目录 apt-get install make atp-get install gcc =======set e ...

  6. git安装及基础用法

    1.安装GitGit-2.9.3-64-bit.exe 2.打开Git Bash,设置用户名,Email $ git config --global user.name "Your Name ...

  7. Linux关闭防火墙,开放端口

    Centos/redhat系统: 开启防火墙 #systemctl start firewalld.service 停止firewall #systemctl stop firewalld.servi ...

  8. 浅谈C语言内存管理、内存泄露、堆栈

    1.内存分配区间:         对于一个C语言程序而言,内存空间主要由五个部分组成:代码段(.text).数据段(.data).静态区(.BSS).堆和栈组成.         BSS段:BSS段 ...

  9. python安装虚拟环境pipenv

    python里如果多个多个项目同时引用包,就会涉及到包版本的问题,包不同版本管理的问题可以用虚拟环境来管理, 创建虚拟环境,这里是用官方推荐的pipenv来创建 先用pip命令行安装pipenv pi ...

  10. poj2739 poj2100 尺取法基础(二)

    都是很简单的题目 poj2739素数打表+单点推移 #include<iostream> #include<cstring> #include<cstdio> us ...