1. 程式人生 > >day6-基礎函式的學習(一)

day6-基礎函式的學習(一)

今日份目錄

1.函式的定義

2.函式的返回值

3.函式的引數

4.函式的區域性變數

5.函式中修改全域性變數

6.巢狀函式


繼續今日份預習!

正文開始

隨著學習進度的逐漸的加深發現我們的函式體越來重複化越來越嚴重,太多重複程式碼,這會讓我們的程式碼的可讀性越來越差

1.函式的定義

定義:將一組語句集合通過一個名字(函式名)封裝起來,只需要執行,呼叫其函式名

print sayhi ---->返回記憶體地址

print sayhi()---->返回函式內的內容

特性:

  1. 減少重複程式碼
  2. 使程式變得可擴充套件
  3. 使程式變得易維護

哎,跟著金老師開會兒車,雖然我也不懂怎麼用,很多人應該都用過探探或者陌陌這型別聊天交友軟體,現在寫一下大概的軟體的搭建

def tantan():
    print('開啟手機!')
    print('開啟軟體!')
    print('附件的人!找到附近的人!')
    print('左滑一下!')
    print('右滑一下!')
    print('鎖定目標,聯絡!')
    print('一起大膽約會吧!相約。。。。。')

tantan()#函式的執行者(呼叫者)
#這大概就是使用探探的整個流程了,每次用都是在呼叫tantan這個函式,就不需要各種重複程式碼了!
2.函式的返回值

我們執行一個函式,函式外部的程式碼如果需要獲取函式內的執行結果,就可以用函式內的return語句把結果返回

return 預設返回這

def tantan():
    print('開啟手機!')
    print('開啟軟體!')
    print('附件的人!找到附近的人!')
    print('左滑一下!')
    print('右滑一下!')
    return
    print('鎖定目標,聯絡!')
    print('一起大膽約會吧!')

tantan()
print(666)
#返回值
開啟手機!
開啟軟體!
附件的人!找到附近的人!
左滑一下!
右滑一下!
666
我們會發現函式在碰到return就會推出函式的執行,跳出函式的執行,return預設值為空
def
tantan(): print('開啟手機!') print('開啟軟體!') print('附件的人!找到附近的人!') print('左滑一下!') print('右滑一下!') print('鎖定目標,聯絡!') print('一起大膽約會吧!') return ('金剛芭比!') print(tantan(),type(tantan())) print(666) #結果 開啟手機! 開啟軟體! 附件的人!找到附近的人! 左滑一下! 右滑一下! 鎖定目標,聯絡! 一起大膽約會吧! 金剛芭比! <class 'str'> 666
def tantan():
    print('開啟手機!')
    print('開啟軟體!')
    print('附件的人!找到附近的人!')
    print('左滑一下!')
    print('右滑一下!')
    print('鎖定目標,聯絡!')
    print('一起大膽約會吧!')
    # return ('金剛芭比!')
    return [1,100]
ret = tantan()
print(ret,type(ret))
print(666)
#結果
開啟手機!
開啟軟體!
附件的人!找到附近的人!
左滑一下!
右滑一下!
鎖定目標,聯絡!
一起大膽約會吧!
[1, 100] <class 'list'>
666
從上面程式碼可以看出來,在返回單個值得時候,值是什麼型別,返回的就是什麼型別
def tantan():
    print('開啟手機!')
    print('開啟軟體!')
    print('附件的人!找到附近的人!')
    print('左滑一下!')
    print('右滑一下!')
    print('鎖定目標,聯絡!')
    print('一起大膽約會吧!')
    return ('金剛芭比!','洛天依','初音')

ret = tantan()
print(ret,type(ret))
print(666)
#結果
開啟手機!
開啟軟體!
附件的人!找到附近的人!
左滑一下!
右滑一下!
鎖定目標,聯絡!
一起大膽約會吧!
('金剛芭比!', '洛天依', '初音') <class 'tuple'>
666
根據上面三段程式碼我們總結出以下幾條
  1. 函式在碰到return就會結束函式,並將值返回函式執行者
  2. return預設返回值為空
  3. return返回單個值得時候,值是什麼型別,返回值就是什麼型別
  4. return返回多個值得時候,會將多個值用逗號分隔,返回一個元祖
  5. 函式返回值永遠只能返回一個值

3.函式的引數

def tantan(a,b): #函式定義,形參:形式引數
    print(a,b)
    print('開啟手機!')
    print('開啟軟體!')
    print('附件的人!找到附近的人!')
    print('左滑一下!')
    print('右滑一下!')
    print('鎖定目標,聯絡!')
    print('一起大膽約會吧!')
    return ('金剛芭比!','洛天依','初音')
a = 3
b = 2
ret = tantan(a,b)#這個就是函式執行的主體   實參:這個裡面的a和b就是實際引數
print(ret,type(ret))
print(666)
3.1 實參:可以是常量、變數、表示式、函式等,無論實參是何種型別的量,在進行函式呼叫時,它們都必須有確定的值,以便把這些值傳送給形參。因此應預先用賦值,輸入等辦法使引數獲得確定值.

以一個學生註冊的函式來解釋實參

def stu_register(name,age,country,course):
    print("----註冊學生資訊------")
    print("姓名:", name)
    print("age:", age)
    print("國籍:", country)
    print("課程:", course)

stu_register("王山炮",22,"CN","python_devops")
stu_register("張叫春",21,"CN","linux")
stu_register("劉老根",25,"CN","linux")
3.1.1位置引數:按照位置呼叫順序,一個一個的呼叫,傳入四個值則則會和下面的呼叫一一匹配,如果將傳入的值調換位置,雖不會報錯,顯示的內容並不會一樣
第一種結果
----註冊學生資訊------
姓名: 王山炮
age: 22
國籍: CN
課程: python_devops
#調換姓名和年齡
----註冊學生資訊------
姓名: 22
age: 王山炮
國籍: CN
課程: python_devops

3.1.2關鍵字引數:既然上面的位置引數更改位置會更改內容,那麼就有可以變更位置的引數

stu_register(name="王山炮",age=22,course="python_devops",country="CN")
#結果
----註冊學生資訊------
姓名: 王山炮
age: 22
國籍: CN
課程: python_devops
發現我們把引數名稱變更位置,函式還是會識別到傳入的引數,放在正確的位置

3.1.3混合引數:就是將位置引數和關鍵字引數混合的輸入

#按照關鍵字引數放在最前面
stu_register(name="王山炮",22,"python_devops","CN")
執行後報錯
SyntaxError: positional argument follows keyword argument
翻譯過來的意思就是關鍵字引數不能放在位置引數前面,應該放在位置引數後面
總結一下就是:
  • 位置引數,從左到右,一一對應
  • 關鍵字引數,一一對應,不過位置隨意
  • 混合引數,不過位置引數一定要在關鍵字引數前面

3.2 形參

形參:只有被呼叫時才會分配記憶體單元,呼叫結束時,釋放分配的記憶體單元,形參只在函式內部有效,函式呼叫結束時返回主函式後不能再使用該形參

3.2.1位置引數:整體和實參的位置引數一致,預設一一對應

3.2.2預設引數:如果大量的資料都是預設值,則設定預設引數,如果需要更改在去更改

def stu_register(name,age,course,country='CN'):
    print("----註冊學生資訊------")
    print("姓名:", name)
    print("age:", age)
    print("國籍:", country)
    print("課程:", course)

stu_register("王山炮",22,"python_devops",)
stu_register("張叫春",21,"linux")
stu_register("劉老根",25,"linux")
#結果
----註冊學生資訊------
姓名: 王山炮
age: 22
國籍: CN
課程: python_devops
----註冊學生資訊------
姓名: 張叫春
age: 21
國籍: CN
課程: linux
----註冊學生資訊------
姓名: 劉老根
age: 25
國籍: CN
課程: linux

不過有個坑預設引數必須放在位置引數後,要不然也會報錯

3.2.2.1預設引數的陷阱

#預設引數指向的是一個容器型資料型別,那麼這個資料在記憶體中永遠是同一個

def func1(a,l=[]):
    l.append(a)
    return l
print(func1(666))  # [666]
print(func1(22))   # [666,22]
print(func1(33,[]))  # [33]
#結果
[666]
[666, 22]
[33]

萬能引數:倆個形參接收所有實參傳遞過來的位置引數以及關鍵引數

def func1(*args,**kwargs)

總結一下

  • 位置引數,從左到右,一一對應
  • 預設引數,放在位置引數後面
  • 萬能餐宿,能接受實參角度所有的位置引數以及關鍵字引數

後續等待新增內容

4.區域性變數

函式內外同一個名稱的變數,倆個是不一樣的,看例子

name = '1A'
def change_name():
    name ='2b'  #函式內的name變更為2b,函式外定義的變數仍沒有變更,倆者的記憶體地址不一樣
    print('',name)
change_name()
print(name)#在函式內部定義的變數稱之為區域性變數
#結果
裡 2b
1A

這樣就可以引出全域性和區域性變數定義

區域性變數:在函式結束後,區域性變數從記憶體中清除,倆個函式的區域性變數不能互相呼叫

全域性變數:定義在函式外部一級程式碼的變數,叫全域性變數,全域性有效

函式內呼叫變數,優先為區域性變數,無則呼叫全域性變數

5.函式中修改全域性變數

6.巢狀函式