python第五天學習總結
def wrpper(f): #f = func1
def inner(*args,*kwargs):
print(111)
ret = f(args,**kwargs)
print(333)
return ret
return inner #返回給wrapper(func1)
@wrpper # func1 = wrapper(func1)
def func1():
print(222)
return 444
func1() #inner()
# 1,執行wrapper函數,將func1函數名傳給f
# 2,將inner函數名 返回給了新的變量func1 (func1 = inner)
#4,執行print(111)執行func1 函數print(222) 執行print(333)
2.函數的有效信息
#########沒有裝飾器
def logger(username,pwd):
‘‘‘ #描述此函數的作用及參數和返回值等信息
此函數是登錄函數,需要username,pwd兩個參數
:return:True
‘‘‘
print(111)
return True
print(logger.doc) #查看函數的描述信息
###########有裝飾器
from functools import wraps #1.引入wraps
def wrpper(f):
@wraps(f) #2.@wraps(f)
def inner(*args,*kwargs):
‘‘‘
inner函數的信息
:param args: 參數
:param kwargs: 參數
:return: True
‘‘‘
print(222)
ret = f(args,**kwargs)
print(333)
return inner
@wrpper
def logger(username,pwd):
‘‘‘
此函數是登錄函數,需要username,pwd兩個參數
:return:True
‘‘‘
print(111)
return True
print(logger.doc) #輸出logger函數信息,如果沒有1 2的操作,輸出inner函數的信息
print(logger.name) #輸出logger,如果沒有1 2的操作,輸出inner函數名
3 裝飾器的升級
##帶參數的裝飾器
def wrpperout(flag1): #flag1=flag=True
def wrpper(f):
def inner(*args,kwargs):
if flag1:
print(0)
ret = f(*args,*kwargs)
print(9)
return ret
else:
ret = f(args, kwargs)
return ret
return inner
return wrpper
flag = True
@wrpperout(flag) #1.將@與函數分開,執行wrpperout(flag)返回wrpper 2.將@與wrpper結合@wrpper
def func1():print(111)
@wrpperout(flag)
br/>print(111)
@wrpperout(flag)
@wrpperout(flag)
br/>print(222)
@wrpperout(flag)
print(333)
func1()
func2()
func3()
###多個裝飾器裝飾一個函數
def wrapper1(func):
def inner1():
print(‘wrapper1 ,before func‘)
func()
print(‘wrapper1 ,after func‘)
return inner1
def wrapper2(func):
def inner2():
print(‘wrapper2 ,before func‘)
func() # inner1()
print(‘wrapper2 ,after func‘)
return inner2
def wrapper3(func):
def inner3():
print(‘wrapper3 ,before func‘)
func()
print(‘wrapper3 ,after func‘)
return inner3
@wrapper3@wrapper2
br/>@wrapper2
def f():
print(‘f‘)
f()
輸出:
wrapper3 ,before func
wrapper2 ,before func
wrapper1 ,before func
f
wrapper1 ,after func
wrapper2 ,after func
wrapper3 ,after func
執行順序:從上到下裝飾器裝飾函數之前的操作----執行函數-----從下到上裝飾器裝飾函數之後操作
4.叠代器
###可叠代對象:該對象中含有iter方法的就是可叠代對象,遵循可叠代協議
print(‘iter‘ in dir(str)) #判斷該對象是不是可叠代對象
from collections import Iterable
print(isinstance(‘abc‘,Iterable)) #判斷該對象是不是可叠代對象
print(isinstance(‘abc‘,str)) #判斷該對象是哪種數據類型
#####叠代器:內部含有iter且含有next方法的對象就是叠代器,遵循叠代器協議
s1 = ‘asgsdg‘
obj_s = s1.iter() #將可叠代對象轉換成叠代器或者obj_s = iter(s1)
print(obj_s.next()) #取值
print(‘next‘ in dir(obj_s)) #判斷該對象是不是叠代器
from collections import Iterator
print(isinstance(obj_s,Iterator)) #判斷該對象是不是叠代器
####叠代器的好處:1.節省內存 2.惰性機制 3.單向執行,不可逆
5.生成器
生成器本質就是叠代器,自定義的叠代器
def func1():
print(111)
yield 222 #yield關鍵字
yield 333
yield 444
g_obj = func1() #生成器對象
print(g_obj) #<generator object func1 at 0x000001E97F1303B8>
print(g_obj.next()) #取值,next()和yield一一對應
print(g_obj.send())#send和next都是對生成器的取值,send會給上一個yield發送一個值,send不能用在第一次取值,最後一個yield不能得到值
6.列表推導式
[變量(加工後的變量) for 變量 in iterable] #遍歷模式
[變量(加工後的變量) for 變量 in iterable if 條件] #篩選模式
####生成器表達式
(變量(加工後的變量) for 變量 in iterable)
(變量(加工後的變量) for 變量 in iterable if 條件)
7.內置函數
eval:去除兩邊的引號
print(eval(‘1+2+3‘)) #輸出6
exec:執行代碼
s1 = ‘‘‘
for i in range(5):
print(i)
‘‘‘
print(exec(s1))
print(sep=‘分隔符,默認為空格‘)
print(sep=‘換行符,默認為\n‘)
print(file=f1w文件句柄)
print(hash(‘cc‘)) #將一個不可變的數據類型轉換一個哈希值,如果是數字就是數字本身
print(help(str))#幫助信息
callable:檢查一個對象是否可調用,可調用返回True,不可調用返回False
print(float(1)) #將整數和字符串轉換成浮點數,輸出1.0
print(bin((18))) #十進制轉換成二進制,輸出0b10010
print(oct((18))) #將十進制裝換成八進制,輸出0o22
print(hex((18))) #將十進制裝換成十六進制,輸出0x12
print(abs(-1)) #abs取絕對值,輸出1
print(divmod(100,7)) #商和余數,輸出(14, 2)
print(round(1.2345,3)) #保留小數的位數,輸出1.234
print(pow(2,3)) #x的y次冪,如果是三個參數表示對z取余
l1 = [1,2,3]
print(sum(l1),4) #求和,輸出10
l1 = [1,2,-3]
print(min(l1,key=abs)) #取最小值,可加key,輸出1
print(max(l1,key=abs)) #輸出最大值,可加key,輸出-3
l_obj=reversed(l1) #翻轉形成一個叠代器,用for取值
repr:返回一個對象的原形
sorted:可指定key進行排序
enumerate:枚舉,返回一個枚舉對象
all:可叠代對象中,全是True才是True
any:可叠代對象中,有一個True,就是True
zip:拉鏈方法
map
filter
8,匿名函數
calc = lambda n:nn #calc函數名,lambda關鍵字,n參數:nn參數運算**
python第五天學習總結