在Python中定義函數的基本格式爲:express
def <函數名>(參數列表): <函數語句> return <返回值>
Python中的函數形式比較靈活,聲明一個函數不須要聲明返回值類型,也不須要聲明參數類型。在使用函數以前必需先定義函數。
下面是一個基本使用案例:函數
''' 多行註釋:定義sum函數,求和。 ''' def sum(t): result = 0; for e in t: result+=e; return result; #單行註釋:將set對象傳入sum函數 res = sum({1,2,3,4}); print(res);
Python中變量做用域分爲局部做用域、全局做用域和內置做用域。ui
def test(): print(a); a = "hello world"; test();
輸出:spa
hello world
當執行到print(a)的時候,會在test()函數中搜索變量a,若是test()做用域中沒有變量a,那麼它會去全局做用域中搜索變量a。
上面案例中變量a的做用域是全局做用域。若函數中也有一個局部做用域變量a,那麼會發生什麼呢?code
def test(): a = "i am in internal"; print(a); a = "i am in external"; test(); print(a);
輸出:orm
i am in internal
i am in external
這個輸出結果是咱們預期以內的,從結果能夠看出,當在局部做用域和全局做用域中有相同的變量名時,在局部做用域以內以局部做用域的變量名爲準,在局部做用域以外以全局做用域的變量名爲準。
若是想在局部做用域以內使用全局做用域的變量,那麼可使用global關鍵字:對象
def test(): global a; a = "hello world"; print(a); a = "i am in external"; test(); print(a);
輸出:blog
hello world
hello world
在Python中可使用locals()來訪問局部命名空間中變量,例如:排序
def functest(i,str): x = 12345 print(locals()) functest(1,"test")
輸出:作用域
{'x':12345,'str':'test','i':1}
內置函數globals()用來訪問全局命名空間中變量,例如:
if '__main__' == __name__: print(globals())
輸出:
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/home/test1.py', 'x': 12345}
Python中的globals()函數和locals()函數的返回值數據類型都是Dictionary,可是locals()返回的是局部命名變量的副本;而globals()返回的是實際的全局命名空間,因此任何對globals()的改變都會影響到全局變量。
def funtest(i): print('局部變量 i = ',locals()['i']) print("修改局部變量 locals()['i']=12 ") locals()['i'] = 12 print('局部變量 i = ',locals()['i']) y = 1 if '__main__' == __name__: funtest(y) print('----------------') print('全局變量 y = ',globals()['y']) print("修改全局變量 globals()['y']=12") globals()['y'] = 12 print('全局變量 y = ',globals()['y'])
輸出:
局部變量 i = 1
修改局部變量 locals()['i']=12
局部變量 i = 1
----------------
全局變量 y = 1
修改全局變量 globals()['y']=12
全局變量 y = 12
從上面的結果能夠看出,globals()和locals()雖然都返回Dictionary的數據類型,可是任何對globals()的修改都會影響到全局變量,可是對locals()的修改不會影響到任何局部變量。
不定長參數也被稱爲可變參數,在定義變長參數的時候只須要在變量前面加上星號「*」。變長參數的形參類型是元組類型(tuple),若不傳入任何參數那麼它就是一個空元組。
def printinfo(num,*vartuple): print("接下來會打印 ",num," 個參數"); for a in vartuple: print(a); printinfo(3,"how","are","you");
輸出:
接下來會打印3個參數
how
are
you
Python中除了單個星號的可變參數,還有兩個星號的可變參數(**),兩個星號的可變參數表示關鍵字參數,它本質上是一個dict,下面的代碼展現瞭如何使用。
def fun(**kwargs): for key, value in kwargs.items(): print("{0} 喜歡 {1}".format(key, value)) fun(Geek="cat", cat="box")
輸出:
Geek 喜歡 cat
cat 喜歡 box
在Python中,lambda的語法是惟一的。其形式以下:
lambda argument_list: expression
其中,lambda是Python預留的關鍵字,argument_list和expression由用戶自定義。具體介紹以下。
1.這裏的argument_list是參數列表。它的結構與Python中函數(function)的參數列表是同樣的,argument_list能夠有很是多的形式。
2.這裏的expression是一個關於參數的表達式。表達式中出現的參數須要在argument_list中有定義,而且表達式只能是單行的。
lambda x, y: x*y;函數輸入是x和y,輸出是它們的積x*y
lambda:None;函數沒有輸入參數,輸出是None
lambda *args: sum(args); 輸入是任意個數的參數,輸出是它們的和(隱性要求是輸入參數必須可以進行加法運算)
lambda **kwargs: 1;輸入是任意鍵值對參數,輸出是1
例如:
f = lambda x, y: x*y #聲明lambda表達式 res = f(2,3) #調用函數
filter函數。此時lambda函數用於指定過濾列表元素的條件。例如filter(lambda x: x % 3 == 0, [1, 2, 3])指定將列表[1,2,3]中可以被3整除的元素過濾出來,其結果是[3]。sorted函數。此時lambda函數用於指定對列表中全部元素進行排序的準則。例如sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(5-x))將列表[1, 2, 3, 4, 5, 6, 7, 8, 9]按照元素與5距離從小到大進行排序,其結果是[5, 4, 6, 3, 7, 2, 8, 1, 9]。map函數。此時lambda函數用於指定對列表中每個元素的共同操做。例如map(lambda x: x+1, [1, 2,3])將列表[1, 2, 3]中的元素分別加1,其結果[2, 3, 4]。reduce函數。此時lambda函數用於指定列表中兩兩相鄰元素的結合條件。例如reduce(lambda a, b: '{}, {}'.format(a, b), [1, 2, 3, 4, 5, 6, 7, 8, 9])將列表 [1, 2, 3, 4, 5, 6, 7, 8, 9]中的元素從左往右兩兩以逗號分隔的字符的形式依次結合起來,其結果是'1, 2, 3, 4, 5, 6, 7, 8, 9'。