1. 程式人生 > >10、函數

10、函數

foo 保持 value color insert == int wrap 關鍵字

一 為何使用函數

沒有函數會有什麽問題?

1.無組織無結構,代碼冗余
2.可讀性差
3.無法統一管理且維護成本高

總結使用函數的好處:

1.代碼重用

2.保持一致性,易維護

3.可擴展性

二 函數的分類

在python中函數分兩類:內置函數,自定義函數

 1 #內置函數
 2 # sum
 3 # max
 4 # min
 5 #
 6 # a=len(‘hello‘)
 7 # print(a)
 8 #
 9 # b=max([1,2,3])
10 # print(b)

 1 #自定義函數
 2 
 3 # # ******
 4 # # ******
 5 # # ******
 6
# # hello world 7 # # ****** 8 # # ****** 9 # # ****** 10 # 11 def print_star(): 12 print(#*6) 13 14 def print_msg(): 15 print(hello world) 16 17 print_star() 18 print_star() 19 print_star() 20 print_msg() 21 print_star() 22 print_star() 23 print_star()

三 函數的返回值

3.1 返回值的定義

1 def foo():
2 print(from foo) 3 return None 4 res=foo() 5 print(res)
PS‘‘‘
以三種情況返回值都為None:
沒有return
return 什麽都不寫
return None
‘‘‘
1 def foo():
2     print(from foo)
3     x=1
4     return x
5 res=foo()
6 print(res)

3.2 return 一個值 函數調用返回的結果就是這個值

1 def foo():
2     print(from foo)
3     x=1
4     return
1,[2,3],(4,5),{} 5 res=foo() 6 print(res) #打印結果:(1,[2,3],(4,5),{}) 7 a,b,c,d=foo() 8 print(d)

3.3 return 值1,值2,值3,... 返回結果:(值1,值2,值3,...)

1 t=(1,2,3)
2 a,_,_=t
3 print(a)
4 
5 t=(1,2,3,4,5,6,7,8,9)
6 a,*_,c=t
7 print(a)
8 print(c)

四 自定義函數詳解

4.1 為什麽要定義函數?:先定義後使用,如果沒有定義而直接使用,就相當於引用了一個不存在的變量名

1 foo()
2 def foo():
3     print(from foo)
4 print(foo)
5 
6 #錯誤的方式

4.2 函數的使用包含兩個階段:定義階段和使用階段

1 # 語法
2 # def 函數名(參數1,參數2,...):
3 #     """文檔註釋"""
4 #     函數體
5 #     return 值
6 
7 # x=len(‘hello‘)
8 # print(x)

4.3 定義函數的三種形式

1、無參數函數:如果函數的功能僅僅只是執行一些操作而已,就定義成無參函數,無參函數通常都有返回值
1 def print_star(): 2 print(#*6)

2、定義有參函數:函數的功能的執行依賴於外部傳入的參數,有參函數通常都有返回值
1 def my_max(x,y): 2 res=x if x >y else y 3 return res

 1 # 三元表達式
 2 x=10
 3 y=2
 4 # if x > y:
 5 #     print(x)
 6 # else:
 7 #     print(y)
 8 #
 9 # res=x if x > y else y
10 # print(res)
3、空函數
 1 # def auth():
 2 #     """認證功能"""
 3 #     pass
 4 # auth()
 5 def insert():
 6     """插入功能"""
 7     pass
 8 def select():
 9     """查詢功能"""
10     pass
11 def delete():
12     """刪除功能"""
13     pass
14 def update():
15     """更新功能"""
16     pass

五 調用函數

 1 def foo():
 2     print(from foo)
 3 
 4 def bar(name):
 5     print(bar===>,name)
 6 
 7 #按照有參和無參可以將函數調用分兩種
 8 foo() #定義時無參,調用時也無需傳入參數
 9 bar(egon) #定義時有參,調用時也必須有參數
10 
11 
12 #按照函數的調用形式和出現的位置,分三種
13 
14 foo() #調用函數的語句形式
15 
16 def my_max(x,y):
17     res=x if x >y else y
18     return res
19 
20 # res=my_max(1,2)*10000000 #調用函數的表達式形式
21 # print(res)
22 
23 
24 res=my_max(my_max(10,20),30) #把函數調用當中另外一個函數的參數
25 print(res)

六 函數參數

6.1 從大的角度去看,函數的參數分兩種:形參(變量名),實參(值)

1 #定義階段
2 # def foo(x,y): #x=1,y=2
3 #     print(x)
4 #     print(y)
5 
6 #調用階段
7 # foo(1,2)

6.2 詳細的區分函數的參數分為五種:

# 位置參數,關鍵字參數,默認參數,可變長參數(*args,**kwargs),命名關鍵字參數
1)位置參數
1 # def foo(x,y,z):#位置形參:必須被傳值的參數
2 #     print(x,y,z)
3 #
4 # # foo(1,2,3)
5 # foo(1,2,3) #位置實參數:與形參一一對應

2)關鍵字參數:key=value

 1 def foo(x,y,z):
 2     print(x,y,z)
 3 
 4 # foo(z=3,x=1,y=2)
 5 
 6 #關鍵字參數需要註意的問題:
 7 # 1:關鍵字實參必須在位置實參後面
 8 # 2: 不能重復對一個形參數傳值
 9 # foo(1,z=3,y=2) #正確
10 # foo(x=1,2,z=3) #錯誤
11 
12 # foo(1,x=1,y=2,z=3)

