'''練習題:'''
'''1. 文件a1.txt內容
序號 部門 人數 平均年齡 備註
1 python 30 26 單身狗
2 Linux 26 30 沒對象
3 運營部 20 24 女生多
.......
經過代碼,將其構建成這種數據類型:
[{'序號':'1','部門':Python,'人數':30,'平均年齡':26,'備註':'單身狗'},......]'''
# list_result = []
# f = open("a1.txt", encoding="utf-8")
# list_head = f.readline().strip().split()
# for line in f:
# dic = {}
# list_content = line.strip().split()
# for i in range(len(list_head)):
# if i == 2 or i == 3:
# dic[list_head[i]] = int(list_content[i])
# else:
# dic[list_head[i]] = list_content[i]
# list_result.append(dic)
# f.close()
# print(list_result)
'''2. 傳入函數的字符串中,[數字]、[字母]、[空格] 以及 [其餘]的個數,並返回結果。'''
# def my_type_count(content):
# count_digit = 0
# count_alpha = 0
# count_space = 0
# count_other = 0
# for i in content:
# if i.isdigit():
# count_digit += 1
# elif i.isalpha():
# count_alpha += 1
# elif i.isspace():
# count_space += 1
# else:
# count_other += 1
# print("輸入內容中包含數字{}個,字母{}個,空格{}個,其它{}個".format(count_digit, count_alpha, count_space, count_other))
# content = input("請輸入您想統計的內容: ")
# my_type_count(content)
'''3. 寫函數,接收兩個數字參數,返回比較大的那個數字。'''
# def my_max(x, y):
# return x if x > y else y
# print(my_max(30, 20))
'''4. 寫函數,檢查傳入字典的每個value的長度,若是大於2,那麼僅保留前兩個長度的內容,並將新內容返回給調用者。
dic = {"k1": "v1v1", "k2": [11,22,33,44]}
PS:字典中的value只能是字符串或列表'''
# def check_dic_len(dic):
# for k,v in dic.items():
# if len(v) > 2:
# dic[k] = v[:2]
# print(dic)
# dic = {"name":"elisun", 'li':[1,2,3,4]}
# check_dic_len(dic)
'''5. 寫函數,此函數只接收一個參數且此參數必須是列表數據類型,此函數完成的功能是返回給調用者一個字典,此字典的鍵值對爲此列表的索引及對應的元素。例如
傳入的列表爲:[11,22,33] 返回的字典爲 {0:11,1:22,2:33}。'''
# def ret_dic(lis):
# if type(lis) != list:
# return "請傳入列表類型"
# dic = {}
# for i in lis:
# dic[lis.index(i)] = i
# print(dic)
# ret_dic([11, 22, 33])
'''6. 寫函數,函數接收四個參數分別是:姓名,性別,年齡,學歷。用戶經過輸入這四個內容,而後將這四個內容傳入到函數中,此函數接收到這四個內容,將內容追
加到一個student_msg文件中。'''
# def info_table(name, sex, age, edu):
# with open("info_table.txt", encoding="utf-8", mode="a") as f:
# info_format = "\t".join([name, sex, age, edu])
# f.write(info_format+"\n")
#
# name = input("姓名: ")
# sex = input("性別: ")
# age = input("年齡: ")
# edu = input("學歷: ")
#
# info_table(name, sex, age, edu)
'''7. 對第6題升級:支持用戶持續輸入,Q或者q退出,性別默認爲男,若是遇到女學生,則把性別輸入女。'''
# def info_table(name, age, edu, sex="男"):
# with open("info_table.txt", encoding="utf-8", mode="a") as f:
# info_format = "\t".join([name, sex, age, edu])
# f.write(info_format + "\n")
#
# while 1:
# opt = input("回車輸入我的信息,輸入Q或者q退出: ")
# if opt.upper() == "Q":
# break
# else:
# name = input("姓名: ").strip()
# sex = input("性別(不輸入時默認爲'男'): ").strip()
# age = input("年齡: ").strip()
# edu = input("學歷: ").strip()
# if name == "" or age == "" or edu == "":
# print("都是必填項,有未填信息,請從新輸入")
# continue
# if sex == "":
# info_table(name, age, edu)
# else:
# info_table(name, sex, age, edu)
'''8. 寫函數,用戶傳入修改的文件名,與要修改的內容,執行函數,完成整個文件的批量修改操做。'''
# def replace_content():
# filename = input("請輸入要修改的文件名: ")
# content = input("要修改的內容: ")
# content_new = input("替換成新的內容: ")
#
# import os
# with open(filename, encoding='utf-8') as f1, \
# open("temp.txt", encoding='utf-8', mode='w') as f2:
# for line in f1:
# new_line = line.replace(content, content_new)
# f2.write(new_line)
# os.remove(filename)
# os.rename("temp.txt", filename)
# replace_content()
'''9. 讀代碼,回答:代碼中,打印出來的值a,b,c分別是什麼?爲何?
a=10
b=20
def test5(a,b):
a=3
b=5
print(a,b)
c = test5(b,a)
print(c)'''
# a是3,b是5,c是None。
# 由於執行函數時a,b在函數內部有定義,因此優先取局部空間的值。c爲調用函數後獲得的返回值,而該函數沒有定義返回值,因此爲默認值None。
'''10. 寫函數,傳入函數中多個實參(均爲可迭代對象如字符串,列表,元祖,集合等),將每一個實參的每一個元素依次添加到函數的動態參數args裏面.
# 例如 傳入函數兩個參數[1,2,3] (22,33)最終args爲(1,2,3,22,33)'''
# def args(*args):
# print(args)
# args(*[1,2,3],*(22,33))
'''11. 寫函數,傳入函數中多個實參(實參均爲字典),將每一個實參的鍵值對依次添加到函數的動態參數kwargs裏面.
例如 傳入函數兩個參數{‘name’:’alex’} {‘age’:1000}最終kwargs爲{‘name’:’alex’ ,‘age’:1000}'''
# def dic(**kwargs):
# print(kwargs)
# dic(**{'name':'alex'}, **{'age':1000})
'''12. 下面代碼成立麼?若是不成立爲何報錯?怎麼解決?
題目一:
a = 2
def wrapper():
print(a)
wrapper()
題目二:
a = 2
def wrapper():
a += 1
print(a)
wrapper()
題目三:
def wrapper():
a = 1
def inner():
print(a)
inner()
wrapper()
題目四:
def wrapper():
a = 1
def inner():
a += 1
print(a)
inner()
wrapper()'''
# 題目一:成立。
# 題目二:不成立。由於wrapper函數內有賦值a=a+1,因此調用該函數時a被認爲是wrapper內部變量,可是在計算右邊的a+1時發現a沒在wapper內被定義,因此報錯。
# 在函數內部使用global關鍵字聲明變量a爲全局變量。
# 題目三:成立。
# 題目四:不成立。由於inner函數內有賦值a=a+1,因此當該函數被調用時a被認爲是inner內部變量,而計算a+1時又發現a沒在inner內部被定義,因此報錯。
# 在inner內部使用關鍵字nonlocal聲明a,來引用非全局的父級變量。
'''13. 寫函數,接收兩個數字參數,將較小的數字返回.'''
# def min(x, y):
# return x if x < y else y
# print(min(100, 10))
'''14. 寫函數,接收一個參數(此參數類型必須是可迭代對象),將可迭代對象的每一個元素以’_’相鏈接,造成新的字符串,並返回.
例如 傳入的可迭代對象爲[1,'老男孩','武sir']返回的結果爲’1_老男孩_武sir’'''
# def str_join(*args):
# return "_".join('%s' %i for i in args)
# ret=str_join(*[1,'老男孩','武sir'])
# print(ret)
'''15. 寫函數,傳入n個數,返回字典{‘max’:最大值,’min’:最小值}
例如:如:min_max(2,5,7,8,4) 返回:{‘max’:8,’min’:2}(此題用到max(),min()內置函數)'''
# def max_min(*args):
# dic = {}
# dic[max(args)] = "最大值"
# dic[min(args)] = "最小值"
# return dic
# ret = max_min(2,5,7,8,4,100,200,-1)
# print(ret)
#
'''16. 寫函數,傳入一個參數n,返回n的階乘
# 例如:cal(7) 計算7*6*5*4*3*2*1'''
# def cal(num):
# if num >= 0:
# sum = 1
# for i in range(1,num+1):
# sum *= i
# print(sum)
# else:
# print("負數沒有階乘")
# cal(7)
'''17. 寫函數,返回一個撲克牌列表,裏面有52項,每一項是一個元組
例如:[(‘紅心’,2),(‘草花’,2), …(‘黑桃’,‘A’)]'''
# def poker():
# poker_list = []
# color = ["黑桃", "紅心", "草花", "方塊"]
# j_k = ["J", "Q", "K"]
# for col in color:
# poker_list.append((col, "A"))
# for num in range(2, 11):
# for col in color:
# poker_list.append((col, num))
# for a in j_k:
# for col in color:
# poker_list.append((col, a))
# print(poker_list)
#
# poker()
'''18. 有以下函數:
def wrapper():
def inner():
print(666)
wrapper()
你能夠任意添加代碼,用兩種或以上的方法,執行inner函數.'''
#第一種:
# def wrapper():
# def inner():
# print(666)
# inner()
# wrapper()
#第二種:
# def wrapper():
# def inner():
# print(666)
# return inner
# ret = wrapper()
# ret()
'''做業:
用函數完成登陸註冊以及購物車的功能。
1,啓動程序,用戶可選擇四個選項:登陸,註冊,購物,退出。
2,用戶註冊,用戶名不能重複,註冊成功以後,用戶名密碼記錄到文件中。
3,用戶登陸,用戶名密碼從文件中讀取,進行三次驗證,驗證不成功則退出整個程序。
4,用戶登陸成功以後才能選擇購物功能進行購物,購物功能(就是將購物車封裝到購物的函數中)。
5,退出則是退出整個程序。'''
# # 登陸
# def login():
# dic = {}
# count = 3
# with open("user_auth.txt", encoding="utf-8", mode="r") as f:
# for i in f:
# l = i.strip().split(" ")
# dic[l[0]] = l[1]
# while count > 0:
# username = input("請輸入帳戶名: ")
# password = input("請輸入密碼: ")
# if username in dic and password == dic[username]:
# global login_session
# login_session = 1 #將登陸狀態置爲非0,表示已登陸
# print("登陸成功,能夠開始購物了")
# return shopping()
# elif username not in dic: #用戶名不存在則跳到註冊頁
# print("用戶名不存在,請註冊帳戶")
# return register()
# else:
# count -= 1
# if count == 0:
# print("錯誤次數過多,鎖定60分鐘")
# else:
# print("用戶名或密碼錯誤,還能嘗試" + str(count) + "次")
#
# # 註冊
# def register():
# while 1:
# username = input("請輸入您要註冊的用戶名: ")
# password = input("請輸入您的註冊密碼: ")
# s = username + " " + password
# with open("user_auth.txt", encoding="utf-8", mode="r+") as f:
# for line in f:
# l = line.split(" ")
# if username == l[0]:
# print("用戶名已存在: ")
# break
# else:
# f.write(s+"\n")
# print("註冊成功")
# break
#
#
# # 購物
# def shopping():
# # 商品信息
# goods = {"1":{"name":"電腦", "price":1999},
# "2":{'name':"鼠標", 'price':50},
# "3":{'name':"鍵盤", 'price':100}
# }
#
# # 購物車
# shopping_cart = {}
#
# # 判斷是否已登陸
# global login_session
# if login_session == 0:
# print("請先登陸帳號")
# return login() #未登陸時跳向登陸頁
#
# # 充值金額判斷
# while 1:
# money = input("請輸入您要充值的金額: ")
# if money.isdigit():
# print("充值成功,帳戶現存金額%s" % money)
# break
# else:
# print("非法字符,請從新輸入")
#
# while True:
# for i in goods:
# print(i, goods[i]["name"], goods[i]["price"])
# num = input("請輸入您要購買的商品編號或者輸入n結算或者按Q(q)退出: ")
# if num in goods:
# count = shopping_cart.setdefault(num,0)
# shopping_cart[num] = count + 1
#
# elif num == "n":
# print("開始結算")
# consum_money = 0
# for a in shopping_cart:
# consum_money += goods[a]["price"]*shopping_cart[a] # 計算消費總額
# if consum_money > int(money):
# for i in shopping_cart:
# print(i, goods[i]['name'], shopping_cart[i], goods[i]['price'])
# del_num = input("餘額不足,請選擇要刪除多餘的商品編號:")
# if del_num in shopping_cart:
# shopping_cart[del_num] = shopping_cart[del_num] - 1 #減小商品
# if shopping_cart[del_num] == 0:
# shopping_cart.pop(del_num)
# else:
# print("本次消費記錄以下")
# for i in shopping_cart:
# print(goods[i]['name'], shopping_cart[i], goods[i]['price'])
# surplus_money = int(money) - consum_money # 計算餘額
# print("這次共消費%s,帳戶餘額%s" % (consum_money, surplus_money))
# break
# elif num.lower() == "q":
# print("歡迎下次光臨")
# break
#
# else:
# print("您輸入的商品不存在")
# continue
# # 退出
# def f_quit():
# print("歡迎下次光臨")
# def main():
# opt = input("請輸入您的選項: A:登陸 | B:註冊 | C:購物 | D:退出: ")
# if opt == "A":
# login()
# elif opt == "B":
# register()
# elif opt == "C":
# shopping()
# elif opt == "D":
# f_quit()
# else:
# print("選擇有誤")
#
# login_session = 0 #定義登陸狀態,0爲未登陸,非0爲已登陸。
# main()
## cat user_auth.txt
elisun 123zhangsan 123lisi 456