python-內置函數、裝飾器


本節內容:

一之前課程回顧:


在書寫代碼的時候,先寫簡單的邏輯在寫復雜的邏輯。
概念梳理:
1、函數在傳遞實參的時候是傳遞的是引用而不是從內存中重新賦相同值給形參。
比如:
1 def test(x):
2     x.append(55)
3 
4 
5 list_1=[1,2,3,4,]
6 test(list_1)
7 print(list_1)
8 [1, 2, 3, 4, 55]
 
        

 

2、函數名帶圓括號和不帶圓括號。
 1 def test(x):
 2     x.append(55)
 3 
 4 
 5 list_1=[1,2,3,4,]
 6 a=test(list_1)
 7 b=test
 8 print(list_1)
 9 print(b,a)
10 
11 [1, 2, 3, 4, 55]
12 <function test at 0x027117C8> None
 
        

 

函數名帶圓括號是函數的調用,由於函數test沒有返回值,所以輸出None,而函數名代表的是函數體,上面是把函數體test賦值給b。
所以可以直接執行b函數和執行test函數是一樣的。
 1 def test(x):
 2     x.append(55)
 3     return 'b'
 4 
 5 list_1=[1,2,3,4,]
 6 a=test(list_1)
 7 b=test
 8 print(list_1)
 9 print(b,a)
10 res=b(list_1)
11 print('this is b '+res)
12 
13 [1, 2, 3, 4, 55]
14 <function test at 0x027017C8> b
15 this is b b
 
        

 

3、函數返回值
1 def test2(x):
2     x.append(12)
3 lz=[1,2,3,]
4 lz=test2(lz)
5 print(lz)
6 
7 None
 
        

 

在函數沒有返回值的時候默認是None。
4、python 中的為False:0、False、[]、{}、()、''、""。空列表、空字典、空字符創、空元組都是False.
二:內置函數
1:callable()該函數檢測對象是否可以被調用。不常用這個函數。
 1 def test2(x):
 2     x.append(12)
 3 res=callable(test2)
 4 print(res)
 5 TEST=34
 6 res_1=callable(TEST)
 7 print(res_1)
 8 
 9 True
10 False
 
        

 

2:chr()、odr()
字母在ASCII數字表示范圍,大寫字母在(65-90)小寫字母在(97-122)

chr()是把數字轉換成對應的字母。
1 a=chr(78)
2 print(a)
3 N
 
        

 

ord()是把對應的字母轉成數字。
1 b=ord('a')
2 print(b)
3 97
 
        

 

應用:
我們經常在網站登錄時候或者購買商品提交的時候,會有驗證碼的填寫。那用python 如何產生隨機的驗證碼?

 1 import random
 2 num=random.randint(1,9)
 3 num_1=random.randint(65,91)
 4 st_1=chr(num_1)
 5 sj=[]
 6 for i in range(7):
 7     m=random.randint(0,7)############需要注意的是這個,這個保證產生的驗證碼是隨機的。如果指定的位置為數字或者字母,那就不是隨機驗證碼。
 8     if m==2 or m==0:
 9         sj.append(num)
10     else:
11         sj.append(st_1)
12 print('%s%s%s%s%s%s%s'%(sj[0],sj[1],sj[2],sj[3],sj[4],sj[5],sj[6]))
13 
14 SS6SSSS
 
        

 

3、python代碼是如何執行呢?

模擬這個過程:
1 s='print([1,2,3,])'
2 t=compile(s,'','exec')##s是指可讀取字符串的文件或者變量.內置函數compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1),
3 exec(t)###其中‘’表示字符串(或用""),可以在引號內填寫任意內容。'exec'表示執行以哪種方式執行,exec表示一系列python語句,eval表示的是表達式可以進行求值。single表示單一的語句。 4 [1, 2, 3]
 
        
eval():通常用在表達式上,他有返回值。返回值是該表達是的值。表達式為字符串、后者是python表達式或者經過函數compile()編譯過的代碼。
其中表示:
The source may be a string representing a Python expression or a code object as returned by compile().
1 t=eval('2+2')
2 print(t)
3 4
1 t='2*2+3'
2 s=compile(t,'','eval')
3 h=eval(s)
4 print(h)
5 7
eval()可以直接接受字符串表達式。
exec(),也可以處理字符串,但是沒有返回值。也可以接受經過函數compile()編譯過的代碼。
1 t='print(2*2+3)'
2 print(exec(t))
3 7
4 None
以后再模板引用的時候會用到把字符串格式的代碼編譯執行。

