【Python】解析Python中函數的基本使用

1.簡介

在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);

 

2.global全局變量

2.1 global關鍵字的使用

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

 

 2.2 globals()和locals()的使用

在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()的修改不會影響到任何局部變量。

3.不定長參數

不定長參數也被稱爲可變參數,在定義變長參數的時候只須要在變量前面加上星號「*」。變長參數的形參類型是元組類型(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

 

4.匿名函數

在Python中,lambda的語法是惟一的。其形式以下:

 lambda argument_list: expression

其中,lambda是Python預留的關鍵字,argument_list和expression由用戶自定義。具體介紹以下。
1.這裏的argument_list是參數列表。它的結構與Python中函數(function)的參數列表是同樣的,argument_list能夠有很是多的形式。
2.這裏的expression是一個關於參數的表達式。表達式中出現的參數須要在argument_list中有定義,而且表達式只能是單行的。

 

lambda函數示例:

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)  #調用函數

 

將lambda函數做爲參數傳遞給其餘函數:

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'。

相關文章
相關標籤/搜索