程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

6.1_7 Python3.x入門 P7 【函數】

編輯:Python

相關鏈接

  • 目錄
  • Mac M1 Python環境搭建
  • Python3.x入門 P1 【基礎】注釋、標識符、變量、數據類型
  • Python3.x入門 P2 【基礎】運算符
  • Python3.x入門 P3 【基礎】流程語句【循環結構】
  • Python3.x入門 P4 【基礎】可變序列(列表list、字典dict、集合set)
  • Python3.x入門 P5 【基礎】不可變序列(元組tuple、字符串str)
  • Python3.x入門 P6 【字符串格式化】四種方式(手動、%-formatting、str.format()、f-String)
  • Python3.x入門 P7 【函數】

一、函數的定義與調用

""" @author GroupiesM @date 2022/6/29 15:49 @introduction 函數:完成指定功能的一段代碼 優點:復用代碼、隱藏實現邏輯、提高可維護性、提高可讀性便於調試 語法: def 函數名(變量1:類型1,變量2:類型2,...): 函數體 返回體 return xxx 語法簡寫: def 函數名(變量1,變量2,...): 函數體 返回體 return xxx P.S: 1.可以沒有變量,根據實際業務場景決定 2.可以沒有返回體,根據實際業務場景決定 """
# 1.定義函數(有返回值)
def sum(a, b):
c = a * 2 + b
return c
# 1.調用函數(有返回值)
print(sum(10, 20)) # 40
# 2.定義函數(無返回值)
def print_sum(a, b): print(a * 2 + b)
# 2.調用函數(無返回值)
print_sum(10, 20) # 40

二、函數的參數

2.1 參數傳遞

""" @author GroupiesM @date 2022/6/29 17:32 @introduction 形參:定義函數時,定義的參數變量 實參:調用函數時,傳遞的參數 """
'''定義函數 形參:a,b '''
def sum(a, b):
c = a * 2 + b
return c
'''調用函數 實參:10,20 未指定形參,按函數形參順序賦值 '''
result = sum(10, 20)
print(result) # 40
''' 指定形參,按指定賦值 '''
result = sum(b=10, a=20)
print(result) # 50

2.2 參數默認值

""" @author GroupiesM @date 2022/6/30 10:10 @introduction """
# 形參b指定默認值為10
def func(a, b=10):
print(a, b)
"""函數的調用 形參有默認值的情況下(b=10), 1.如果實參沒有傳遞值,則使用默認值(b=10) 2.如果實參指定了值(b=30),則使用指定值(30) """
func(100) # 100 10
func(20, 30) # 20 30
# func(a=20, 30) # 報錯 - 如果指定參數,需要指定全部參數

2.3 可變參數

""" @author GroupiesM @date 2022/6/30 10:17 @introduction 規則: 1.從*之後,調用函數時,只能采用關鍵字進行參數傳遞 一、可變參數-位置參數(元組) 1.定義函數時,可能無法事先確定傳遞的位置實參的個數時,使用可變的位置參數 2.使用*定義個數可變的位置形參 3.結果為一個元組tuple(v1,v2,...) 4.參考:解壓元組 tup = (4127, 4098, 8637678) print(14, 'Jack: {}; Sjoerd: {}; ''Dcab: {}' .format(*tup)) # Jack: 4127; Sjoerd: 4098; Dcab: 8637678 二、可變參數-關鍵字形參(字典) 1.定義函數時,無法事先確定傳遞的關鍵字實參的個數時,使用可變的關鍵字形參 2.使用**定義個數可變的關鍵字形參 3.結果為一個字典dict{k1:v1,...} 4.參考:解壓元組 table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678} print(6, 'Jack: {Jack}; Sjoerd: {Sjoerd}; Dcab: {Dcab}' .format(**table)) # Jack: 4098; Sjoerd: 4127; Dcab: 8637678 """
# 一、可變參數-位置參數(元組)
def function_tuple(*args):
print(args)
function_tuple(10) # (10,)
function_tuple(10, 20, 30) # (10, 20, 30)
# 二、可變參數-關鍵字形參(字典)
def function_dict(**arg):
print(arg)
function_dict(a=10) # {'a': 10}
function_dict(a=10, b=20, c=30) # {'a': 10, 'b': 20, 'c': 30}
def funciton_test(*arg1,**arg2):
pass
# def funciton_test(*arg1,*arg2): # 兩種可變參數,一個函數中只能分別出現1次

2.4 參數*

""" @author GroupiesM @date 2022/6/30 10:17 @introduction 規則: 1.從*之後,調用函數時,只能采用關鍵字進行參數傳遞 """
def function_star(a, b, *, c, d):
print(f'{
a=},{
b=},{
c=},{
d=}')
function_star(10, 20, d=30, c=40) # a=10,b=20,c=40,d=30

2.5 多種參數混合

""" @author GroupiesM @date 2022/6/30 11:29 @introduction 規則: 1. * 和 *args 互斥,不能同時出現 def func1(a, * , *args): pass # 報錯 """
def func1(a, b): pass
def func2(a, b=10): pass # 有默認值的函數
func2(10,20)
def func3(*args): pass # 可變參數-位置形參
func3(10)
func3(10,)
func3(10,20)
def func4(**args): pass # 可變參數-關鍵字形參
func4(x=10,y=20)
print('func5')
def func5(a, b, *, c, d, **args2): print(f"{
a=},{
b=},{
c=},{
d=},{
args2=}") # 混合
func5(10,20,c=30,d=40,f=50) # a=10,b=20,c=30,d=40,args2={'f': 50}
def func6(*args1, **args2): pass # 混合
func6(10,c=50)
print('func7:')
def func7(a, b, *args1, **args2): print(f"{
a=},{
b=},{
args1=},{
args2=}") # 混合
func7(10,20,30,d=40) # a=10,b=20,args1=(30,),args2={'d': 40}
print('func8:')
def func8(a, b=10, *args1, **args2): print(f'{
a=},{
b=},{
args1=},{
args2=}') # 混合
func8(10,20,30,d=40) # a=10,b=20,args1=(30,),args2={'d': 40}

三、函數返回值

""" @author GroupiesM @date 2022/6/29 17:44 @introduction 函數的返回值 函數返回多個值時,結果為元組tuple(v1,v2,...) """
# 一、沒有返回值
def funcOne():
print("hello")
funcOne() # hello
# 二、返回一個值
def funcTwo():
return 'hello'
print(funcTwo()) # hello
# 三、返回多個值
def funcThree():
return 'hello','python'
print(funcThree()) # ('hello', 'python')
# 三、返回多個值(拆分基數和偶數)
def num_split(num: list):
odd = [] # 存放奇數
even = [] # 存放偶數
obj = [] # 存放其他類型
for i in num:
if type(i) == int:
if i % 2:
odd.append(i)
else:
even.append(i)
else:
obj.append(i)
return odd, even, obj
print(num_split([3, 4, 6, 12, 3.14, 'luna', True, {
'doom': 18}]))
'''測試結果 ([3], [4, 6, 12], [3.14, 'luna', True, {'doom': 18}]) '''

四、變量的作用域

""" @author GroupiesM @date 2022/6/30 11:44 @introduction 變量的作用域: 1.程序代碼能訪問該變量的區域 2.根據變量的有效范圍可分為:全局變量、局部變量 2.1 全局變量 函數體外定義的變量,可做用於函數內外 2.2 局部變量 在函數內定義並使用的變量,只在函數內部有效,局部變量使用global聲明,這個變量就會成為全局變量 """
# 1.全局變量
name ='luna'
def fun2():
age=16 # 2.局部變量
global money # 1.全局變量
money = 10000
# 引用1.全局變量 + 2.局部變量
print(name,age)
fun2()
'''測試結果 luna 16 '''
# 引用1.全局變量
print(name,money)
'''測試結果 luna 10000 '''
# 引用2.局部變量
# print(age) # 不能在函數體外引用局部變量

五、遞歸函數

5.1 階乘

""" @author GroupiesM @date 2022/6/30 13:41 @introduction 遞歸函數: 1.函數體內調用了函數本身,這個函數稱為遞歸函數 2.遞歸函數需要:遞歸調傭、遞歸終止條件 3.每遞歸調用一次函數,都會在棧內分配一個棧幀 4.每執行完一次函數,都會釋放相應的空間 """
# 案例:階乘
def factorial(num:int):
if num < 1 :
print("參數錯誤,請輸入大於1的數字")
return None
if num == 1:
return 1
else:
result = num * factorial(num - 1)
return result
print(factorial(5)) # 120

5.2 斐波那契函數

""" @author GroupiesM @date 2022/6/30 14:13 @introduction 斐波那契函數 : 從第三個數起,每個數是前兩個數之和 數值 1 1 2 3 5 8 13 21 ... 遞歸次數 0 0 1 2 3 4 5 6 """
''' @length: 列表長度 @lst: 默認前兩個值為1,1 @:return lst: 斐波那契函數 in list dct: 斐波那契函數 in dict '''
def fibonacci(length: int, lst=[1, 1], dct={
'第1位': 1, '第2位': 1}, order_number=3):
dct[f'第{
order_number}位'] = lst[len(lst) - 2] + lst[len(lst) - 1]
lst.append(lst[len(lst) - 2] + lst[len(lst) - 1]) # 前兩位之和
if length == 3:
return lst, dct
else:
result = fibonacci(length - 1, lst, order_number=order_number + 1)
return result
print(fibonacci(10)[0]) # [1, 1, 2, 3, 5, 8, 13]
print(fibonacci(10)[1]) # {1: 1, 2: 1, 3: 2, 4: 3, 5: 5}

22/06/30

M


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved