迭代器iteration

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

iter()生成迭代器
__next__()访问迭代器,可以迭代生成器

生成器(genertion)

yield
有yield的函数叫生成器,不能直接调用
必须要用__next__()等迭代器来访问,迭代器可以迭代一个集合,也可以迭代一个yield函数
yield可以传出消息__next__(),也可以传入消息send()
send()同时可以传给yield数据,也可以接受数据

生成器只能碰到yield跳出函数,不能使用return

def show_1():
print("1p")
yield
print("3p")
yield
print(show_1()) #<generator object show_1 at 0x000002A9682378E0>
show_P=show_1() #赋值保存地址
show_P.__next__()
show_P.__next__() 1p
3p
#yield传入传出数据
def show_2():
print("1P")
yield 100
print("3P")
n=yield
print("%dP"%n)
yield
show_P=show_2()
show_P.__next__()
show_P.__next__()
show_P.send(10) #传入10
#模拟range()
def Lrange(m=0,n,l=1):
count=m
while count < n:
yield count
count += l for i in Lrange(2,10,2):
print(i)

异步 串行

装饰器(decorator):

装饰器原理:
@w1的时候会做这么几件事情:
1,执行w1()
2,把修饰的函数show传入w1的形参
3,装饰器必须有返回值,返回值为了把原来的show函数封装到新的show函数
4,装饰器必做的一件事就是再嵌套一层函数,封装以前的函数

装饰器一:

def w1(func):
def outer():
print('before')
func()
return outer
@w1
def show():
print("show")

装饰器二(带参数的复杂装饰器):

写装饰器的成本比写函数高,写装饰器比较难,让外部人调用的时候,要自定义登陆界面,让他们写函数,
然后你的装饰器要把他们定义的函数套到装饰器上,@w1(他们自己写的函数),也就是把装饰的东西封装
到函数,装饰器调用封装的装饰函数

def before():
print('login!!')
def w2(before_func):
def accept_main(main_func):
def outer():
before_func()
main_func()
print('after')
return outer
return accept_main
@w2(before)
def show(name):
sore=["dd","ff","gg"]

context模块:上下文切换

import contextlib
@contextlib.contextmanager
def f1():
print("aaa")
yield
print("ccc") with f1():
print("bbb")

执行步骤:

先执行f1,碰到yield转到with下面的语句,with结束后再返回执行f1

Yield后面加参数可以被as后面的参数接收到

import contextlib
@contextlib.contextmanager
def fl():
print("ddd")
yield "eee"
print("fff") with fl() as hd:
print(hd)

contextlib.closing()用于调用类里面定义好的close

class Door(object):
def open(self):
print('Door is opened') def close(self):
print('Door is closed') with closing(Door()) as door:
door.open()

最新文章

  1. Android平台免Root无侵入AOP框架Dexposed使用详解
  2. android 学习随笔六(网络要求及配置)
  3. php没有开启Memcache扩展类时
  4. Java垃圾收集器
  5. HTML5如何播放本地文件
  6. gitlab hooks
  7. 动态规划——E (LIS())最长上升子序列
  8. Android下的SQLite数据库的相关操作及AndroidTestCase测试
  9. childNodes属性 和 nodeType属性
  10. nefu 179 珠子(最长递增子序列问题)
  11. 201521123017 《Java程序设计》第14周学习总结
  12. vue项目通过webpack打包生成的dist文件放到express环境里运行(vue+webpack+express)
  13. input 标签,不可更改
  14. 前端JS 与 后台C# 之间JSON序列化与反序列化(笔记)
  15. C# 8.0的三个值得关注的新特性
  16. LwIP Application Developers Manual6---Application API layers
  17. http--tomcat--memcached配置
  18. 配置nginx实现windows/iis应用负载均衡
  19. day33-常见内置模块二(hashlib、shutil、configparse)
  20. 2017-2018面向对象程序设计(Java)课程助教工作职责及分工

热门文章

  1. LINQ、Lambda 的转换
  2. [SI]source insight使用
  3. win下安装oracle的步骤
  4. (转)WCF开发框架形成之旅---WCF的几种寄宿方式
  5. Selenium WebDriver 之 PageObjects 模式 by Example
  6. 数据结构与算法(1)支线任务2——Basic Calculator
  7. php和js如何通过json互相传递数据
  8. 通过seekBar改变图片的透明度
  9. json工具包比较 fastjson jackson gson
  10. R语言 三个函数sort();rank();order()