函數的階段
定義階段
定義函數需要使用關鍵字def,函數在定義階段隻檢測函數體文法不執行函數體代碼。
調用階段
調用函數需要使用:函數名加括号。如果函數需要參數那麼則需要額外傳遞參數,而且在調用函數時才會執行函數體代碼。
函數的傳回值
傳回值
就是執行完某個方法該方法回報出來的結果
如何擷取傳回值
通過變量名和指派符号即可,變量名 = 函數()
傳回值的情況
情況一
def index():
print('from index')
# 當函數體沒有return關鍵字的時候 預設傳回None
res = index()
print(res) # None即空 表示沒有
情況二

情況三
def index():
print('from index')
return 123
# return關鍵字後面寫什麼函數就傳回什麼
res = index()
print(res) # 123
情況四
函數的類型
無參函數
函數在定義階段沒有參數調用也不需要參數。
def index():
print('from index')
index()
有參函數
函數在定義階段括号内填寫了變量名即需要參數。
def index(x):
print('from index', x)
index(1)
python函數
空函數
沒有具體的函數體代碼。
"""一般用于前期的架構搭建"""
def run():
pass # pass用于補全文法結構,本身沒有任何含義
def fight():
pass
def talk():
pass
函數的參數
形參
函數在定義階段括号内書寫的變量名稱之為函數的形式參數,簡稱為形參,相當于變量名。
實參
函數在調用階段括号内書寫的值稱之為函數的實際參數,簡稱為實參,相當于變量值。
使用
兩者在調用函數的時候臨時綁定,函數運作結束分開。
def index(name): # 形參
print(name)
index('jason') # 實參 name = 'jason'
位置參數
按照位置一一對應傳值,資料個數既不能多也不能少。
def index(x, y):
print(x, y)
index() # 不傳不可以
index(1) # 傳少了也不行
index(1, 2) # 個數正确可以
index(1, 2, 3, 4, 5, 6, 7) # 傳多了也不行
關鍵字參數
指定給某個形參傳值,可以打破位置限制。
def index(x, y):
print(x, y)
index(y=111, x=222)
index(111, y=222)
# index(111, x=222) # 報錯
# print(y=111,222) # 報錯 位置參數一定要在關鍵字參數的前面
python函數
預設參數
函數在定義階段就給形參指派。
def index(x, y):
print(x, y)
def register(name, age, gender='male'):
print(name, age, gender)
'''預設參數不給值的情況下就使用預設的 給了就使用給了的'''
register('jyb', 12)
register('yrsbyq', 22)
register('wplsq', 33)
register('sadgirl', 18, 'female')
可變長參數
無論接收多少個位置參數都可以正常運作,無論接收多少個關鍵字參數都可以正常運作。
完成這個需求可以使用* 和** 完成。
def func(*a, **b):
print(a, b)
func(1, 2, 3, a=1, b=2, c=3)
func(1, 2, 3, 4, 5, 6, 7)
func(a=1, b=2, c=3)
* 和 ** 的使用
形參中的使用
*在形參中使用
會接收多餘的位置參數組織成元組的形式指派給*後面的變量名。
**在形參中使用
會接收多餘的關鍵字參數組織成字典的形式指派給**後面的變量名。
實參中的使用
*在實參中使用
會将清單/元組内的元素打散成一個個位置參數傳遞給函數。
**在實參中使用
會将字典内的元素打散成一個個關鍵字參數傳遞給函數。
在定義階段,使用 * 和 ** 時,預設的變量名是args和kwargs,這兩個單詞是約定俗成的使用,不用也行。
函數封裝
面條版代碼封裝步驟
1.先寫def和函數名
2.将代碼縮進
3.檢視内部需要的資料
4.在形參中定義出來
盡量做到一個函數就是一個具體的功能
def auth_username(username):
# 校驗使用者名是否存在
with open(r'info.txt', 'r', encoding='utf8') as f:
for line in f:
real_name = line.split('|')[0]
if real_name == username:
print('使用者名已存在')
return True
return False
def get_info():
# 擷取使用者名和密碼
username = input('username>>>:').strip()
password = input('password>>>:').strip()
# 傳回兩個值
return username, password
def write_data(username, password):
# 将使用者名和密碼寫入檔案
with open(r'info.txt', 'a', encoding='utf8') as f:
f.write('%s|%s\n' % (username, password))
print('%s注冊成功' % username)
# 注冊功能
def register():
username, password = get_info()
# 調用校驗使用者名是否存在的函數
is_exist = auth_username(username)
if is_exist:
return
write_data(username, password)
# 登入功能
def login():
username, password = get_info()
with open(r'info.txt', 'r', encoding='utf8') as f:
for line in f:
real_name, real_pwd = line.split('|')
if real_name == username and password == real_pwd.strip('\n'):
print('登入成功')
return
print('使用者名或密碼錯誤')
# 字典
func_dict = {'1': register,
'2': login
}
while True:
print("""
1 注冊
2 登入
""")
choice = input('請輸入執行功能編号>>>:').strip()
if choice in func_dict:
# .get 從字典中根據key擷取對應的value值
func_name = func_dict.get(choice)
func_name()
else:
print('請輸入正确的編号')
内置函數
雖然表格上的函數很多,但是其實不需要全部掌握的,隻需要掌握一小部分即可,其他的想用的時候再百度就行。
print(abs(-100)) # 絕對值 100
print(all([1, 2, 3, 4, 0])) # and
print(any([1, 2, 3, 4, 0])) # or
print(bin(100)) # 進制轉換 二進制
print(oct(100)) # 八進制
print(hex(100)) # 十六進制
name = 'jyb'
def index():
pass
# 能否加括号調用
print(callable(name)) # False
print(callable(index)) # True
print(chr(65)) # 傳回ASCII對應字元 A
l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 11]
print(max(l)) # 取最大值 11
print(min(l)) # 取最小值 1
print(sum(l)) # 求和 56