迭代器:
迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
import collections #导入模块
isinstance(object,collections.Iterable) #判断一个对象是否可迭代
isinstance(object,collections.Iterator) #判断对象是否是迭代器
生成器都是 Iterator 对象,但 list 、 dict 、 str 虽然是 Iterable ,却不是 Iterator 。
把 list 、 dict 、 str 等 Iterable 变成 Iterator 可以使用 iter() 函数:
ls = [x for x in range(10)]
it = iter(ls)
迭代器同样可被next()调用
from xxx import xxx 等同于 xxx.xxx
from collections import Iterator == collections.Iterator
闭包:
在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称之为闭包
def outside(a,b):
def inner(x):
return a*x+b
return inner
ret = outside(2,5)
print(ret(10))
>>25
1.闭包似优化了变量,原来需要类对象完成的工作,闭包也可以完成
2.由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存
装饰器:
装饰器,功能就是在运行原来功能基础上,加上一些其它功能,比如权限的验证,比如日志的记录等等。不修改原来的代码,进行功能的扩展。
比如java中的动态代理,python的注解装饰器
其实python的装饰器,是修改了代码。
def outside(func):
def inner():
print('这是装饰器')
func()
return inner
@outside
def run():
print('这是主体')
run()
>>这是装饰器
>>这是主体
@outside可将run函数当参数调用
多个装饰器,按照从里往外(从下往上)先后顺序执行
def outside1(func):
def inner1():
return '——1——'+func()+'——1——'
return inner1
def outside2(func):
def inner2():
return '——2——'+func()+'——2——'
return inner2
@outside1
@outside2
def run():
return('Irlans')
print(run())
>>——1————2——Irlans——2————1——
被装饰的函数有参数
def outmost(pre):
def outside(func):
def inner():
print('%s%s'%(pre,func()))
return inner
return outside
@outmost('wangcai')
def run():
return('今年5岁了')
run()
>>wangcai今年5岁了
被装饰参数有不定长参数:
from time import ctime, sleep
def timefun(func):
def wrappedfunc(*args, **kwargs):
print(args)
print(kwargs)
print("%s called at %s"%(func.__name__, ctime()))
func(*args,**kwargs)
return wrappedfunc
@timefun
def foo(a, b, c,num):
print(a+b+c)
print(num)
foo(3,5,7,num=123)
>>(3, 5, 7)
>>{'num': 123}
>>foo called at Fri Jul 14 20:31:06 2017
>>15
>>123
类装饰器:
class Test(object):
def __init__(self, func):
print("---初始化---")
print("func name is %s"%func.__name__)
self.__func = func
def __call__(self):
print("---装饰器中的功能---")
self.__func()
def laowang():
print("----laowang---")
t = Test(laowang)
t()
>>---初始化---
>>func name is laowang
>>---装饰器中的功能---
>>----laowang---
class Test(object):
def __init__(self, func):
print('id(self)=%s,id(func)=%s,func=%s'%(id(self),id(func),func))
print("---初始化---")
print("func name is %s"%func.__name__)
self.__func = func
def __call__(self):
print("---装饰器中的功能---")
return self.__func()
@Test #laowang = Test(laowang)
def laowang():
return "----laowang---"
print(laowang())
print(id(laowang))
print(laowang)
>>func name is laowang
>>---装饰器中的功能---
>----laowang---
>>18534296
>><__main__.Test object at 0x00000000011ACF98>