3)默認參數

 1 # def register(name,age,sex=‘male‘): #形參:默認參數
 2 #     print(name,age,sex)
 3 #
 4 # register(‘asb‘,age=40)
 5 # register(‘a1sb‘,39)
 6 # register(‘a2sb‘,30)
 7 # register(‘a3sb‘,29)
 8 #
 9 # register(‘鋼蛋‘,20,‘female‘)
10 # register(‘鋼蛋‘,sex=‘female‘,age=19)
11 
12 #默認參數需要註意的問題:
13 #一:默認參數必須跟在非默認參數後
14 # def register(sex=‘male‘,name,age): #在定義階段就會報錯
15 #     print(name,age,sex)
16 
17 #(了解)二:默認參數在定義階段就已經賦值了,而且只在定義階段賦值一次
18 # a=100000000
19 # def foo(x,y=a):
20 #     print(x,y)
21 # a=0
22 # foo(1)
23 
24 #三:默認參數的值通常定義成不可變類型

4)可變長參數

 1 def foo(x,y,*args): #*會把溢出的按位置定義的實參都接收,以元組的形式賦值給args
 2     print(x,y)
 3     print(args)
 4 #
 5 # foo(1,2,3,4,5)
 6 
 7 
 8 # def add(*args):
 9 #     res=0
10 #     for i in args:
11 #         res+=i
12 #     return res
13 # print(add(1,2,3,4))
14 # print(add(1,2))
15 
16 
17 
18 # def foo(x, y, **kwargs):  # **會把溢出的按關鍵字定義的實參都接收,以字典的形式賦值給kwargs
19 #     print(x, y)
20 #     print(kwargs)
21 # foo(1,2,a=1,name=‘egon‘,age=18)

示例:

 1 def foo(name,age,**kwargs):
 2     print(name,age)
 3     if sex in kwargs:
 4         print(kwargs[sex])
 5     if height in kwargs:
 6         print(kwargs[height])
 7 
 8 foo(egon,18,sex=male,height=185)
 9 foo(egon,18,sex=male)
10 
11 
12 命名關鍵字參數(了解)
13 
14 def foo(name,age,*,sex=male,height):
15     print(name,age)
16     print(sex)
17     print(height)
18 #*後定義的參數為命名關鍵字參數,這類參數,必須被傳值,而且必須以關鍵字實參的形式去傳值
19 foo(egon,17,height=185)
20 
21 
22 
23 def foo(name,age=10,*args,sex=male,height,**kwargs):
24 def foo(name,age=10,*args,sex=male,height,**kwargs):
25     print(name)
26     print(age)
27     print(args)
28     print(sex)
29     print(height)
30     print(kwargs)
31 
32 foo(alex,1,2,3,4,5,sex=female,height=150,a=1,b=2,c=3)
33 
34 
35 def foo(*args):
36     print(args)
37 
38 foo(1,2,3,4) # 1,2,3,4 <=====>*(1,2,3,4)
39 
40 *[A,B,C,D],=====>A,B,C,D
41 foo(*[A,B,C,D]) #foo(‘A‘,‘B‘,‘C‘,‘D‘)
42 foo([A,B,C,D]) #
43 
44 def foo(x,y,z):
45     print(x,y,z)
46 
47 # foo(*[1,2,3]) #foo(1,2,3)
48 foo(*[1,2]) #foo(1,2)
49 
50 
51 def foo(**kwargs):
52     print(kwargs)
53 
54 #x=1,y=2  <====>**{‘y‘: 2, ‘x‘: 1}
55 # foo(x=1,y=2)
56 
57 foo(**{y: 2, x: 1,a:1}) #foo(a=1,y=2,x=1)
58 
59 def foo(x,y,z):
60     print(x,y,z)
61 
62 # foo(**{‘z‘:3,‘x‘:1,‘y‘:2}) #foo(x=1,z=3,y=2)
63 foo(**{z:3,x:1}) #foo(x=1,z=3)
64 
65 
66 def foo(x,y,z):
67     print(from foo,x,y,z)
68 
69 def wrapper(*args,**kwargs):
70     print(args)
71     print(kwargs)
72 
73 
74 wrapper(1,2,3,a=1,b=2)
75 
76 
77 
78 def foo(x,y,z):
79     print(from foo,x,y,z)
80 def wrapper(*args,**kwargs):
81     print(args) #args=(1,2,3)
82     print(kwargs) #kwargs={‘a‘:1,‘b‘:2}
83     foo(*args,**kwargs) #foo(*(1,2,3),**{‘a‘:1,‘b‘:2}) #foo(1,2,3,b=2,a=1)
84 # wrapper(1,2,3,a=1,b=2)
85 wrapper(1,z=2,y=3)
86 
87 
88 
89 def foo(x,y,z):
90     print(from foo,x,y,z)
91 def wrapper(*args,**kwargs):
92     # print(args) #args=(1,)
93     # print(kwargs) #kwargs={‘y‘:3,‘z‘:2}
94     foo(*args,**kwargs) #foo(*(1,),**{‘y‘:3,‘z‘:2}) #foo(1,z=2,y=3)
95 # wrapper(1,2,3,a=1,b=2)
96 wrapper(1,z=2,y=3)

PS:註意

1 #補充:函數定義階段到底幹了什麽事情:只檢測函數體的語法,並不會執行
2 # def bar():
3 #     x
4 #     if 1 >2:
5 #           print(‘====>‘)
6 #
7 # bar()




10、函數