Python 函式和內建函式
阿新 • • 發佈:2018-12-31
函式
- 程式碼的一種組織形式
- 一個函式一般完成一項特定的功能
函式使用
- 函式需要先定義
- 使用函式,俗稱呼叫
定義一個函式
- 只是定義的話不會執行
- def 函式名()
- 函式名自己定義,起名需要遵循命名規則,約定俗成,大駝峰只給類用
- 後面括號和冒號不能省,括號內可以有引數
- 函式內所有程式碼縮排
def func()
print("hello python!")
函式的呼叫
- 定義函式時有引數,呼叫時也要有引數,定義時沒有引數,呼叫時也沒有,收集引數,預設引數除外
- 函式名後面跟括號
func()
函式的引數和返回值
引數
- 負責給函式傳遞一些必要的資料或者資訊 - 引數分類:普通引數,預設引數,關鍵字引數,收集引數 - 普通引數:定義的時候直接定義變數名,呼叫的時候直接把變數或者值放入指定位置 def 函式名(引數1,引數2......) 函式體 #呼叫 函式名(value1,value2......) #呼叫的時候,具體值參考的是位置,按位置賦值 - 形參(形式引數):在函式定義的時候用到的引數,沒有具體值,只是一個佔位符號,稱為形參(引數1,引數2......)形參定義 - 實參(實際引數):在呼叫的時候輸入的值(value1,value2......)實參呼叫 def hello(person): print("(0),你好".format(person)) p = "girl" hello(p) #girl,你好 - 引數person只是一個符號,代表的是呼叫時候的某個資料 - 呼叫的時候,會用p代替函式中所有的person - 預設引數 - 形參具有預設值 - 呼叫的時候如果沒有對應的形參賦值,則使用預設值 def func_name(p1=v1,p2=v2......) func_block #呼叫1 func_name() #呼叫2 value1 = 100 value2 = 200 func_name(value1,value2) 示例: #報名函式,需要知道學生性別 #學習Python的學生基本都是男生,所以,報名的時候如果沒有特別指定,我們認為是男生 def reg(name,age,gender="male"): if gender == "male": print("{0} is {1},he is a good student".format(name,age)) else: print("{0} is {1},she is a good student".format(name,age)) reg("xiaoming",21) reg("xiaohong",19,"female") #xiaoming is 21,he is a good student xiaohong is 19,she is a good student - 關鍵字引數 語法: def func(p1=v1,p2=v2......) func_body - 比較麻煩,但有好處: - 不容易混淆,一般實參和形參只是按照位置一一對應即可,容易出錯 - 使用關鍵字引數,可以不考慮引數位置 def stu_key(name,age,addr): print("{} is {},住在{}".format(name,age,addr)) n = "xiaoming" a = 16 addr = "china" stu_key(age=a,name=n,addr=addr) #xiaoming is 16,住在china - 收集引數 - 把沒有位置,不能和定義時的引數位置相對應的引數,放入一個特定的資料結構中 - 語法: def func(*args): func_body #可以按照list使用方式訪問args得到傳入的引數 #呼叫 func(p1,p2......) - 引數名args不是必須這麼寫,但是推薦用args,約定俗成 - 引數名args前需要星號,表示收集引數 - 收集引數可以和其他函式並存 - 示例: “”“”“” 函式模擬一個學生進行自我介紹,但具體內容不清楚 把args看做tuple “”“”“” def stu(*args): print("hello") for item in args: print(item) stu("xiaoming", 22, "heilongjiang") stu("xiaohong") stu() #收集引數可以不帶任何實參呼叫,此時收集引數為空tuple #hello xiaoming 22 heilongjiang hello xiaohong hello - 如果使用關鍵字引數格式呼叫,會出問題 - 收集引數之關鍵字收集引數 - 把關鍵字引數按字典格式存入收集引數 - 語法: def func(**kwargs): func_body #呼叫 func(p1=v1,p2=v2......) - 約定俗成用kwargs - 呼叫的時候,把多餘的關鍵字引數放入kwargs - 訪問kwargs需要按照字典格式訪問 #案例1: def stu(**kwargs): print("hello") for k,v in kwargs.items(): print(k,"---",v) stu(name="xiaoming", age=22, addr="heilongjiang") stu() #hello name---xiaoming age---22 addr---heilongjiang hello #案例2 def func(*args,**kwargs) : print(args) print(kwargs) func(1,2,3,a=4,b=5,c=6) func(*(1,2,3),**{"a":4,"b":5,"c":6}) #(1, 2, 3) {'a': 4, 'b': 5, 'c': 6} (1, 2, 3) {'a': 4, 'b': 5, 'c': 6}
返回值
- 函式和過程的區別:有無返回值 - 函式的執行結果 - 使用return關鍵字,如果沒有return,預設返回一個none - 函式執行後返回值 - 函式一旦執行return語句,則無條件返回,即結束函式的執行 - 推薦寫法:不論有沒有返回值,都以return結束 案例1: def hello(person): print("(0),你好".format(person)) return "end" print("hello") p = "girl" rst = hello(p) print(rst) #girl,你好 end 案例2: def func1(): print("func1") a = func1() print(a) print("*"*10) def func2(): print("func2") return "ok" b = func2() print(b) #func1 None ********** func2 ok
Python內建函式
Python簡單內建函式
- 內建物件檢視:dir
- 常見函式:len(求長度),min(求最小值),max(求最大值),sorted(排序),reversed(反向),sum)(求和)
- 進位制轉換函式:bin(轉換為二進位制),oct(轉換為八進位制),hex(轉換為十六進位制),ord(字元轉ASCII碼),chr(ASCII碼轉字元)
dir
- dir():檢視當前模組的屬性列表
- dir([ ])檢視列表的方法,也可以檢視字典等基本型別。
a = "sdfgfd"
常見函式
- 作用於字串,列表等
a = sdfgfd
- len(a) #6
- sorted(a) #['d', 'd', 'f', 'f', 'g', 's']
- reversed(a) #<reversed at 0x7f254db0f080>
- list(reversed(a)) #['d', 'f', 'g', 'f', 'd', 's']
Python高階內建函式
- enumerate,exec,map,eval,filter,zip
enumerate
- 根據可迭代物件建立列舉物件
seasons = ["spring","summer","fall","winter"]
list(enumerate(seasons))
#[(0,spring),(1,summer),(2,fall),(3,winter)]
list(enumerate(seasons,start=1)) #指定起始值
#[(1,spring),(2,summer),(3,fall),(4,winter)]
eval
- 取出字串中的內容
- 將字串str當成有效的表示式來求值並返回結果
- 計算指定表示式的值
x = 10
def func():
y = 20 #區域性變數y
a = eval("x+y")
print("a:",a) #x沒有就呼叫全域性變數
b = eval("x+y",{"x":1,"y":2}) #定義區域性變數,優先呼叫
print("b:",b)
c = eval("x+y",{"x":1,"y":2},{"y":3,"z":4})
print("c:",c)
d = eval("print(x,y)")
print("d:",d) #對於變數d,因為print()函式不是一個計算表示式,因此沒有返回值
func()
#a:30
b:3
c:4
10 20
d:None
exec
-exec可以執行復雜的Python程式碼,而不像eval函式那樣只能計算一個表示式的值,返回值永遠為none
x = 10
def func():
y = 20
a = exec("x+y")
print("a:",a)
b = exec("x+y",{"x":1,"y":2})
print("b:",b)
c = exec("x+y",{"x":1,"y":2},{"y":3,"z":4})
print("c:",c)
d = exec("print(x,y)")
print("d:",d)
func()
#a:None
b:None
c:None
10 20 #為exec("print(x,y)")的結果
d:None
示例2:
i = 2
j = 3
exec("ans=i+j")
print("answer is:",ans) #answer is 5
map
map會接收一個函式f和一個list,並通過把函式f依次作用在list的每個元素上,得到一個新的list並返回,會根據提供的函式對指定序列做對映
def square(x):
return x ** 2
list(map(square,[1,2,3,4,5])) #計算列表各個元素的平方
#[1,4,9,16,25]
list(map(lambda x,y:x+y,[1,3,5,7])) #使用lambda匿名函式
#[1,9,25,49]
lambda表示式,通常是在需要一個函式,但是不想去命名一個函式的場合下使用的
add = lambda x,y:x+y
lambda 引數: 表示式
filter
filter函式用於過濾序列,過濾掉不符合條件的元素,返回一個迭代物件,如果要轉換成列表,可以用list來轉換
list(filter(lambda x:x%2==0,range(1,10))) #[2, 4, 6, 8]
zip
zip函式用於將可迭代的物件作為引數,將物件中對應的元素打包成一個個元組,然後返回由這些元素組成的物件,好處是節約記憶體,可以用list轉換輸出列表
a = [1,2,3]
b = [4,5,6]
c = [4,5,6,7,8]
list(zip(a,b)) #[(1,4),(2,5),(3,6)] #把返回的物件轉換成列表
list(zip(a,c)) #[(1,4),(2,5),(3,6)] #元素個數與最短的一致
zip(*)正好相反用於解壓
案例:
a = [1,2,3]
def stu(*args):
print(args)
for i in args:
print(i)
stu(*a)
#(1, 2, 3)
1
2
3
函式文件
- 函式的文件的作用是對當前函式提供使用相關的參考資訊
文件的寫法
- 在函式內部開始的第一行使用三引號字串定義符
- 一般具有特定格式
文件檢視
- 使用help函式,形如help(func)
- 使用__doc__
def stu(age,name,*args):
"""
hello
everyone
"""
print("這是文件")
help(stu)
print(stu.__doc__)
# stu(age, name, *args)
hello
everyone
hello
everyone