python27期day10:函數的動態參數、函數的註釋、函數的名稱空間、函數的嵌套、global(修改全局的)、nonlocal(修改局部的)、函數名的第一類對象及使用、做業題。

一、動態參數的做用: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("請從新輸入")
相關文章
相關標籤/搜索