一、函數的介紹
-
代碼重用
-
保持一致,易于維護
-
可擴展性
二、函數的定義及調用
2.1 函數的定義
-
函數代碼塊以?def?關鍵詞開頭,后接函數標識符名稱和圓括號?()
-
任何傳入參數和自變量必須放在圓括號中間,圓括號之間可以用于定義參數
-
函數的第一行語句可以選擇性地使用文檔字符串—用于存放函數說明
-
函數內容以冒號起始,并且縮進
-
return [表達式]?結束函數,選擇性地返回一個值給調用方。不帶表達式的return相當于返回 None
1
定義函數的語法:
2
3
4
def
函數名(參數):
5
函數體
6
返回值
1
#
示例
2
3
def
print_hello():
4
"""
5
打印hello
6
:return:
7
"""
8
print
(
"
hello
"
)
2.2 函數的調用
定義了函數之后,就相當于有了一個具有某些功能的代碼,想要讓這些代碼能夠執行,需要調用它
調用函數很簡單的,通過?函數名()?即可完成調用
1
#
示例:
2
print_hello()
#
調用函數
注意:
- 每次調用函數時,函數都會從頭開始執行,當這個函數中的代碼執行完畢后,意味著調用結束了
- 當然了如果函數中執行到了return也會結束函數
三、函數的返回值
在函數中添加返回值,需要使用return關鍵字
1
def
fun1():
#
無返回值
2
print
(
"
aa
"
)
3
4
def
fun2():
5
msg =
"
hello world
"
6
return
msg
#
返回msg,一個返回值
7
8
def
fun3():
9
return
1, 2, 3
#
返回多個返回值
10
11
aa = fun1()
#
接收函數的返回值
12
bb =
fun2()
13
cc =
fun3()
14
print
(aa)
15
print
(bb)
16
print
(cc)
17
18
#
輸出結果:
19
#
None
20
#
hello world
21
#
(1, 2, 3)
總結:
- 函數中如果沒有return語句返回,那么python函數會默認返回None
- 函數返回值數為0,函數默認返回None;函數返回值數為1是,則返回object;返回值數大于1時,則返回的是一個tuple
四、函數的參數
-
形參變量只有在被調用時才分配內存單元,在調用結束時,即刻釋放所分配的內存單元。因此,形參只在函數內部有效。函數調用結束返回主調用函數后則不能再使用該形參變量
-
實參可以是常量、變量、表達式、函數等,無論實參是何種類型的量,在進行函數調用時,它們都必須有確定的值,以便把這些值傳送給形參。因此應預先用賦值,輸入等辦法使參數獲得確定值
-
位置參數和關鍵字(標準調用:實參與形參位置一一對應;關鍵字調用:位置無需固定)
-
默認參數:放在參數列表的最后
-
參數組
4.1 普通參數
1
def
fun1(name):
#
name為形式參數
2
print
(name)
3
4
aa =
"
hello
"
5
fun1(aa)
#
aa為實參
4.2 默認參數
1
def
func(name, age=18
):
2
print
(
"
%s:%s
"
%
(name, age))
3
4
5
#
指定參數
6
func(
'
aa
'
, 19)
#
自定義傳入默認參數,以傳入的為準
7
func(
'
cc
'
, age=20
)
8
func(
'
bb
'
)
#
默認參數不傳,使用默認值
9
10
#
運行結果:
11
#
aa:19
12
#
cc:20
13
#
bb:18
4.3 動態參數
位置參數 > *動態參數 > 默認參數
1
def
func1(*
args):
2
print
(args)
3
print
(type(args))
#
元組
4
5
6
#
執行方式一
7
func1(11, 33, 4, 4454, 5
)
8
9
#
執行方式二
10
li = [11, 2, 2, 3, 3, 4, 54
]
11
func1(*li)
1
def
func2(**
kwargs):
2
print
(kwargs)
3
print
(type(kwargs))
#
4
5
6
#
執行方式一
7
func2(name=
'
wupeiqi
'
, age=18
)
8
9
#
執行方式二
10
dict1 = {
'
name
'
:
'
fyh
'
,
"
age
"
: 18,
'
gender
'
:
'
male
'
}
11
func2(**dict1)
注意:
- 加了星號(*)的變量args會存放所有未命名的變量參數,args為元組
- 而加**的變量kwargs會存放命名參數,即形如key=value的參數, kwargs為字典
1
#
萬能參數 可以接收任意的參數
2
def
func(*args, **
kwargs):
3
pass
五、函數的嵌套
1
def
func1():
2
print
(
"
hello world
"
)
3
4
5
def
func2():
6
print
(
"
aa
"
)
7
func1()
8
print
(
"
cc
"
)
9
10
11
func2()
#
按順序執行 先執行print("aa") --> func1() --> print("cc")
六、全局變量與局部變量
6.1 命名空間與作用域
命名空間:
1
.內置命名空間:python解釋內部運行時的變量函數
2
.全局命名空間:我們在py文件中直接聲明出來的變量、函數
3
.局部命名空間:在函數內部聲明的變量和函數
加載順序:
1
.內置命名空間
2
.全局命名空間
3
.局部命名空間
取值順序:
1
.局部命名空間
2
.全部命名空間
3
.內置命名空間
作用域:
1.全局作用域:全局命名空間 +
內置命名空間
2
.局部作用域:局部命名空間
可以通過globals()函數來查看全局作用域中的內容,也可以locals()查看當前作用域中的內容
6.2 全局變量與局部變量
1
#
示例
2
def
fun1():
3
name =
"
aa
"
4
print
(name)
報錯的原因:試圖訪問局部變量而報的錯
6.2.1 局部變量和全局變量名一樣
- 全局變量與局部變量名一致,函數內部會優先使用局部變量
- 修改局部變量不會影響到全局變量
1
name =
"
bb
"
2
def
print_name():
3
name =
"
aa
"
4
print
(name)
5
6
print_name()
7
print
(name)
8
#
打印的結果為
9
#
aa
10
#
bb
6.2.2 global關鍵字
使用global關鍵字:則會告訴python編譯器,這個變量是全局變量而不是局部變量,這樣在函數體內修改變量會影響全局了
1
name =
"
bb
"
2
def
print_name():
3
global
name
4
name =
"
aa
"
5
print
(name)
6
print_name()
7
print
(name)
8
#
打印的結果:
9
#
aa
10
#
aa
6.2.3 nonlocal關鍵字
1
def
fun1():
2
num = 1
3
4
def
fun2():
5
nonlocal num
#
此處不能使用global,只能使用nonlocal
6
num += 1
7
return
num
8
return
fun2
9
10
11
aa =
fun1()
12
print
(aa())
七、函數名的本質
函數名本質上就是函數的內存地址
7.1 可以被引用
1
def
func():
2
print
(
'
in func
'
)
3
4
5
f =
func
6
print
(f)
#
7.2? 可以被當作容器類型的元素
1
def
f1():
2
print
(
'
f1
'
)
3
4
5
def
f2():
6
print
(
'
f2
'
)
7
8
9
def
f3():
10
print
(
'
f3
'
)
11
12
13
l =
[f1, f2, f3]
14
d = {
'
f1
'
: f1,
'
f2
'
: f2,
'
f3
'
: f3}
15
#
調用
16
l[0]()
17
d[
'
f2
'
]()
7.3 可以作為函數的參數或返回值
7.3.1 作為函數的參數
1
def
func1():
2
print
(
"
aa
"
)
3
4
5
def
func2(f2):
6
f2()
7
8
9
func2(func1) # 作為函數的參數
7.3.2 作為返回值
1
def
func1():
2
3
def
func2():
4
print
(
"
bb
"
)
5
return
func2
#
作為返回值
6
7
8
f =
func1()
9
f()
八、匿名函數
語法格式: lambda [形參 1 ], [形參 2 ], ... : [單行表達式] 或 [函數調用]
1
#
不帶參數
2
my_fun =
lambda
: 10 + 20
3
#
帶參數
4
my_add =
lambda
a, b: a +
b
5
my_add()
-
函數的參數可以有多個,多個參數之間用逗號隔開
-
匿名函數不管多復雜,只能寫一行,且邏輯結束后直接返回數據
-
返回值和正常的函數一樣,可以是任意數據類型
?
1
def
my_function(func):
2
3
a = 100
4
b = 200
5
#
把 cucalate_rule 當做函數來調用
6
result =
func(a, b)
7
print
(
'
result:
'
, result)
8
9
10
my_function(
lambda
a, b: a + b)
九、高階函數
9.1 sorted 排序
語法:sorted(Iterable, key=None, reverse=
False)
Iterable:可迭代對象
key:排序規則(排序函數),在sorted內部會將可迭代對象中的每一個對象傳遞給這個函數的參數,根據函數的運算結果進行排序
1
lst = [5, 7, 6, 12, 1, 13, 9, 18, 5
]
2
#
lst.sort() # sort是list里面的方法
3
#
print(lst)
4
new_lst = sorted(lst, reverse=True)
#
內置函數,返回給你一個新列表,新列表是被排序的
5
print
(new_lst)
6
7
8
#
給列表排序,按照字符串的長度進行排序
9
lst2 = [
"
大陽哥
"
,
"
尼古拉斯
"
,
"
趙四
"
,
"
劉能
"
,
"
廣坤
"
,
"
謝大腳
"
]
10
11
12
def
func(st):
13
return
len(st)
14
15
16
new_lst = sorted(lst2, key=func)
#
內部,把可迭代對象中的每一個元素傳遞給func
17
#
new_lst = sorted(lst2, key=lambda x: len(x)) # 也可以使用匿名函數
18
print
(new_lst)
9.2 filter 過濾
filter(過濾):遍歷序列中的每個元素,判斷每個元素得到布爾值,如果是True則留下來,組成新的迭代器
語法:filter(function, Iterable) 返回一個迭代器
function:用來篩選的函數,在filter中會自動的把iterable中的元素傳遞給function,然后根據function返回的True或者False來判斷是否保留次數據
Iterable:可迭代對象
1
list1 = [
"
1111aaa
"
,
"
2222aaa
"
,
"
3333aaa
"
,
"
4444
"
,
"
5555
"
,
"
6666
"
]
2
list2 = filter(
lambda
x: x.endswith(
"
aaa
"
), list1)
#
有過濾的作用
3
print
(list(list2))
4
#
運行結果:['1111aaa', '2222aaa', '3333aaa']
9.3 map 映射
語法:map(function, Iterable)
map處理序列中的每個元素,得到一個結果(迭代器),該迭代器元素個數與位置不變
1
list1 = [1, 2, 3, 4, 5
]
2
list2 = map(
lambda
x: x+1, list1)
#
map的第一個參數為函數,后面的參數為可迭代對象
3
print
(list(list2))
4
#
結果:[2, 3, 4, 5, 6]
5
6
lst1 = [1, 2, 3, 4, 5
]
7
lst2 = [2, 4, 6, 8, 9
]
8
9
10
print
(list(map(
lambda
x, y: x+
y, lst1, lst2)))
11
#
結果:[3, 6, 9, 12, 14]
9.4 reduce
reduce 處理一個序列,把序列進行合并操作
from
functools
import
reduce
list1
= [1, 2, 3, 4, 5
]
aa
= reduce(
lambda
x, y: x+y, list1)
#
前一個參數的函數必須是兩個參數
print
(aa)
#
運行結果:15
?十、遞歸函數
1
"""
2
1! = 1
3
2! = 2 × 1 = 2 × 1!
4
3! = 3 × 2 × 1 = 3 × 2!
5
4! = 4 × 3 × 2 × 1 = 4 × 3!
6
...
7
n! = n × (n-1)!
8
使用遞歸實現
9
"""
10
11
12
def
cal_num(num):
13
if
num >= 1
:
14
result = num * cal_num(num - 1
)
15
else
:
16
result = 1
17
return
result
18
19
20
print
(cal_num(3))
執行原理:
?
遞歸的執行深度調整:
1
import
sys
2
sys.setrecursionlimit(10000)
#
可以調整遞歸深度,但是不一定跑到這里
#
斐波那契數列:就是前兩個數的和為后一個數的值(0,1,1,2,3,5,8,13.........):
#
計算第n個數的值
def
foo(num):
"""
實現斐波那契數列
:param num: 第幾個數
:return:
"""
if
num <=
0:
return
0
elif
num == 1
:
return
1
else
:
return
foo(num - 1) + foo((num - 2))
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

