python中da_python学习 da4
一、裝飾器
##裝飾器:
#定義:本質(zhì)是函數(shù),(裝飾其他函數(shù)),就是為其他函數(shù)添加附加功能
#原則:1.不能修改被裝飾的函數(shù)的源代碼
# 2.不能修改被裝飾的函數(shù)的調(diào)用方式
# 裝飾器對被裝飾函數(shù)來說,是完全透明的。裝飾函數(shù)不知道裝飾器的存在。
###實(shí)現(xiàn)裝飾器知識(shí)儲(chǔ)備
#1.函數(shù)即“變量”
#2.高階函數(shù)
#3.嵌套函數(shù)
#高階函數(shù)+嵌套函數(shù)---》裝飾器
import time
def timmer(func):
def warpper(*args,**kwargs):
start_time = time.time()
func()
stop_time = time.time()
print('the func run time is {a}'.format(a=stop_time-start_time))
return warpper
@timmer
def test1():
time.sleep(3)
print('in the test1')
import time
def timer(func):
def deco(*args,**kwargs):
start_time = time.time()
# print(func)
func(*args,**kwargs) #run test1
stop_time = time.time()
print('the func time is {a}'.format(a=stop_time-start_time))
return deco
@timer # 等價(jià)于test1 = timer(test1) (相當(dāng)于把原來的test1給偷梁換柱為我們的timer(test1)了)
def test1():
time.sleep(1)
print('in the test1')
@timer #test2 = timer(test2) = deco test2(name) = deco(name)
def test2(name,age,):
print('test2:',name,age)
test1()
##(相當(dāng)于把原來的test1給偷梁換柱為我們的timer(test1)了)
##思考1.要想達(dá)到裝飾函數(shù)效果:即不改變調(diào)用方式,不改變函數(shù)源代碼,增加函數(shù)功能,那么
##思路必然是搞一個(gè)新的函數(shù),并且把函數(shù)地址賦給test1,即完成test1函數(shù)的偷梁換柱。
test2('alex',22) ##2.目的是增加函數(shù)功能,那么前提是保證原來函數(shù)功能,所以就要把test1函數(shù)地址作為實(shí)參
##傳遞給裝飾函數(shù),并且在裝飾函數(shù)中執(zhí)行test1. 此外,就是在裝飾函數(shù)中實(shí)現(xiàn)附加功能。
#####最后,要返回嵌套內(nèi)函數(shù)的地址,(外函數(shù)只是個(gè)形式,起到傳參作用),賦給test1,保證被
#####偷梁換柱后的test1,具有原功能和附加功能。
二、迭代器
# 我們已經(jīng)知道,可以直接作用于for循環(huán)的數(shù)據(jù)類型有以下幾種:
# 一類是集合數(shù)據(jù)類型,如list、tuple、dict、set、str等;
# 一類是generator,包括生成器和帶yield的generator function。
# 這些可以直接作用于for循環(huán)的對象統(tǒng)稱為可迭代對象:Iterable。
# 可以使用isinstance()判斷一個(gè)對象是否是Iterable對象:
#*可以被next()函數(shù)調(diào)用并不斷返回下一個(gè)值的對象稱為迭代器:Iterator。
#可以使用isinstance()判斷一個(gè)對象是否是Iterator對象:
#生成器都是迭代器Iterator,但list、dict、str雖然是Iterable,卻不是迭代器Iterator。
#把list、dict、str等Iterable變成Iterator可以使用iter()函數(shù):
#range(10)是個(gè)迭代器
#for line in f 也是迭代器
from collections import Iterable
from collections import Iterator
print(isinstance([],Iterable))
print(isinstance([],Iterator))
a = [1,2,3]
b = iter(a)
print(b.__next__())
三、生成器
import time
def consumer(name):
print("%s 準(zhǔn)備吃包子啦!" %name)
while True:
baozi = yield
print("包子[%s]來了,被[%s]吃了!" %(baozi,name))
# c = consumer('llw') #產(chǎn)生一個(gè)生成器,不會(huì)執(zhí)行consumer里面語句
# c.__next__() #只是調(diào)用yield
# b1 = '韭菜餡'
# c.send(b1) #調(diào)用yield,并給yield傳值
def producer(name):
c = consumer('A')
c2 = consumer('B')
c.__next__()
c2.__next__()
print("老子開始準(zhǔn)備做包子啦!")
for i in range(10):
time.sleep(1)
print("做了2個(gè)包子!")
c.send(i)
c2.send(i)
producer("alex")
四、匿名函數(shù)
#匿名函數(shù):函數(shù)即變量。沒有名字,就沒有門牌號(hào),就會(huì)被回收。
# (變量和函數(shù)均有內(nèi)存回收機(jī)制,當(dāng)沒有門牌號(hào)時(shí),內(nèi)存回收)
# calc = lambda x:x*3
# print(calc(3))
#
#
# def sayhi(n):
# print(n)
# sayhi(3)
#
# calc = (lambda n:print(n)) ##只能把簡單函數(shù)搞成匿名函數(shù)
# calc(5)
#
# calc = lambda n:3 if n<4 else n ##三元組
五、內(nèi)置方法
#匿名函數(shù):函數(shù)即變量。沒有名字,就沒有門牌號(hào),就會(huì)被回收。
# (變量和函數(shù)均有內(nèi)存回收機(jī)制,當(dāng)沒有門牌號(hào)時(shí),內(nèi)存回收)
# calc = lambda x:x*3
# print(calc(3))
#
#
# def sayhi(n):
# print(n)
# sayhi(3)
#
# calc = (lambda n:print(n)) ##只能把簡單函數(shù)搞成匿名函數(shù)
# calc(5)
#
# calc = lambda n:3 if n<4 else n ##三元組
總結(jié)
以上是生活随笔為你收集整理的python中da_python学习 da4的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蚂蚁森林消息气泡_元气森林靠代工借单品蹿
- 下一篇: vncview 多屏_OpenStack