一、動態參數的做用:python
可以接收不固定長度參數程序員
位置參數過多時可使用動態參數函數
* args是程序員之間約定俗稱(能夠更換可是不建議更換)spa
* args獲取的是一個元組日誌
** kwargs獲取的是一個字典對象
* args只接受多餘的位置參數blog
** kwargs只接受多餘的動態關鍵字參數/可變關鍵字參數ip
def func(*args): #形參位置上的*是聚合
print(*args) #函數體中的*就是打散
print(args)
func(1,2,3)
結果:1 2 3
(1,2,3)
函數的參數優先級:位置參數 > 動態位置參數(可變位置參數) > 默認參數 > 動態關鍵字參數(可變關鍵字參數)
def func(a,b,m = 8,*args,**kwargs):
print(a,b,m,args,kwargs)
func(1,2,5,c=10)
結果:1 2 5 () {'c': 10}
萬能參數:
def func(*args,**kwargs):
print(args,kwargs)
func(12,2,121,12,321,3,a = 1,b = 4)
結果:(12, 2, 121, 12, 321, 3) {'a': 1, 'b': 4}
打散 and 聚合 and 打散:
lst = [1,2,3,4,6,7]
def func(*args): #形參位置上加*是聚合
print(*args) #函數體中加*是打散
func(*lst) #調用函數中加*是打散
結果:1 2 3 4 6 7
二、josn 數據和字典長得如出一轍
三、函數的註釋:給別人看的、三個雙引號敲回車:
註釋寫法一:
def add(a,b):
"""
數字的加法運算
:param a: int
:param b: int
:return: int
"""
return a + b
print(add(1,2))
結果:3
註釋寫法二:
def add(a:int,b:int): #提示的int沒有作到約束
"""
加法
:param a:
:param b:
:return:
"""
return a + b
print(add("a","b"))
結果:ab
四、查看函數的註釋:print(add.__doc__)
結果:
加法
:param a:
:param a:
:return :
五、查看函數的名字:print(add.__name__)
結果:add
六、名稱空間:
內置空間:存放python自帶一些函數
全局空間:當前py文件頂格編寫的代碼開闢的空間
局部空間:函數開闢的空間
程序加載順序:內置空間 > 全局空間 > 局部空間
程序取值順序:局部空間 > 全局空間 > 內置空間
七、查找圖解:
八、做用域:
全局做用域:內置 + 全局 globals按位置查看全局做用域下開闢的空間、結果是字典形式。
局部做用域:局部 locals查看當前做用域(建議查看局部)
a = 10
def func():
b = 5
print(locals())
print(globals())
九、函數名的第一類對象:
函數名能夠當作值、賦值給一個變量
def func():
print(1)
a = func
a()
print(func) #查看函數的信息
函數名能夠當作另外一個函數的參數來使用:
def func():
print(1)
def foo(a):
print(a) #func這個函數的內存地址
foo(func)
函數名能夠當作另外一個函數的返回值:
無論在什麼位置、只要是看到函數名+()就是調用函數
def func():
print(1)
def foo(a): #a = func
return a #return func函數的內存地址
cc = foo(func)
print(cc)
結果:<function func at 0x00000000003F2EA0>
函數名能夠當作元素存儲在容器中:
def login():
print("註冊")
def register():
print("登陸")
def shopping():
print("逛")
def add_shopping_car():
print("加")
def buy_goods():
print("買")
msg = """
1.註冊
2.登陸
3.逛
4.加
5.買
請輸入您要選擇的序號:
"""
func_dic = {
"1":login,
"2":register,
"3":shopping,
"4":add_shopping_car,
"5":buy_goods,
}
while True:
choose = input(msg)
if choose in func_dic:
func_dic[choose]()
else:
print("滾")
十、函數嵌套:
交叉嵌套
結果:2內存
1utf-8
3
結果: 3
1
"我太難了"
2
4
結果:4 7
None
十一、global:
在局部空間中可使用全局中的變量、可是不能修改、若是要強制修改須要添加global
當變量在全局存在時global就是申明我要修改全局的變量、而且會在局部開闢這個變量
當變量在全局中不存在時global就是申明要在全局建立一個變量、而且會在局部開闢這個變量
a = 10
def func():
global a
a = a + 1
func()
print(a)
結果:11
字典是可變數據類型、在局部使用全局進行修改不用使用global
a = {"name":"zd"}
def func():
a["name"] = "lisi"
func()
print(a)
# 結果:{'name': 'lisi'}
十二、nonlocal:
只修改局部空間中的變量、最外層的一個函數
只修改離nonlocal最近的一層、若是這一層沒有就往上一層查找、只能在局部
def func():
a = 10
def foo():
a = 5
def f():
nonlocal a
a = a + 1
print(a)
f()
foo()
func()
結果:6
做業題:
# 一、用代碼模擬博客園系統# 首先程序啓動,顯示下面內容供用戶選擇:# 1.請登陸# 2.請註冊# 3.進入文章頁面# 4.進入評論頁面# 5.進入日記頁面# 6.進入收藏頁面# 7.註銷帳號# 8.退出整個程序# 必須實現的功能:# 1.註冊功能要求:# a.用戶名、密碼要記錄在文件中。# b.用戶名要求:不能有特殊字符而且確保用戶名惟一。# c.密碼要求:長度要在6~14個字符之間。# 2.登陸功能要求:# a.用戶輸入用戶名、密碼進行登陸驗證。# b.登陸成功以後,才能夠訪問3 - 7選項,若是沒有登陸或者登陸不成功時訪問3 - 7選項,不容許訪問,提示用戶進行登陸!# c.超過三次登陸還未成功,則退出整個程序。# 進入文章頁面要求:# 提示歡迎xx進入文章頁面。(xx是當前登陸的用戶名# 進入評論頁面要求:# 提示歡迎xx進入評論頁面# 進入日記頁面要求:# 提示歡迎xx進入日記頁面。# 進入收藏頁面要求:# 提示歡迎xx進入收藏頁面。# 註銷帳號要求:# 不是退出整個程序,而是將已經登陸的狀態變成未登陸狀態(在次訪問3~7選項時須要從新登陸)# 退出整個程序要求:# 退出整個程序要求:# 用代碼實現三次用戶登陸及鎖定(選作題,這是一個單獨的程序)# 首先程序啓動,顯示下面內容供用戶選擇:# 註冊# 登陸# 用戶選擇登陸的時候,首先判斷用戶名在userinfo.txt表中存在不在,存在就不能進行註冊# 當註冊的用戶名不存在的時候將用戶名和密碼寫入到userinfo.txt文件中# 用戶選擇登陸的時候,判斷用戶輸入的帳號和密碼是否userinfo.txt存儲的一致# 用戶名和密碼一致就終止循環,並提示用戶登陸成功!# 用戶名和密碼不一致,只有三次登陸機會,三次事後提示用戶名被鎖定,請聯繫管理員!並終止循環# 當用戶名錯誤三次,再次運行程序.登陸鎖定的帳號繼續提示用戶名被鎖定,請聯繫管理員!login_dic = { "username":None, "flag":False, #登陸成功是true、登陸不成功是false "count":3}def login(func=None): """ 登陸 :return: """ while login_dic["count"]: user = input("username:") pwd = input("password:") with open("userinfo","a+",encoding="utf-8") as f: f.seek(0) for i in f: file_user,file_pwd = i.strip().split(":") if file_user == user and file_pwd == pwd: login_dic["count"] = 3 login_dic["username"] = user login_dic["flag"] = True print("登陸成功") if func: func() return else: login_dic["count"] -= 1 print("帳號或密碼錯誤") if login_dic["count"] == 0: exit()def register(): """ 註冊 :return: """ user = input("username:") pwd = input("password:") with open("userinfo","a+",encoding="utf-8") as f: f.seek(0) if user.isalpha() and 14 > len(pwd) > 6: for i in f: file_user,file_pwd = i.strip().split(":") if file_user == user: print("用戶名已存在!") return else: f.write(f"{user}:{pwd}\n") print("註冊成功!") else: print("註冊失敗")def comment(): print(f"歡迎{login_dic['username']}登陸評論區")def log(): print(f"歡迎{login_dic['username']}登陸日誌區")def article(): print(f"歡迎{login_dic['username']}登陸文章區")def collect(): print(f"歡迎{login_dic['username']}登陸收藏區")def log_out(): login_dic['username'] = None login_dic['flag'] = False print("註銷成功")func_dict = { "1":login, "2":register, "3":comment, "4":log, "5":article, "6":collect, "7":log_out, "8":exit}msg = """1.請登陸2.請註冊3.進入文章頁面4.進入評論頁面5.進入日記頁面6.進入收藏頁面7.註銷帳號8.退出整個程序請輸入序號:"""while True: choose = input(msg) if choose in func_dict: if choose == "1" or choose == "2" or choose == "8": func_dict[choose]() elif login_dic['flag']: func_dict[choose]() else: login(func_dict[choose]) else: print("請從新輸入")