學習Python基礎--------4
python裝飾器
定義:本質是函數,(裝飾其他函數)就是為其他函數添加附加功能
原則:1。不能修改被裝飾的函數源代碼
2.不能修改被裝飾的函數的調用
def test1():
pass
def test2():
pass
這是兩個函數想為兩個函數添加打印功能,那就在寫一個打印函數然後再調用
def logger(): print(‘logging‘) def test1(): pass logger() def test2(): pass logger()
test1()
test2()
裝飾器通過@裝飾器名來調用
deftimer(func): def warpper(*args,**kwargs): start_time = time - time() func() stop_time=time.time() print(‘the func run time is%s‘%(stop_time-start_time) return warpper @timmer #裝飾器的調用方式 def test1(): time.sleep(3) print(‘in the test1‘) test()
實現裝飾器的知識:
1.函數即變量(定義一個函數就等於把函數體給了函數名)
2.高階函數
a.把函數名當做一個實參傳給另外一個函數(不修改被裝飾函數源代碼為函數添加功能)
b.返回之中包含函數名(不修改函數的調用方式)
3.嵌套函數
高階函數+嵌套函數=裝飾器
列表生成式
列表直接生成以後在賦值給a
a= [i*2 for i in rnge(10)] [0,2,4,6,8,10,12,14,16,18]
生成器:只有在調用時才會生成相應的數據 ,只有一個__next__()方法
b是內存地址
b=[i*2 for i in range(10)] for i in b: print(i)
實現斐波那契的生成器
def fib(max): n,a,b = 0,0,1 while n<max: # print(b) yield b a,b = b,a+b #a= b a =1,b=2, a=b, a=2 # b = a+b b= 2+2 = 4 n= n+1 return ‘-----------done---------------‘ # f=fib(10) g= fib(6)
print(g.__next__())
print("======star loop=====")
for i in g:
print (i)
#如果數據過大無法知道長度需要異常處理
while True:
try:
x= next(g)
print(‘g:‘,x)
except StopIteration as e:
print(‘Generator return value:‘,e.value)
break
生成器的並行
# Author:Zhiyu Su import time def consumer(name): print(‘%s 準備吃孢子啦!‘%name) while True: baozi = yield print(‘包子[%s]來了,被[%s]吃了‘%(baozi,name)) c= consumer(‘chengronghua‘) # c.__next__() # b1= ‘韭菜餡‘ # c.send(b1) # c.__next__() def producer(name): c= consumer(‘A‘) c2 = consumer(‘B‘) c.__next__() c2.__next__() print(‘老子包子做好了‘) for i in range(10): time.sleep(1) print(‘做了1個包子分了兩半‘) c.send(i) c2.send(i) producer(‘alex‘)
叠代器
可以直接作用於for
循環的數據類型有以下幾種:
一類是集合數據類型,如list
、tuple
、dict
、set
、str
等;
一類是generator
,包括生成器和帶yield
的generator function。
這些可以直接作用於for
循環的對象統稱為可叠代對象:Iterable
。
可以使用isinstance()
判斷一個對象是否是Iterable
對象:
>>> from collections import Iterable >>> isinstance([], Iterable) True
而生成器不但可以作用於for
循環,還可以被next()
函數不斷調用並返回下一個值,直到最後拋出StopIteration
錯誤表示無法繼續返回下一個值了。
*可以被next()
函數調用並不斷返回下一個值的對象稱為叠代器:Iterator
。
可以使用isinstance()
判斷一個對象是否是Iterator
對象
生成器都是Iterator
對象,但list
、dict
、str
雖然是Iterable
,卻不是Iterator
。
把list
、dict
、str
等Iterable
變成Iterator
可以使用iter()
函數:
因為Python的Iterator
對象表示的是一個數據流,Iterator對象可以被next()
函數調用並不斷返回下一個數據,直到沒有數據時拋出StopIteration
錯誤。可以把這個數據流看做是一個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()
函數實現按需計算下一個數據,所以Iterator
的計算是惰性的,只有在需要返回下一個數據時它才會計算。
Iterator
甚至可以表示一個無限大的數據流,例如全體自然數。而使用list是永遠不可能存儲全體自然數的。
python的內置方法
# Author:Zhiyu Su #print(all([1,-5,3]))#判斷數據是否為真 是返回True 否者返回fale # print(any[1]) # a = (ascii([1,2,‘說‘])) #把內存對象變成可打印字符串模式 # print(type(a)) # print(bin(1)) #把數字十進制轉二進制 # bool(90)#判斷真假 # a = bytes(‘abcde‘,encoding=‘utf-8‘) #二進制 # b = bytearray(‘abcde‘,encoding=‘utf-8‘) #可修改的二進制 # print(b[1]) # print(a.capitalize(),a) #首字母大寫 # def ggg():pass # print(callable(ggg)) # print(chr(88)) #把數字對應的acsii表反映出來 # print(ord(‘w‘)) #與chr相反 # code = ‘for i in range(10):print(i)‘ #把字符轉換換代碼 # c=compile(code,‘‘,‘exec‘) # exec(c) # exec(code) # dir(x)#查取方法 # divmod()#底板除 # enumerate # seasons = [‘Spring‘,‘Sunner‘,‘Fall‘,‘winter‘] # # print(list(enumerate(seasons))) #[(0, ‘Spring‘), (1, ‘Sunner‘), (2, ‘Fall‘), (3, ‘winter‘)] # eval()#數據字典變字符串 # def sayhi(n): # print(n) # # sayhi(3) # # # lambda n:print(n)(5) # calc = lambda n:3 if n<4 else n #匿名函數只能進行三元運算 # print(calc(5)) # res= filter(lambda n:n>5,range(10)) #一組數據過濾出你想要的來 # res = map(lambda n:n*2,range(10)) # res=[lambda i:i*2 for i in range(10)] # import functools # res = functools.reduce(lambda x,y:x+y,range(10))#45 # res = functools.reduce(lambda x,y:x*y,range(1,10))#362880 # # print(res) # a = frozenset([1,3,4,5,64,2,5,23,4])#不可變集合 # print(globals()) #整個文件的變量值 # hash( ) # print(hex(255)) #將數字轉為16進制 # def test(): # local_var = 333 # print(locals()) # test() # print(globals()) # print(globals().get(‘local_var‘)) # oct()#轉八進制 # print(pow(3,5)) #3的5次方 # print(round(1.33555,2)) #保留兩位數字 # a = {6:2,8:0,1:4,-5:6,99:11,4:22} # # print(sorted(a.items())) # print(sorted(a.items(),key = lambda x:x[1])) # # print(a) # a= [1,2,3,4] # b= [‘a‘,‘b‘,‘c‘,‘d‘] # for i in zip(a,b): # print(i)
json和pickle數據序列化:把內存的對象變成字符串
json序列化
# Author:Zhiyu Su import pickle def sayhi(name): print(‘hello‘,name) info = { ‘name‘:‘alex‘, ‘age‘:22, ‘func‘:sayhi } f=open(‘test.text‘,‘wb‘) f.write(pickle.dumps( info)) # print(json.dumps(info)) f.close()
json反序列化
# Author:Zhiyu Su import json def sayhi(name): print(‘hello‘,name) f = open(‘test.text‘,‘rb‘) # data =eval( f.read()) data = json.loads(f.read()) print(data[‘age‘])
pickle序列化
# Author:Zhiyu Su import pickle def sayhi(name): print(‘hello‘, name) info = { ‘name‘: ‘alex‘, ‘age‘: 22, ‘func‘: sayhi } f = open(‘test.text‘, ‘wb‘) pickle.dump(info, f) # 等同於f.write(pickle.dumps(info)) f.close()
pickle反序列化
# Author:Zhiyu Su import pickle def sayhi(name): print(‘hello‘,name) f = open(‘test.text‘,‘rb‘) data = pickle.load(f) # data = pickle.loads(f.read()) print(data[‘func‘](‘alex‘))
學習Python基礎--------4