一、Python函數的定義和規則:
1、規則:
- 函數代碼塊以 def 關鍵詞開頭,後接函數標識符名稱和圓括號 ()。
- 任何傳入參數和自變量必須放在圓括號中間,圓括號之間可以用於定義參數。
- 函數的第一行語句可以選擇性地使用文檔字符串—用於存放函數說明。
- 函數內容以冒號起始,並且縮進。
- return [表達式] 結束函數,選擇性地返回一個值給調用方。不帶表達式的return相當於返回 None。
2、函數的作用:
(1)、提高應用的模塊性
(2)、提高代碼的重複利用率
(3)、用來實現單一,或相關聯功能的代碼段
3、定義
語法:
def 函數名(參數列表):
函數體
實例:
def hello():
"""
僅用於展示函數定義
:return:
"""
print("Hello World")
hello() # 函數調用
# 計算面積函數
def area(width, height):
"""
根據寬高計算面積
:param width: 寬度
:param height: 高度
:return: 面積
"""
return width * height
def print_welcome(name):
"""
根據傳入的名字打印歡迎"名字"
:param name:傳入的名字
:return: 打印語句
"""
print("Welcome", name)
print_welcome("Wangdoudou")
w = 4
h = 5
print("width =", w, " height =", h, " area =", area(w, h))
二、函數的具體使用
1、參數傳遞
(1)、可更改(mutable)對象:列表、字典,修改的跟原來的是同一個引用
def changeme(mylist):
"""
修改傳入的列表
:param mylist:
:return:
"""
mylist.append([1, 2, 3, 4])
print("函數內取值: ", mylist)
return
# 調用changeme函數
mylist = [10, 20, 30]
changeme(mylist)
print("函數外取值: ", mylist)
(2)、不可更改(immutable)對象:字符串、數字、元組,傳參時相當於重新生成了對象
a = "wangdoudou"
b = 15
def Changestr(a):
a = "haha"
def Changenum(b):
b = 20
Changestr(a)
Changenum(b)
print("a = ", a)
print("b = ", b)
2、函數參數:
函數定義時的參數爲形參:調用時才分配內存單元,調用結束釋放內存
調用函數時傳入的參數值爲實參
參數類型:
(1)、必需參數:須以正確的順序傳入函數。調用時的數量必須和聲明時的一樣
def printme(str):
"""
打印任何傳入的字符串
:param str:
:return:
"""
print(str)
return
# 調用printme函數
printme("函數定義了幾個參數,就必須傳入幾個參數")
(2)、關鍵字參數:允許函數調用時參數的順序與聲明時不一致,因爲 Python 解釋器能夠用參數名匹配參數值
def printinfo(name, age):
"""
打印任何傳入的字符串
:param name: 名字
:param age: 年齡
:return:
"""
print("名字: ", name)
print("年齡: ", age)
return
# 調用printinfo函數
printinfo(age=50, name="wangdoudou")
(3)、默認參數:調用函數時,如果沒有傳遞參數,則會使用默認參數
def printinfo(name, age=35):
"""
打印用戶的名字和年齡
:param name:
:param age:
:return:
"""
print("名字: ", name)
print("年齡: ", age)
return
# 調用printinfo函數
printinfo(age=50, name="wangdoudou")
print("------------------------")
printinfo(name="wangdoudou")
(4)、不定長參數:處理比聲明時更多的參數
一個星號*:參數會以元組(tuple)的形式導入,存放所有未命名的變量參數
基本語法:
def functionname([formal_args,] *var_args_tuple ):
"函數_文檔字符串"
function_suite
return [expression]
def printinfo(arg1, *vartuple):
print("輸出: ")
print(arg1)
print(vartuple)
for var in vartuple:
print(var)
return
# 調用printinfo 函數
printinfo(10)
printinfo(70, 60, 50)
兩個星號**:參數會以字典的形式導入
基本語法:
def functionname([formal_args,] **var_args_dict ):
"函數_文檔字符串"
function_suite
return [expression]
def printinfo(arg1, **vardict):
print("輸出: ")
print(arg1)
print(vardict)
# 調用printinfo 函數
printinfo(1, a=2, b=3)
一個星號和兩個星號一塊用:可接受任意長度,任意類型的參數
def test(x, *args, **kwargs):
print(x)
print(args, args[3])
print(kwargs, kwargs['y'])
test(1, 2, 3, 4, 5, 6, 7, y="hehe", z=110)
聲明函數時,參數中星號 * 可以單獨出現,如果單獨出現星號 * 後的參數必須用關鍵字傳入:
def f(a,b,*,c):
return a+b+c
錯誤調用:f(1,2,3)
正確調用:f(1,2,c=3)
5、return語句:return [表達式] 語句用於退出函數,選擇性地向調用方返回一個表達式。不帶參數值的return語句返回None
def sum(arg1, arg2):
"""
返回2個參數的和
:param arg1:
:param arg2:
:return: 返回2個參數的和
"""
total = arg1 + arg2
print("函數內 : ", total)
return total
# 調用sum函數
total = sum(10, 20)
print("函數外 : ", total)
三、匿名函數:python 使用 lambda 來創建匿名函數,不再使用 def 語句這樣標準的形式定義一個函數
1、定義
語法:
lambda [arg1 [,arg2,.....argn]]:expression
實例:
sum = lambda arg1, arg2: arg1 + arg2
print("相加後的值爲 : ", sum(10, 20))
2、特性:
- lambda 只是一個表達式,函數體比 def 簡單很多。
- lambda 的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去。
- lambda 函數擁有自己的命名空間,且不能訪問自己參數列表之外或全局命名空間裏的參數。
- lambda 函數的目的是調用小函數時不佔用棧內存從而增加運行效率。
四、變量作用域:變量的作用域決定了在哪一部分程序可以訪問哪個特定的變量名稱
1、變量作用域類型
- L (Local) 局部作用域
- E (Enclosing) 閉包函數外的函數中
- G (Global) 全局作用域
- B (Built-in) 內建作用域
作用域排序:以 L –> E –> G –>B 的規則查找,即:在局部找不到,便會去局部外的局部找(例如閉包),再找不到就會去全局找,再者去內建中找
示例:
x = int(2.9) # 內建作用域
g_count = 0 # 全局作用域
def outer():
o_count = 1 # 閉包函數外的函數中
def inner():
i_count = 2 # 局部作用域
Tips:Python 中只有模塊(module),類(class)以及函數(def、lambda)纔會引入新的作用域,其它的代碼塊(如 if/elif/else/、try/except、for/while等)是不會引入新的作用域的,也就是說這些語句內定義的變量,外部也可以訪問
2、全局變量和局部變量:定義在函數內部的變量擁有一個局部作用域,定義在函數外的擁有全局作用域,局部變量只能在其被聲明的函數內部訪問,而全局變量可以在整個程序範圍內訪問。調用函數時,所有在函數內聲明的變量名稱都將被加入到作用域中。
實例:
total = 0 # 這是一個全局變量
def sum(arg1, arg2):
total = arg1 + arg2 # total在這裏是局部變量.
print("函數內是局部變量 : ", total)
return total
# 調用sum函數
sum(10, 20)
print("函數外是全局變量 : ", total)
3、global 關鍵字:內部作用域修改外部作用域的變量
實例:
num = 1
def fun1():
global num # 使用 global 關鍵字修改外部變量
print(num)
num = 123
print(num)
fun1()
print(num)
4、nonlocal關鍵字:修改嵌套作用域(enclosing 作用域,外層非全局作用域)中的變量
實例:
def outer():
num = 10
def inner():
nonlocal num # nonlocal關鍵字聲明
print(num)
num = 100
print(num)
inner()
print(num)
outer()
五、函數作用域:輸出的結果是從當前運行的代碼塊開始,然後逐級向上運行
name = "wangdoudou"
def printname():
name = "wangdoudou1"
def test():
name = "wangdoudou2"
print(name)
return test
# 第一種執行方式
printname()()
# 第二種執行方式
res = printname()
res()
輸出結果: