Python函數Day04

 函數

函數是指將一組語句的集合經過一個名字(函數名)封裝起來,要想執行這個函數,只需調用其函數名便可。函數是邏輯結構化和過程化的一種編程方法。編程

函數的特性  :
  1. 提升代碼複用性
  2. 提升程序的擴展性
  3. 是程序更易於維護

語法格式

1 def hello():  # 函數名
2     print("Hello, I'm Baylor!")
3 
4 
5 hello()  # 調用函數

形參

  • 形參變量只有在被調用時才分配內存單元,在調用結束時,即刻釋放所分配的內存單元。所以,形參只在函數內部有效。函數調用結束返回主調用函數後則不能再使用該形參變量

實參

  • 實參能夠是常量、變量、表達式、函數等,不管實參是何種類型的量,在進行函數調用時,它們都必須有肯定的值,以便把這些值傳送給形參。
1 def func(name): #形參
2     print(name)
3 func('Baylor')  #實參

函數的四種形參類型:

 1 def calc(x, y):
 2     res = x ** y
 3     return res  # 返回函數執行結果-函數返回值
 4  5  6 c = calc(5,6) #結果賦值給c變量  7 print(c)  8  9 d = calc(y=6,x=5) 10 print(d)

要想獲取函數的執行結果,就能夠用return語句把結果返回
注意:
  • 函數在執行過程當中只要遇到return語句,就會中止執行並返回結果,so 也能夠理解爲 return 語句表明着函數的結束
  • 若是未在函數中指定return,那這個函數的返回值爲None 

位置參數:

  • 位置參數,字面意思也就是按照參數的位置來進行傳參,好比說上面的calc函數,x和y就是位置參數,位置參數是必傳的,
  • 有幾個位置參數在調用的時候就要傳幾個,不然就會報錯了,那若是有多個位置參數的話,記不住哪一個位置傳哪一個了怎麼辦,可使用位置參數的名字來指定調用
  • 好比說上面的那個calc函數也可使用calc(y=1,x=2)這樣來調用,這種調用方式叫作關鍵字傳參

默認參數:

  • 非必須傳遞參數時,能夠在函數定義時,設置默認參數,調用須要更改時從新指定關鍵參數覆蓋
  • 形式參數在前 默認參數在後

關鍵字參數: 

  • 關鍵參數不能寫在位置參數前面&位置不固定
  • 關鍵字參數在傳遞參數時,能夠不用形式參數順序傳遞,已經經過關鍵字參數指定傳參
1 def func(name,sex,age = 22,): #默認參數age
2     print(name,sex,age)
3 func(sex='',name='Baylor')  #關鍵字參數

非固定參數-參數組

  • *args 會把多傳入的參數變成一個元組形式
  • **kwargs 會把多傳入的參數變成一個字典形式
1 def func(*args,name,**kwargs): #*args 元組方式接收參數,**kwargs k,v方式接收參數
2     print(args,name,kwargs)
3 
4 func(1,2,3,name='Baylor',corporation='MLS',age='18')
5 #輸出結果  (1, 2, 3) Baylor {'corporation': 'MLS', 'age': '18'}

全局變量

  • 寫在程序的最開始,全局變量做用域是整個程序
  • 在子程序中定義的變量稱爲局部變量,在程序的一開始定義的變量稱爲全局變量。
  • 全局變量做用域是整個程序,局部變量做用域是定義該變量的子程序。
  • 當全局變量與局部變量同名時:
  • 在定義局部變量的子程序內,局部變量起做用;在其它地方全局變量起做用 
  • 修改全局變量 經過 global 修改, 不建議在子程序中修改全局變量 當代碼量大時,不便於維護全局變量

局部變量

  • 局部變量做用域是定義該變量的子程序
  • 字符串和單獨的整數,是不能在局部改
  • 字典,列表,集合,都是能夠在局部直接更改全局
 1 test ='BestTest'  # 全局變量
 2 temp={1:1}
 3 tag=['李二狗','張三']
 4 def func(name):
 5     print(name)
 6     #global test # global test #修改全局變量
 7     test='Baylor'# 局部變量-只在函數裏生效
 8     print(test)
 9     #temp={2:2}
10     print(temp)
11     tag[0]='狗蛋'
12     print(tag)
13 
14 
15 name = 'Niuhanyang'
16 func(name)
17 print(test)

外層變量,能夠被內層代碼使用
內層變量,不該被外層代碼使用

遞歸函數

在函數內部,能夠調用其餘函數。若是一個函數在內部調用自身自己,這個函數就是遞歸函數
遞歸特性:
  •  必須有一個明確的結束條件
  • 每次進入更深一層遞歸時,問題規模相比上次遞歸都應有所減小
  • 遞歸效率不高,遞歸層次過多會致使棧溢出(在計算機中,函數調用是經過棧(stack)這種數據結構實現的,每當進入一個函數調用,棧就會加一層棧幀,每當函數返回,棧就會減一層棧幀。因爲棧的大小不是無限的,因此,遞歸調用的次數過多,會致使棧溢出
1 def test1():
2     num = int(input('please enter a number:'))
3     if num%2==0:#判斷輸入的數字是否是偶數
4        return True #若是是偶數的話,程序就退出了,返回true
5     print('不是偶數請從新輸入!')
6     return test1()#若是不是偶數的話繼續調用本身,輸入值
7 print(test1())#調用test
1 def calc(n):
2     print('----',n)
3     if int(n / 2) == 0:
4         return n
5     return calc(int(n / 2))
6 
7 calc(10)

高階函數

  • 變量能夠指向函數,函數的參數能接收變量,那麼一個函數就能夠接收另外一個函數做爲參數,這種函數就稱之爲高階函數
 1 def s_int(n):
 2     # 這個函數的做用是把傳入的參數類型轉換成int類型
 3     return int(n)
 4 
 5 def add(a,b,f):
 6     return f(a)+f(b)
 7 res = add(3,-6,abs)
 8 #這個執行過程是這樣的,f是一個函數,把x和y的值傳給f,而後用f函數的返回值把兩個值相加
 9 # res = add(3,-6,s_int) #調用,傳入x和y的值,再把上面的那個定義好的函數傳進去
10 
11 print(res) 

資料補充

yield 生成器 使用小技巧

#在一個循環中我不想退出,可是依然想要把循環的結果返回,那麼此刻return,break 就不能用了,那麼此刻 yield的做用來了
1
def nrange(num): 2 temp=-1 3 while True: 4 temp+=1 5 if temp >=num: 6 return 7 else: 8 yield temp #返回一個對象 9 10 c = nrange(10) 11 t =[] 12 for i in c: #循環打印 13 t.append(i) 14 print(t) 15 16 17 list1= ['a','b','c'] 18 list2 = ['1','2'] 19 list3 = ['sf', 'wh'] 20 21 def TestYield(): 22 for element1 in list1: 23 yield element1 24 for element2 in list2: 25 yield element2 26 for element3 in list3: 27 yield element3 28 29 if __name__ == '__main__': 30 ele = TestYield() 31 for e in ele: 32 print(e)
相關文章
相關標籤/搜索