函數

函數

1 函數的定義

在編程中,咱們常常要調用相同或者相似的操做,這些相同或者相似的操做是由同一段代碼完成的,而函數的出現,能夠幫助咱們避免重複編寫這些代碼。函數的做用就是把相對獨立的某個功能抽象出來,使之成爲一個獨立的實體。python

Python在全世界被普遍使用的一個緣由,就是Python中有大量的內置函數,這些內置函數能夠幫助咱們快速構建各類場景的網站。編程

定義一個函數只要以 "def" 開頭便可。函數

定義好函數以後,只表示這個函數封裝了一段代碼而已,若是不主動調用函數,函數是不會主動執行的。網站

定義函數的格式以下:人工智能

def function_name(arg1, arg2):
	function body
	return value

函數名(function_name):和Python中其它的標識符命名規則相同,有效的函數名以字母或下劃線開頭,後面能夠跟字母、數字或下劃線,函數命名應以可以反映函數功能爲準則;Python中的函數名區分大小寫,字母相同但大小寫不一樣的函數是不一樣的。code

函數參數(arg1, arg2):調用一個函數時能夠傳遞的數據,分爲形參和實參;參數能夠有一個或多個,也能夠沒有。對象

函數體(function body):任何有效的代碼均可以出如今函數體中,函數體中的代碼須要縮進四個空格。內存

函數返回值(return value):函數執行完成後返回的值;也能夠不返回任何內容,不返回內容可視爲返回 "None" 。作用域

函數的定義
print('定義函數')

def say_hello(name):
    print('hello', name)

say_hello('python')  # hello python
say_hello('人工智能')  # hello 人工智能
say_hello(1024)  # hello 1024
執行結果以下:
定義函數
hello python
hello 人工智能
hello 1024

2 函數的參數

對於設置參數的函數,當調用函數時須要向函數傳遞參數,被傳入的參數稱爲實參,而函數定義時的參數稱爲形參。io

Python中函數的參數能夠分紅必須參數、關鍵字參數、默認參數、可變參數和組合參數。

2.1 必須參數

必須參數,顧名思義就是函數定義的參數在調用時必須傳入,而且在調用時傳入的參數的數量和順序必須和定義時的參數保持一致。

必須參數
print('必須參數')

def two_arg_function(arg1, arg2):
    print('第一個參數', arg1)
    print('第二個參數', arg2)

two_arg_function(10, '咱們')  # 傳入的參數數量不能多也不能少,不然會報錯
執行結果以下:
必須參數
第一個參數 10
第二個參數 咱們
2.2 關鍵字參數

使用關鍵字參數能夠不按函數定義時的參數的順序來調用函數,Python解釋器可以根據函數定義時的參數名來匹配參數。

關鍵字參數
print('關鍵字參數')

def key_arg_function(name, age):
    print('姓名:', name)
    print('年齡:', age)

key_arg_function(name='張三', age=18)  # 按順序傳遞參數
key_arg_function(age=20, name='李四')  # 不按順序傳遞參數
執行結果以下:
關鍵字參數
姓名: 張三
年齡: 18
姓名: 李四
年齡: 20
2.3 默認參數

在定義函數時咱們能夠給參數添加默認值,若是調用函數時沒有傳入參數,函數就會使用默認值。

注意,默認參數必須定義在參數列表的最後,在默認參數以後不能再定義必須參數,不然會報錯。

默認參數
print('默認參數')

def default_arg_function(name, age=18):
    print('姓名:', name)
    print('年齡:', age)

default_arg_function(name='阿飛', age=25)  # 給參數age賦予一個值
default_arg_function('小米')  # 使用age的默認值18
執行結果以下:
默認參數
姓名: 阿飛
年齡: 25
姓名: 小米
年齡: 18
2.4 可變參數

在某些狀況下,咱們不能在定義函數的時候就肯定參數的數量和內容,這時候就可使用可變參數。

可變參數在聲明時不會命名。

可變參數的格式以下:

some_function(*args, **kwargs):
	function body
可變參數
print('*args')

def variable_arg(*args):
    print(args)

variable_arg()
variable_arg(1, 2)
variable_arg('Hello 人工智能')
# '*args'參數獲取到的是一個元組

print('---------')
print('**kwargs')

def variable_kwarg(**kwargs):
    print(kwargs)

variable_kwarg()
variable_kwarg(name='人工智能')
# '**kwargs'參數獲取到的是一個字典,因此在調用函數時必須使用關鍵字參數的方式來傳遞參數
執行結果以下:
*args
()
(1, 2)
('Hello 人工智能',)
---------
**kwargs
{}
{'name': '人工智能'}

