Python基礎之函數
一、函數基礎
1、函數概念:
函數是指將一組語句的集合通過一個名字(函數名)封裝起來,要想執行這個函數,只需調用其函數名即可
2、函數的作用
(1)減少重複代碼
(2)使程序變的可擴展
(3)使程序變得易維護
3、語法定義
def sayhi(x): #函數名 ’’’函數說明’’’ print("Hello, I'mnobody!") return x #函數返回值 sayhi() #調用函數
關鍵字說明:
def:創建函數
sayhi():函數名
print("Hello, I'm nobody!"):函數體
return():返回值
sayhi() #調用函數
4、函數的執行過程
定義函數,在程序執行過程中,函數體不執行,只有當程序調用函數時,函數纔會執行。
函數執行過程:
def f1(): print(123) return "111" #在函數中,一旦執行return,函數執行過程立即終止 print(456) r = f1() #只有調用函數時,函數纔會執行 print(r) #打印函數返回值
5、函數的返回值
(1)返回值數量爲0時,返回None
(2)返回值數量等於1時,返回object
(3)返回值數量大於1時,返回tuple
deftest(): print("first") #沒有返回值 deftest2(): print("second") return 2 #返回值數量爲1時 deftest3(): print("three") return3,"dayi123",{"age":18,'name':"yiliu"} #返回值數量多個時 one =test() two =test2() three= test3() print(one) print(two) print(three)
二、函數的參數
1 函數的基本參數
(1)、普通參數
1)形參:變量只有在被調用時才分配內存單元,在調用結束時,即刻釋放所分配的內存單元。因此,形參只在函數內部有效。函數調用結束返回主調用函數後則不能再使用該形參變量
2)實參:可以是常量、變量、表達式、函數等,無論實參是何種類型的值,在進行函數調用時,它們都必須有確定的值,以便把這些值傳送給形參。因此應預先用賦值,輸入等辦法使參數獲得確定值
def send(xxoo,content): #xxoo、content爲實參 print(xxoo,content) print("發送郵件成功:",xxoo,content) return True send(dayi, is) #dayi、is爲形參
(2)、默認參數
def send(xxoo,content,xx="ok"): #默認參數必須放在參數列表最後,可以有多個默認參數 print(xxoo,content,xx) print("發送郵件成功:",xxoo,content,xx) return True send('dayi','is') #如果沒有傳參、則傳遞默認參數 send('dayi','is','niuB') #如果傳遞參數,則返回結果爲傳遞參數
(3)、制定參數
默認傳遞的參數是根據順序,制定參數,可以打亂參數的順序:
def send(xxoo,content): print(xxoo,content) print("發送郵件成功:",xxoo,content) return True send(content='dayi',xxoo='is') #將’dayi’傳遞給conttent,將‘is’換遞給xxoo
2、函數的動態參數
(1)、動態參數:傳參時可以傳一個或任意多個參數
1)、傳參時加一個”*”
作用:會將傳的參數放入元組中、
應用場景:傳的參數有順序
def fl(*args): # 行參中帶*則表示動態參數 print(args,type(args)) fl(11) li = [22,"dayi","liu"] fl(li) # 把 "li"當做一個整體傳到元組裏面 fl(*li) #加"*"把li中元素傳到元組裏面 fl(li,12) li2 = "dayi123" fl(li2) #不帶*,將li2整體傳進元組,帶"*",將li2中每個字符串分別傳進元組 fl(*li2)
2)、傳參時加兩個”*”
作用:會將傳的參數放入字典中
應用場景:傳的參數沒有順序
def f1(**args): print(args,type(args)) f1(n1="dayi123",n2=24) #傳參時必須傳兩個,一個“KEY”一個“value” dic = {'name':"dayi",'age':18} f1(kk=dic) #傳參是把字典當做一個整體傳進字典中 f1(**dic) #傳參時將字典中的每一個值分別傳進字典中
3)、傳參時既有兩個”*”,又有一個”*”
作用:萬能參數,既可以傳一個”*”的參數,又可以傳”**”的參數
ef f1(*args,**kwargs): print(args,type(args)) print(kwargs) f1(1,2,3,name="dayi",age=24) tup = (22,33,44,55) dic = {'name':"dayi123",'age':23} f1(*tup,**dic) f1(yz=tup,cd=dic)
(2)、利用動態參數實現format功能
s1 = "i am {0},age{1}".format("dayi123",18) print(s1) s2 = "i am {0},age {1}".format(*["dayi123",24]) #傳遞列表中的參數,前面必須加“*” print(s2) s3 = "i am {name},age {age}".format(name="dayi123",age=24) print(s3) dic = {'name':'dayi123',"age":24} s4 = "i am {name},age {age}".format(**dic) #將字典中參數傳遞給s4,必須加“**” print(s4)
(3)、函數傳參傳遞的是引用
def f1(a1): a1.append(999) # 函數傳參傳遞的是引用 li = [11,22,33,44] f1(li) print(li)
3、全局變量與局部變量
全局變量針對所有作用域均可讀,局部變量只針對部分作用域可讀,全局變量聲明要用大寫,全局變量可以是列表、字典。全局變量可以通過global修改,如果全局變量是字典、列表,則可以修改,但不能重新賦值。
NAME = "alex" #全局變量,所有作用域都可讀,全局變量的聲明要大寫 #NAME = [123,456,789] #如果全局變量是列表字典,則可以修改,但不可重新賦值 def fl(): age = 18 global NAME #修改全局變量,對全局變量重新賦值,需要先global NAME = "123" #局部變量,只對當前作用於生效 print(age,NAME) def f2(): age = 19 print(age,NAME) fl() f2()
定義的字符串、數字格式的全局變量不能再局部變量中直接修改,但定義的列表,字典等全局變量可在局部變量中直接修改:
names= ["dayi",18,"boy"] defchange_name(): names[0] = "liu" print("inside func",names) print(names) change_name() print(names)
例:用函數實現登錄功能
def login(username,password): f = open("db",'r') #打開db.txt文件,’r’代表讀取 for line in f: line_list = line.split("|") #一行一行讀取,使用“|”分隔 if line_list[0] == username and line_list[1] == password: return True def register(username,password): f = open("db",'a') #打開db.txt文件,’a’代表追加 temp = "\n" + username + "|" + password f.write(temp) #向db.txt中寫入 f.close() #關閉並生效 def main(): t = input("1:登錄;2:註冊") if t == "1": user = input("請輸入用戶名:") pwd = input("請輸入密碼:") r = login(user,pwd) if r: print("登錄成功") else: print("登錄失敗") elif t == "2": user = input("請輸入用戶名:") pwd = input("請輸入密碼:") register(user,pwd) main()
同時,新建db.txt文件,輸入:dayi123|dayi123
三、三元(三目)運算及lambda表達式
1、三元運算
if 1 ==1: name= "liu" else: name= "sb" #等同於: name = "liu" if 1 == 1 else "sb"
2、lambda表達式(匿名函數)
def f1(a1,a2): return a1 + a2 + 100 ret = f1(10,12) print(ret) #等同於 f2 = lambda a1,a2: a1 +a2 + 100 ret2 = f2(10,12) print(ret2)
3、中括號中的條件判斷以及循環舉例:
a = range(10) print([i for i in a if i<5])
輸出結果爲: [0, 1, 2, 3, 4]
四、遞歸
1、遞歸:
遞歸算法是一種直接或者間接地調用自身算法的過程。在計算機編寫程序中,遞歸算法對解決一大類問題是十分有效的,它往往使算法的描述簡潔而且易於理解。
2、遞歸算法特點:
(1)遞歸就是在過程或函數裏調用自身。
(2)在使用遞歸策略時,必須有一個明確的遞歸結束條件,稱爲遞歸出口。
(3)遞歸算法解題通常顯得很簡潔,但遞歸算法解題的運行效率較低。所以一般不提倡用遞歸算法設計程序。
(4)在遞歸調用的過程當中系統爲每一層的返回點、局部量等開闢了棧來存儲。遞歸次數過多容易造成棧溢出等。所以一般不提倡用遞歸算法設計程序。
3、遞歸舉例——階乘
def func(num): if num == 1: return 1 return num * func(num-1) x = func(7) print(x)
五.高階函數
變量可以指向函數,函數的參數能接收變量,那麼一個函數就可以接收另一個函數作爲參數,這種函數就稱之爲高階函數。
#!/usr/bin/env python # Author:dayi123 def fuc(a,b,f): return f(a)+f(b) #將a、b的值交給函數f處理後求和再返回 add = fuc(7,-10,abs) #將內置函數abs傳遞給f print(add)