上述就是html格式的轉換成一個函數,並為該函數提供全局變量,然后執行該函數。
將字符串格式轉換成代碼格式,並執行。
dir()和help()函數,他兩個都是查看函數或者類的幫助文檔。只是help()查看內容更為詳細。而dir只是列出有什么方法和函數。

help()

 dimovd(x,y)求商和余數。x是被除數,y是余數。返回值是商和余數的元組。常用於分頁計算。
1 t=divmod(10,3)
2 print(t)
3 (3, 1)
 
        

 

 實例是類的具體對象,他繼承了類的所有特性(函數方法等。)比如如下字符串'abc'繼承str所有的方法和函數。

isinstance(object,class or type)就是判斷一個對象是否一個類的的實例,返回值是True或者False.
1 a='abc'
2 t=isinstance(a,str)
3 print(t)
4 True
和type()區別:instance() 和type() instance() 中后面是基類或者父類 返回的也是TRUE 而 type()  只是返回一個當前一個類。

filter(x,y)函數,把符合的條件可以迭代的元素 生成一個生成器,然后用相應的函數進行轉換。一般做篩選使用。
1 def test(x):
2     if x>3:
3         return True
4 x=[1,2,3,4,5,]
5 t=filter(test,x)
6 print(list(t))
7 
8 [4, 5]
整個過程:

 

 

 1 def test(x):
 2     if x>3:
 3         return False
 4     else:
 5         return True
 6 x=[1,2,3,4,5,]
 7 t=filter(test,x)
 8 print(list(t))
 9 
10 [1, 2, 3]
 
        

 

 lambda(),返回值是布爾值,可以用lambda和filter結合使用。
1 x=1
2 test=lambda a:a>2
3 print(test(x))
4 
5 False
可以用2者結合。
1 x=[1,2,3,4,]
2 test=filter(lambda a:a>2,x)
3 print(list(test))
4 [3, 4]
 
        

 

 map()函數是對批量的對象進行相同的操作。同樣也可以和lambda結合使用。
1 x=[1,2,3,4,]
2 t=map(lambda a:a+2,x)
3 print(list(t))
4 [3, 4, 5, 6]
 
        

len()函數計算字符長度。在不通的版本計算的方法不通,在python3中計算的是字符個數,如果在3中想計算字節的個數可以用bytes()函數轉換成字節在用len()函數計算,是把字符轉換成字節。在python2中計算字節的個數。

1 print(len('生活'))
2 print(len(bytes('生活',encoding='gbk')))
3 print(len(bytes('生活',encoding='utf-8')))
4 
5 2
6 4
7 6

 

 

max(),min(),sum函數。分別的是求最大值、最小值、求和。
1 test_list=[1,2,3,4,]
2 print(max(test_list))
3 print(min(test_list))
4 print(sum(test_list))
5 
6 
7 4
8 1
9 10
 
        

 

hash()函數將字符或者其他對象求hash值。我們接觸字典的key值就是hash值存儲到磁盤。而且鍵值是可hash的。
1 print(hash('a'))
2 1059073218
 
        

 

pow()函數是求平方。等同於**
1 a=pow(2,4)
2 print(a)
3 b=2**4
4 print(b)
5 16
6 16
 
        

 

 reversed()函數是反轉的意思  但是並不操作原先的對象,而是生成新生成器對象,可以進行遍歷的。
 1 test_list=[3,2,1]
 2 t=reversed(test_list)
 3 print(t)
 4 print(test_list)
 5 for i in t:
 6     print(i)
 7 <list_reverseiterator object at 0x026701D0>
 8 [3, 2, 1]
 9 1
10 2
11 3
 
        

 

而字典的reserse()函數是直接操作原先的對象,進行反轉。
1 test_list=[3,2,1]
2 test_list.reverse()
3 print(test_list)
4 [1, 2, 3]
 
        

 

 round()四舍五入。
