生成器(Generator)
1.列表生成式看起来是这个样子
q = [x*2 for x in range(10)]
print(type(q))
---------------------------------------------------------------------------
<class 'list'>
把 [] 改做 () 就变成生成器啦
q = (x*2 for x in range(10))
print(type(q))
---------------------------------------------------------------------------
<class 'generator'>
想要输出内容的话:
print(next(q))
---------------------------------------------------------------------------
0
(next(q)和q.next()是一个效果)
如上所示,生成器实际上保存的是计算规则,调用next()会计算出下一个元素,如果没有更多元素,抛出StopInteration
q = (x*2 for x in range(1))
next(q)
next(q)
next(q)
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-41-b18c2d70dc58> in <module>()
1 q = (x*2 for x in range(1))
2 next(q)
----> 3 next(q)
4 next(q)
StopIteration:
生成器是一个可迭代对象,可以用for来实现获取元素,next还是比较累的。
2.第二种是含有yield关键字的函数,不要被欺骗。
def test():
i = 0
yield i
test()
---------------------------------------------------------------------------
<generator object test at 0x00000162B74391A8>
获取元素:
next(test())
迭代器
迭代是访问集合元素的一种方式。
迭代器是一个可以记住遍历位置的对象。迭代器对象从集合的第一个位置开始访问,直到所有的元素被访问完结束。迭代器只能往前不能往后。
可以直接for的对象一般有两类
1.集合数据类型:list、tuple、set、dict、str
2.生成器
判断一个对象是否可以迭代,使用isInstance
from collections import Iterable
str = 'hiahiahia'
print(isinstance(str, Iterable))
print(isinstance([], Iterable))
---------------------------------------------------------------------------
True
True
闭包
概念上说的话,闭包就是能读取其他函数内部变量的函数。不过一般只有函数内部的函数才能读取局部变量,所以闭包也就是指一个函数dad内部有一个子函数,并且这个子函数用了dad的变量,而且dad返回的是这个子函数。
def test(name):
def inner():
print('%s 说, i\'m in' % name)
return inner
t = test('小明')
t()
---------------------------------------------------------------------------
小明 说, i'm in
装饰器
基于闭包,如果调用闭包时传入的是函数,那么就可以实现一些函数外添加的功能了。
def cheat():
print('------骗钱-------')
这样骗钱并不太好骗,所以先得装一下,但是改原有函数工程浩大,装饰一下就能解决问题
def test(func):
def inner():
print('------装好人------')
func()
return inner
def cheat():
print('------骗钱-------')
cheat = test(cheat)
#其他模块调用的时候还是调用cheat(),完全不用动
cheat()
---------------------------------------------------------------------------
------装好人------
------骗钱-------
python的语法糖让这个行为还可以更简单一些:
def test(func):
def inner():
print('------装好人------')
func()
return inner
@test
def cheat():
print('------骗钱-------')
#其他模块调用的时候还是调用cheat(),完全不用动
cheat()
网友评论