迭代器:
迭代是訪問集合元素的一種方式。迭代器是一個可以記住遍歷的位置的對象。迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會后退。
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>