1 print(round(1.2))
2 print(round(1.5))
3 1
4 2
 
        

 

sorted() 排序從小打到。之前用過排序字典的key值,來保證有序輸出
1 test_list=[1,3,2,4,]
2 print(sorted(test_list))
3 [1, 2, 3, 4]
 
        

 

 zip()函數顯示2個對象的都擁有的元素元組的列列表。
1 list_1=[1,2,3,4]
2 list_2=[1,2,3,]
3 list_3=[1,2,]
4 print(list(zip(list_1,list_2,list_3)))
5 
6 [(1, 1, 1), (2, 2, 2)]
 
        
三:裝飾器,功能在不修改類和函數的代碼基礎上加的額外功能。(函數可以做為實參賦值給形參。)
 1 USER_INFO={'evil':'123'}
 2 AUTH_DIC={
 3     'AUTH_FLAG':False
 4 }
 5 pre='''
 6 1:login
 7 2:change password'''
 8 def test(func):
 9     def prvi():
10         if AUTH_DIC['AUTH_FLAG']==False:
11             print('login first!')
12         else:
13             func()
14     return prvi
15 
16 def login(username,password):
17     if username=='evil'and password=='123':
18         print('login successful!')
19         return True
20     else:
21         print('login fail')
22 @test
23 def chpass():
24     new_password=input('entre new password:')
25     USER_INFO['evil']=new_password
26 def login_main():
27     while True:
28         print(pre)
29         choice=input('entre your choice:')
30         if choice=='1':
31             username=input('entre your login username:')
32             password=input('entre your login password:')
33             res=login(username,password)
34             if res:
35                 AUTH_DIC['AUTH_FLAG']=True
36                 continue
37             else:
38                 AUTH_DIC['AUTH_FLAG']=False
39                 continue
40         elif choice=='2':
41             chpass()
42             print(USER_INFO)
43 login_main()
44 
45 
46 1:login
47 2:change password
48 entre your choice:2
49 login first!
50 
51 1:login
52 2:change password
53 entre your choice:1
54 entre your login username:evil
55 entre your login password:123
56 login successful!
57 
58 1:login
59 2:change password
60 entre your choice:2
61 entre new password:
 
        

 

上面是簡單的驗證權限問題,在用戶沒登陸之前不能做修改密碼的操作,在登陸之后可以進行修改密碼的操作。
裝飾器的語法:
 1 def outer(func):            ##定義裝飾器函數outer並且參數為被裝飾的函數整體。
 2     def inner():            ##定義inner函數並做為outer函數的返回值,賦予func函數。
 3         print('do before')
 4         func()
 5         print('do afer')
 6         return True
 7     return inner
 8 @outer
 9 def f1():
10     print(1+2)
11 
12 f1()
13 
14 do before
15 3
16 do afer
 
        

 

語法:@函數名
1:自動執行outer()函數並且將下面的函數f1當做參數傳遞。
2:將outer函數的返回值,重新賦值給f1。
執行順序:

python執行順序是,從上到下,先將outer函數加載到內存,然后把函數f1加載到內存。在執行f1的時候,由於f1被outer裝飾,f1作為實參賦值給outer函數的形參func,然后將outer函數的返回函數inner賦值給f1,
所以執行inner函數,因為到func()的調用時候,執行f1的舊函數的函數體,也就是7,執行完在執行第8步,如果f1有返回值,那么inner函數將返回相同的返回值。

如果函數有參數的時候,參數的對應是一一對應。
為了解決不同的被裝飾的函數的參數個數問題,避免出現參數個數報錯。可以用萬能參數,來避免這個錯誤。
 1 def outer(func):
 2     def inner(*args,**kwargs):
 3         print('do before')
 4         func(*args,**kwargs)
 5         print('do afer')
 6     return inner
 7 @outer
 8 def f1():
 9     print(1+2)
10 @outer
11 def f2(x,y):
12     print(x*y)
13 
14 f1()
15 f2(1,2)
16 do before
17 3
18 do afer
19 do before
20 2
21 do afer
 
        

 

裝飾器應用場景:大部分都是用來權限的驗證。













 
        



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM