1. 程式人生 > 其它 >函式基礎知識2

函式基礎知識2

今日內容概要

  • 函式的定義與呼叫

  • 函式的分類

  • 函式的返回值

  • 函式的引數

  • 名稱空間與作用域

     

今日內容詳細

一、函式的定義與呼叫

# 1.函式一定要遵循先定義後呼叫的原則:定義函式的程式碼一定要比呼叫函式的程式碼先執行
# 2.函式在定義階段只檢測語法不執行程式碼
# 3.函式體程式碼只有在呼叫函式的時候才會執行
呼叫函式的方式:函式名加括號  如果有引數需要寫入傳遞引數
# 4.函式名其實相當於變數名指向的是記憶體中函式體程式碼所在的位置
注意:如果一個函式沒有定義階段,那麼將無法被呼叫 eg:func() 出現的結果是:系統會報錯  name 'func' is not defined
函式基本格式:定義函式+呼叫函式
定義函式:
def func():
   print('hello world')
呼叫函式:
func()  實質是去記憶體中找到函式體程式碼並執行


 

 

二、函式的分類

1.內建函式
是指在Python直譯器中提前定義好後可以直接呼叫使用的函式
比如:len、open、print.....
檢視程式碼的內部原始碼Ctrl +滑鼠左鍵點選即可
2.自定義函式
是指程式設計師自己編寫的函式,其中又可以分為三類:無參函式、有參函式、空函式
無參函式:在函式“定義階段”括號內沒有引數 eg:
def index():
print('hello world')
在呼叫無參函式:括號內也不需要寫引數
# index()

有參函式:是在函式“定義階段”括號內有引數 '可以類似於變數名'
def index(a):
print('hello world')
在呼叫有參函式時:呼叫階段括號內也必須寫引數 '可以類似於變數中的變數值'
# index(a)

空函式:是指在“定義階段” 函式體程式碼是用pass或者...先佔位 eg:
def index():
pass

空函式從定義上看覺得沒有什麼作用,但是在我們實際上是非常有用:
前期利用空函式來列大綱,快速羅列出程式中我們需要寫的功能
讓程式整體框架結構清晰 搭建好整個框架
以後在程式設計書寫時:功能可以看成是函式 函式也可以看成是功能

 

 

三、函式的返回值

# 函式的返回值其實就是在呼叫函式後計算機返回給你的結果
  先給你舉個例子:
  s ='hello world'
  res = len(s) # 意思是將len函式的返回值繫結一個名字賦值給了res這個變數名
  print(res) # 然後我們就可以通過res就可以找到len函式的返回值
# 如何獲取函式的返回值 (書寫格式)
  變數名 = 函式呼叫
  res = index()
  print(res)

# 對於如何控制返回值
1.當函式體程式碼沒有return關鍵字的時候 返回值是None
def index():
print('好好學習 天天向上')
res =index()
print(res) # 會出現報錯
2.當函式體程式碼寫了return但是沒有跟任何值的時候 返回值也是None
def index():
  print('好好學習')
  return
res = index()
print(res)   # None
3.當函式體程式碼寫了return並且跟了資料 那麼寫了什麼就會返回什麼
  如果寫的是值那麼直接返回值(任意資料型別)
  如果寫的是變數名那麼就是返回變數名指向的變數值
  def index():
  print('好好學習')
  name ='jason'
  return name
res = index()
print(res) # jason
4.return後面還可以跟多個值 中間用“逗號”隔開 返回值會自動組織成“元組”出去
def index():
  print('好好學習')
  name ='jason',111,222
  return name
res = index() # ('jason', 111, 222)
5.函式體程式碼遇到return會立即馬上結束函式的執行
函式替程式碼裡面寫了return類似於在迴圈結構中寫了break 遇到了就馬上回立刻結束函式和迴圈的執行

 

 

四、函式的引數

# 1.函式的引數可以分為兩大類:形參和實參
形參:是指函式在“定義階段”括號內寫的引數,也叫形式引數,簡稱為:行參

實參:是指函式在“呼叫階段”括號內寫的引數,也叫為實際引數,簡稱為:實參

# 2.形參與實參的關係
兩者從定義上來區分就是引數所在階段的不同而不同
形參類似於變數中的變數名 實參類似於變數中的變數值
  在呼叫函式的時候會傳入實參 先與形參臨時繫結 後函式執行結束後自動解除繫結,然後下一個實參繼續反覆的一個動態過程 例如:
def index(a,b):  # a與b就是index函式的形參
   print(a,b)
# index(1,2) # 1和2就是index的實參
實引數字1會臨時繫結給形參變數a,數字2會臨時繫結給形參變數b(如果一般情況預設是從左到右 一一對應)
函式體程式碼執行完畢後 兩者的繫結會自動解除
此時的形參a、b仍處於沒有繫結的狀態 等待下一組函式呼叫再傳入實參進行繫結

 

 

五、位置引數

位置形參:是指在“定義階段”括號內從左往右依次填寫的變數名
def index(name,pwd): # 其中name和pwd就是位置形參
pass
位置實參:是指在函式“呼叫階段”括號內從左往右依次傳入的真實資料(變數值)
# index('jason',123) # jason和123就是位置實參

位置引數的特徵
  1.位置形參與位置實參在繫結關係的時候就是按照從左往右的順序依次繫結
  2.位置形參與位置實參的個數兩者要一致 如果不一致(多或少)系統會報錯
  def index(a,b):
  print(a,b) # 外界傳入什麼實參這裡就列印什麼
# index(1,2)   # 1 2
# index('jason',123)   # jason 123
# index()   # index() missing 系統會報錯 不傳實參不行
# index(111) # 實參傳少了也不行 index() missing
index(111,222,333) # 傳多了也不行 index() takes 2 positional

 

 

六、關鍵字引數

出現在實參中
指名道姓的給形參傳值 不需要遵循位置(從左往右 一一對應)
def index(a,b):
   print(a,b)
index(b=111,a=222)  # 指名道姓的說形參a接收資料222 b接收資料111
index(b=333,222) # 關鍵字引數必須放在位置引數後面 否則會報錯
index(222,a=111) # 會出現a會等於兩個值 計算機無法識別報錯 形參只能指向一個實參
index(222,b=111)  # 可以執行 相當於位置引數

 

 

七、預設引數

# 出現在形參中:在函式定義階段就已經給一些形參賦值了
後續如果不傳達實際值則使用預設的數值
後續如果傳值則是使用傳入的
預設引數的出現也打破了形參與實參之間個數一致的情況
預設引數必須定義在位置引數後面  # 至於順序問題 後面有口訣
預設引數的實際應用案例
比如:很多軟體的註冊頁面 預設會幫助我們勾選一些選擇
def register(name,age,gender ='男生')  # 函式的形參在命名的時候也應該做到見名知意(預設引數必須定義在位置引數後面)
print("""
學員姓名:%s
學員年齡:%s
學員性別:%s"""%(name,age,gender))
   register('jason',18)  # 不傳就使用預設的
   register('kevin',28)
   register('jerry',22,'女生')  # 我們傳了就會使用自己的
   

 

 

八、可變長引數

# 在實際生活中,我們會遇到這樣的需求:需要定義一個函式 無論傳多少位置實參都可以正常執行
這就引出了*與**k,先看例題
def func(*a):
print(a)
func() # () 沒有實參則列印空
func(1,2) # (1,2) 有實參則會接收(1,2) 然後賦值給*號後面的變數名
func(1,2,3,4,5,6) # (1,2,3,4,5,6) 有什麼實參就會接收什麼實參,然後賦值給*號後面的變數名

*號在形參中
  可以接收多餘的位置引數 並組織成“元組”的形式賦值給*號後面的變數名
  def index(a,b,*ag):
  print(a,b,ag)
  index(999) # 系統會報錯 因為引數a b的存在 意味著index最少要給兩個引數
  index(1,2) # 1 2 ()
  index(1,2,3,4,5,6,7) # 1 2 (3,4,5,6,7)
  index(1,2,3,4,5,6,7,8,9,10) # 1 2 (3,4,5,6,7,8,9,10)
   
  **在形參中:
  用於接收多餘的關鍵字引數 並且組織成“字典”的形式賦值給**後面的變數名
  例如:
  def index(a,b,**k):
  print(a,b,k)
  index(a=1,b=2) # 1 2 {}
  index(a=1,b=2,c=3,name='jason') # 1 2 {c:3,'name':'jason'}
  index(1,2,name='jason',age=18,pwd=123) # 1 2 {'name': 'jason', 'age': 18, 'pwd': 123}
  如果定義一個函式需要無論傳入多少關鍵字引數都可以正常執行
   
   

 

 

九、可變長形參

# 如何定義一個無論接收多少個任意型別的引數都可以正常執行的函式

def func(*a,**k):
print(a,k)
func() # () {}
func(1,2,3,4,name='jason',age =18) # (1,2,3,4) {'name':'jason','age':18} 這裡遵循了位置引數要在關鍵字引數前面
# 以後在定義函式的時候 如果不確定這個函式將來需要多少個實引數 那麼可以採用上訴的方法
*與**在形參中的使用 後面的變數名不是關鍵 但是針對這兩個特殊符號後面的變數名 有推薦的寫法....
def index(*args,**kwargs)
pass

 

 

十、*與**不單單可以在形參中使用 還可以在實參中使用

def index(*args,**kwargs):

print(args,kwargs)



*號在實參中

•     可以將列表或者元組打散成位置引數一一傳入

def index(*[11,22,33]) 等價於 index(11,22,33)

def index(*(11,22,33)) 等價於 index(11,22,33)

可以看成是*號會將列表和元組的括號去掉暴露出裡面一個個元素

**號在實參中

•       可以將字典打散成關鍵字引數一一傳入

def index(**{'name':'jason'}) 等價於index(name='jason')

index(**{'name':'jason','age':18,'pwd':123})



# {'name': 'jason', 'age': 18, 'pwd': 123}
def index(*args,**kwargs):

print(args,kwargs)



*號在實參中

•     可以將列表或者元組打散成位置引數一一傳入

def index(*[11,22,33]) 等價於 index(11,22,33)

def index(*(11,22,33)) 等價於 index(11,22,33)

可以看成是*號會將列表和元組的括號去掉暴露出裡面一個個元素

**號在實參中

•       可以將字典打散成關鍵字引數一一傳入

def index(**{'name':'jason'}) 等價於index(name='jason')

index(**{'name':'jason','age':18,'pwd':123})
# {'name': 'jason', 'age': 18, 'pwd': 123}

index({'name':'jason','age':18,'pwd':123}) #
({'name': 'jason', 'age': 18, 'pwd': 123},)