3 函數的變量做用域

被賦值的變量不是在哪裏均可以使用的,如何定義變量決定了變量能夠在哪裏被使用。

Python中變量賦值的位置決定了哪些範圍的對象能夠訪問這個變量,這個範圍就被稱爲做用域。

Python中有兩種最基本的變量做用域:局部變量和全局變量。

3.1 局部變量

通常狀況下,在函數內賦值的變量,不作特殊聲明的都是局部變量。

局部變量的做用域是局部的,在當前函數賦值則只能在當前函數使用。

函數定義時的參數也是局部變量,只能在函數體內被訪問,超出函數體就不能正常執行。

局部變量
print('局部變量')

def local_variable1():
    x = 'hello'
    print(x)  # 此句代碼若是寫在函數體外,則會報錯,由於這裏的x定義在函數體內,是局部變量

local_variable1()


def local_variable2(x):
    print(x)  # 此句代碼若是寫在函數體外,同樣會報錯,由於參數也是局部變量

local_variable2(10)
執行結果以下:
局部變量
hello
10
3.2 全局變量

在函數外賦值的變量就是全局變量,全局變量能夠在整個程序範圍內被訪問。

函數體內的從新賦值的相同變量名,並不會改變函數體外的全局變量;由於在函數體內定義一個相同的變量名,實際上是建立了一個新的變量,只是名字與函數體外的相同。

若是要在函數體內對全局變量進行修改,必定要使用 "global" 關鍵字。

全局變量
print('全局變量')

x = 'Hello Python'

def global_variable1():
    print(x)  # 這裏輸出的是全局變量x的值

global_variable1()


def global_variable2():
    x = 10
    print(x)  # 這裏輸出的是函數體內的局部變量x的值

global_variable2()


def global_variable3():
    global x
    x = 'Hi 人工智能'
    print(x)

global_variable3()
print(x)  # 驗證全局變量的值是否改變
執行結果以下:
全局變量
Hello Python
10
Hi 人工智能
Hi 人工智能

4 函數的返回值

想要獲取函數中的局部變量,可使用 "return" 關鍵字返回。

函數沒有return,賦值會獲得 "None" ;函數有return但沒有返回值,賦值也會獲得 "None" ;函數既有return又有返回值,就能夠經過賦值的方式獲取函數的返回值。

Python中函數的返回值能夠返回不止一個值;有多個返回結果時,Python會返回一個元組。

函數的返回值
print('返回值')

def ret():
    x = '局部變量'
    return x  # 返回x的值

result = ret()
print(result)

print('---------')

def no_return():
    print('沒有return')

def no_return_value():
    print('有return沒有返回值')
    return

def has_return():
    print('有return有返回值')
    x = 'has return value'
    return x

result1 = no_return()
print(result1)  # 輸出None

result2 = no_return_value()
print(result2)  # 輸出None

result3 = has_return()
print(result3)  # 輸出has return value

print('---------')
print('多個返回值')

def multi_return_value():
    r1 = '第一個返回值'
    r2 = '第二個返回值'
    r3 = '第三個返回值'
    return r1, r2, r3

result = multi_return_value()
print(result)
執行結果以下:
返回值
局部變量
---------
沒有return
None
有return沒有返回值
None
有return有返回值
has return value
---------
多個返回值
('第一個返回值', '第二個返回值', '第三個返回值')

5 Lambda表達式

Lambda表達式也稱做匿名函數。一般在須要一個函數、但又不想費神去命名它的時候,就可使用匿名函數。

Lambda表達式的格式以下:

lambda 參數名:返回值

以 "lambda" 開頭,表示這個是lambda表達式;以後的內容由 ":" 分爲兩部分, ":" 左邊的是函數的參數, ":" 右邊的是要返回的值;lambda表達式不須要用 "return" 關鍵字返回內容,函數會默認返回 ":" 右邊的值。

lambda表達式能夠賦值給變量。

lambda表達式通常在兩種狀況下使用:

​ (1)程序只執行一次,不須要定義函數名,使用lambda表達式方便定義,而且節省了內存中變量的定義;

​ (2)在某些函數中必須以函數做爲參數,可是函數自己十分簡單並且只在一處使用。

lambda表達式
print('lambda表達式')
f = lambda x, y: x + y  # x, y爲參數;x + y爲返回值
z = f(1, 2)  # 傳遞兩個實參
print(z)
執行結果以下:
lambda表達式
3
相關文章
相關標籤/搜索