Python自動化運維開發----基礎(十二)函數

1.函數的定義

函數是對代碼塊起了一個名字,在需要執行代碼塊的時候,直接調用函數

>>> def test():
...     print(test)
... 
>>> test()
<function test at 0x7ff784f51e18>
>>> def test(a,b):                          
...     print("{0}+{1}={2}".format(a,b,a+b))
... 
>>> test(1,2)
1+2=3

2.return之後的函數是不會在做執行代碼的

如圖:當return後的

>>> def test(): 
...     return 1
...     print(2)
... 
>>> test()
1

3.函數參數

(1)第一種無默認值

>>> def test(a):
...     print(a)
... 
>>> test(1)
1

(2)有默認值的參數,默認值參數必須在函數參數之後

如果在調用的時候不寫默認值就不會傳遞默認值,如果傳遞值的話就會覆蓋原來的默認值

>>> def test(a,b=1):
...     print(a,b)
... 
>>> test(1)
1 1
>>> test(1,2)
1 2

4.忽略返回值

只接收前兩個參數

>>> a,b,*c = range(10)
>>> a
0
>>> b
1
>>> c
[2, 3, 4, 5, 6, 7, 8, 9]

只接收後兩個參數

>>> *a,b,c = range(10)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7]
>>> b
8
>>> c
9

只接收前兩個參數和後兩個參數

>>> a,b,*c,d,e = range(10)
>>> a
0
>>> b
1
>>> c
[2, 3, 4, 5, 6, 7]
>>> d
8
>>> e
9

5.函數的關鍵字參數調用

關鍵字參數調用和參數的位置沒有關係

>>> def default(a,b,c):
...     print(a,b,c)
... 
>>> default(c=1,b=2,a=3)
3 2 1

字符串中的關鍵字參數調用

>>> '{name} is {age}'.format(name='likuan',age=25)
'likuan is 25'

6.函數的作用域

遵循LGB原則(先從L找再從G找最後在B中找)

L  local 函數體 和函數參數

G gloabal 模塊內

B python內置的參數

7.值傳遞和地址傳遞

(1)基本數據類型在函數傳遞時,直接傳遞值,在函數內修改值不影響函數體外的值

(2)引用類型在函數傳遞時,傳遞數據的地址,在函數內修改會影響函數體外的值(在內存中的地址一致所以函數體內的值修改都會修改)

地址傳遞

>>> a = []
>>> def test(p1):
...     p1.append(1)
... 
>>> test(a)
>>> a
[1]

8.函數的可變參數

(1)列表可變參數(是一個元組)

>>> def test(a,b,*arg):
...     print(a,b,arg)
... 
>>> test(1,2,3,4)
1 2 (3, 4)

(2)關鍵字可變參數(字典需要用賦值的方式)

>>> def test(a,b,*arg,**args):
...     print(a,b,arg,args)
... 
>>> test(1,2,3,4,c=1)
1 2 (3, 4) {'c': 1}

(3)混用(列表可變參數,關鍵字可變參數,默認參數,常規參數)

>>> def test(a,b,*arg,c=1,**args):
...     print(a,b,c,arg,args)
... 
>>> test(1,2,4,5,c=6,d=7)  
1 2 6 (4, 5) {'d': 7}

9.函數也是變量

函數放在列表中

>>> def test1(): print(test1)
... 
>>> def test2(): print(test2) 
... 
>>> def test3(): print(test3) 
... 
>>> test = [test1,test2,test3]
>>> for i in test:
...     print(i)
... 
<function test1 at 0x7f4bce855598>
<function test2 at 0x7f4bce855488>
<function test3 at 0x7f4bce855510>

函數在字典中

>>> fd = {'test1':test1,'test2':test2,'test3':test3}
>>> fd['test1']
<function test1 at 0x7f4bce855598>

在函數中定義函數

>>> def ceshi():
...     def ceshi2():
...         print(1)
...     ceshi2()
... 
>>> ceshi() 
1

10.匿名函數 lambda 

lamdba 函數只有一個函數體

>>> add = lambda a,b,c: a + b + c
>>> add(1,2,3)
6

11.sort 函數 和  sorted 函數

sort 函數,排序以第一個值排序

>>> l = [(1,2),(2,3),(3,1),(4,5),(2,3)]
>>> l.sort()
>>> l
[(1, 2), (2, 3), (2, 3), (3, 1), (4, 5)]

sort 函數,排序以第二個排序

>>> l.sort(key=lambda x: x[1])
>>> l
[(3, 1), (1, 2), (2, 3), (2, 3), (4, 5)]

sort() 函數 和 sorted() 函數的區別:

(1)sort() 函數只能對 list 進行排序, 對原數據進行修改

(2)sorted() 函數對任何可迭代的進行排序,不會對原來的 進行修改,返回一個新的列表

>>> a = [1,2,4,3]
>>> a.sort()
>> a
[1, 2, 3, 4]
>>> b = (1,2,6,5)
>>> c = sorted(b)
>>> c
[1, 2, 5, 6]
>>> b
(1, 2, 6, 5)

小練習 根據 字符串中字母的個數取出top5

>>> chars = {
...     'a' : 10,
...     'b' : 8,
...     'c' : 9,
...     'x' : 9,
...     'y' : 7,
...     'z' : 10,
...     'm' : 4,
...     'n' : 7
... }
>>> sorted(chars.items(),key=lambda x: x[1],reverse=True)
[('a', 10), ('z', 10), ('c', 9), ('x', 9), ('b', 8), ('y', 7), ('n', 7), ('m', 4)]
>>> sorted(chars.items(),key=lambda x: x[1],reverse=True)[:5]
[('a', 10), ('z', 10), ('c', 9), ('x', 9), ('b', 8)]

12.包

模塊(py腳本)

導入方式

import 文件名

 

導入包(文件夾裏必須要有__init__.py文件)

import 文件夾

 

mod.py 文件內容

#!/usr/bin/python

name = 'likuan'

 

#!/usr/bin/python

import mod

print(mod.name)

 

另一種帶入方式

from mod import name

print(name)

 

導入函數與現在函數中有函數名衝突可以用as去起一個別名

 

from mod import name as name_test

name = 'lizhi'

print(name,name_test)

 

以腳本運行的時候 __name__ == main

以模塊導入的方式 __name__ == 腳本名

 

name = 'likuan'

if __name__ == '__main__':

    print(name)

elif __name__ == 'mod':

print('test')

13,json字符串

格式化json

json.dumps()

還原之前的 json 字符串

json.loads()


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章