一、迭代器

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

特点:

  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. redis实现消息队列&发布/订阅模式使用

    在项目中用到了redis作为缓存,再学习了ActiveMq之后想着用redis实现简单的消息队列,下面做记录.   Redis的列表类型键可以用来实现队列,并且支持阻塞式读取,可以很容易的实现一个高性 ...

  2. 重装系统,出现:Units specified don't exist SHSUCDX can't install

    重装系统,出现:Units specified don't exist SHSUCDX can't install 解决方案1: 首先是你的硬盘分区不对吧 先用PQ格成ntfs或far32 进PE把C ...

  3. springboot系列十四、自定义实现starter

    一.starter的作用 当我们实现了一个组建,希望尽可能降低它的介入成本,一般的组建写好了,只要添加spring扫描路径加载spring就能发挥作用.有个更简单的方式扫描路径都不用加,直接引入jar ...

  4. ulimit -n 修改

    Linux系统里打开文件描述符的最大值,一般缺省值是1024,对一台繁忙的服务器来说,这个值偏小,所以有必要重新设置linux系统里打开文件描述符的最大值.那么应该在哪里设置呢? [root@loca ...

  5. QML C++插件dll引用

    插件的创建非常简单,但是它可以复用,并且为不同的应用程序扩展类型.使用创建的插件是非常灵活的解决方案.关于插件一个很好的例子见QmlBook-In-Chinese 中最后一章介绍的例子. 本文主要备忘 ...

  6. dellR720服务器设置光盘引导流程安装cenos7

    1.开机,按F10,进入系统引导界面,选择加载系统选项,并选择redhat 7.1选项 系统提示不支持,选择仍然继续,根据提示设置BIOS设置启动,重启 2.根据提示按F11进入BIOS启动设置,选择 ...

  7. MySQL中adddate学习

    -- 修改时间:ADDDATE(date,INTERVAL expr unit) -- 含义:date时间,expr 表达式值,unit表达式对应的时间单位 -- unit : SECOND,MINU ...

  8. Weex学习资料整合

    1.weex weex文档:http://weex.apache.org/cn/guide/index.html Weex Ui awesome-weex WEEX免费视频教程-从入门到放肆 (共17 ...

  9. Android:Service

    Android Service: http://www.apkbus.com/android-15649-1-1.html android service 的各种用法(IPC.AIDL): http: ...

  10. Android动态控制状态栏显示和隐藏

    记得之前有朋友在留言里让我写一篇关于沉浸式状态栏的文章,正巧我确实有这个打算,那么本篇就给大家带来一次沉浸式状态栏的微技巧讲解. 其实说到沉浸式状态栏这个名字我也是感到很无奈,真不知道这种叫法是谁先发 ...