上節作業回顧(講解+溫習90分鍾)
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# author:Mr.chen
# 僅用列表+循環實現“簡單的購物車程序”
import os,time
goods = [("蘋果",300),("白菜",400),("鴨梨",1000),("柿子",3000),("芒果",5000),("桂圓",8000)]
Tag = True
buy_List = []
while Tag :
os.system("clear")
salary = input("請輸入你的工資(輸入q退出程序):")
if salary == "q" or salary == "Q" :
print ("您並未購買商品,程序退出!")
exit()
elif salary.isdigit() :
salary = int(salary)
break
else :
print ("請以數字的形式輸入您的工資!")
time.sleep(1.5)
while Tag :
os.system("clear")
title = "《商品清單》 您的余額為:{}元".format(salary)
print (title)
for item in goods :
print (goods.index(item)+1,item[0],item[1])
while Tag :
num = input("請輸入想要購買的商品的編號(輸入q退出程序並結帳):")
if num == "q" or num == "Q" :
if len(buy_List) == 0 :
print ("您沒有買任何東西,程序退出!")
exit()
else :
for index in buy_List :
print ("您購買了一件{}商品,價格為:{}".format(goods[index-1][0],goods[index-1][1]))
else :
print ("您的最后余額為{}元,程序退出!".format(salary))
exit()
elif num.isdigit() and int(num) <= len(goods) and int(num) != 0 :
num = int(num)
break
else :
print ("請輸入正確的數字編號,只能單選!")
while Tag :
if salary < goods[num-1][1] :
print ("您的余額已不足,請重新選擇商品!")
time.sleep(1.5)
break
else :
salary = salary - goods[num-1][1]
buy_List.append(num)
print ("{}商品購買成功!您的余額為{}元".format(goods[num-1][0],salary))
time.sleep(1.5)
break
一,Python3 入門知識補充
1.1 bytes類型
- Python 3 最重要的新特性大概要算對文本和二進制數據作了更為清晰的區分。文本總是Unicode,由str類型表示,二進制數據則由bytes類型表示。Python 3不會以任意隱式的方式混用str和bytes,正是這使得兩者的區分特別清晰。你不能拼接字符串和字節包,也無法在字節包里搜索字符串(反之亦然)。這是件好事。
- 不管怎樣,字符串和字節包之間的界線是必然的,下面的圖解非常重要,務請牢記於心:
#在Python3中,字符串和二進制可以相互轉換
>>> "你好嗎?".encode() #將字符串轉換成二進制
b'\xe4\xbd\xa0\xe5\xa5\xbd\xe5\x90\x97\xef\xbc\x9f'
>>> "你好嗎?".encode().decode() #將二進制轉換成字符串
'你好嗎?'
特別提示:
在Python3中,如果要進行數據傳輸(Python的網絡編程),必須先將字符串轉換成二進制的格式才能進行傳輸。對方接收后,再轉換回字符串進行識別。
在Python2.7中則沒有以上要求。
1.2 三元運算
#正常寫法
>>> a,b,c
(1, 3, 5)
>>> if a > b : c = a
... else : c = b
...
>>> c
3
#三元運算寫法
>>> a,b,c = 1,3,5
>>> d = a if a > b else c #如果a大於b,那么d = a 否則的話,d = c
>>> d
5
如果我們用正常邏輯來寫這段代碼,需要寫多行,很麻煩。如果我們用三元運算來寫,一行即可。
1.3 進制
- 二進制:01
- 八進制:01234567
- 十進制:0123456789
- 十六進制:0123456789ABCDEF
二進制與十六進制之間的進制轉換
http://jingyan.baidu.com/album/47a29f24292608c0142399cb.html?picindex=1
計算機內存地址和為什么用16進制?
為什么用16進制?
- 計算機硬件是0101二進制的,16進制剛好是2的倍數,更容易表達一個命令或者數據。十六進制更簡短,因為換算的時候一位16進制數可以頂4位2進制數,也就是一個字節(8位進制可以用兩個16進制表示)
- 最早規定ASCII字符集采用的就是8bit(后期擴展了,但是基礎單位還是8bit),8bit用2個16進制直接就能表達出來,不管閱讀還是存儲都比其他進制要方便
- 計算機中CPU運算也是遵照ASCII字符集,以16、32、64的這樣的方式在發展,因此數據交換的時候16進制也顯得更好
- 為了統一規范,CPU、內存、硬盤我們看到都是采用的16進制計算
16進制用在哪里?
- 網絡編程,數據交換的時候需要對字節進行解析都是一個byte一個byte的處理,1個byte可以用0xFF兩個16進制來表達。通過網絡抓包,可以看到數據是通過16進制傳輸的。
- 數據存儲,存儲到硬件中是0101的方式,存儲到系統中的表達方式都是byte方式
- 一些常用值的定義,比如:我們經常用到的html中color表達,就是用的16進制方式,4個16進制位可以表達好幾百萬的顏色信息。
二,字典
字典是一種key-value的數據類型,使用就像我們上學用的字典,通過筆畫,字母來查對應頁的詳細內容
語法:
info = {
'stu1101':"TengLan Wu",
'stu1102':"LongZe Luola",
'stu11103':"XiaoZe Maliya",
}
字典的特性:
- dict是無序的
- key必須是唯一的(不能重復)
2.1 增加
#代碼演示
>>> Dict = {'stu1101':"yunjisuan","stu1102":"benet","stu1103":"Tom","stu1104":"Amy"}
>>> Dict["stu1105"] = "蒼井空"
>>> Dict
{'stu1102': 'benet', 'stu1104': 'Amy', 'stu1105': '蒼井空', 'stu1101': 'yunjisuan', 'stu1103': 'Tom'}
如果想要賦值的字典的key值,在原字典里沒有,那么就會被判斷為是要新增字典元素
因為字典是無序的,所以增加的key:value后,在字典中的位置不固定。
2.2 修改
#代碼演示
>>> Dict = {'stu1101':"yunjisuan","stu1102":"benet","stu1103":"Tom","stu1104":"Amy"}
>>> Dict["stu1102"] = "武藤蘭"
>>> Dict
{'stu1102': '武藤蘭', 'stu1104': 'Amy', 'stu1101': 'yunjisuan', 'stu1103': 'Tom'}
如果想要賦值的字典的key值,在原字典里已經存在,那么就會被判定為是要修改字典中已經有的key值所對應的value值;
2.3 刪除
(1)指定key值進行刪除
#代碼演示:
>>> Dict = {"stu1101":"Tom","stu1102":"Amy","stu1103":"feixue","stu1104":"zhangsan","stu1105":"lisi"}
>>> Dict
{'stu1101': 'Tom', 'stu1103': 'feixue', 'stu1104': 'zhangsan', 'stu1105': 'lisi', 'stu1102': 'Amy'}
>>> Dict.pop("stu1101") #刪除指定key,key所對應的value作為返回值(標准用法)
'Tom'
>>> Dict
{'stu1103': 'feixue', 'stu1104': 'zhangsan', 'stu1105': 'lisi', 'stu1102': 'Amy'}
>>> del Dict["stu1104"] #刪除指定key,無返回值
>>> Dict
{'stu1103': 'feixue', 'stu1105': 'lisi', 'stu1102': 'Amy'}
(2)刪除整個字典
#代碼演示:
>>> Dict = {"stu1101":"Tom","stu1102":"Amy","stu1103":"feixue","stu1104":"zhangsan","stu1105":"lisi"}
>>> Dict
{'stu1101': 'Tom', 'stu1103': 'feixue', 'stu1104': 'zhangsan', 'stu1105': 'lisi', 'stu1102': 'Amy'}
>>> del Dict
>>> Dict #字典全被刪除,所以找不到了
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'Dict' is not defined
(3)隨機刪除字典的key:value,並將刪除的key:value作為返回值
#代碼演示:
>>> Dict = {"stu1101":"Tom","stu1102":"Amy","stu1103":"feixue","stu1104":"zhangsan","stu1105":"lisi"}
>>> Dict.popitem()
('stu1101', 'Tom')
>>> Dict.popitem()
('stu1103', 'feixue')
>>> Dict.popitem()
('stu1104', 'zhangsan')
>>> Dict
{'stu1105': 'lisi', 'stu1102': 'Amy'}
2.4 查找
#代碼演示:
>>> Dict = {"stu1101":"Tom","stu1102":"Amy","stu1103":"feixue","stu1104":"zhangsan","stu1105":"lisi"}
>>> "stu1102" in Dict #標准用法
True
>>> Dict.get("stu1102") #獲取value
'Amy'
>>> Dict["stu1102"] #也是獲取value,但是看下面
'Amy'
>>> Dict["stu1108"] #當字典中沒有該key,會報錯
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'stu1108'
>>> Dict.get("stu1108") #get()找不到key不會報錯。
2.5 提取字典里所有的keys
#代碼演示:
>>> Dict = {"stu1101":"Tom","stu1102":"Amy","stu1103":"feixue","stu1104":"zhangsan","stu1105":"lisi"}
>>> "stu1101" in Dict #可以直接判斷字符串是否在一個字典的keys中
True
>>> Dict.keys() #提取字典所有的keys,返回一個字典類型的keys列表
dict_keys(['stu1102', 'stu1104', 'stu1101', 'stu1103', 'stu1105'])
>>> "stu1101" in Dict.keys() #也可以判斷字符串是否存在於字典所有keys所組成的列表中
True
特別提示:
在此處的應用上Python2.7和Python3是有比較大的差別的。
#在Python2.7中
>>> a = {"a":"1","b":"2"}
>>> a.keys() #返回一個list類型
['a', 'b']
>>> list(a) #也返回一個list類型
['a', 'b']
>>> a.keys().index("b") #list類型才有index索引
1
>>> list(a).index("b") #list類型才有index索引
1
#在Python3中
>>> a = {"a":"1","b":"2"}
>>> list(a) #返回一個列表類型
['b', 'a']
>>> list(a).index("b") #列表類型才有索引
0
>>> a.keys() #返回的還是一個字典類型的keys
dict_keys(['b', 'a'])
>>> a.keys().index("b") #字典類型的keys沒有索引
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'dict_keys' object has no attribute 'index'
2.6 提取字典里所有的values
#代碼演示:
>>> Dict = {"stu1101":"Tom","stu1102":"Amy","stu1103":"feixue","stu1104":"zhangsan","stu1105":"lisi"}
>>> "Amy" in Dict #不能判斷字符串是否存在於字典的values中
False
>>> Dict.values() #提取字典的所有values,返回一個字典類型的values列表
dict_values(['Amy', 'zhangsan', 'Tom', 'feixue', 'lisi'])
>>> "Amy" in Dict.values() #可以判斷字符串是否存在於字典所有的values所組成的列表中
True
2.7 字典的合並
>>> Dict = {"stu1101":"Tom","stu1102":"Amy","stu1103":"feixue","stu1104":"zhangsan","stu1105":"lisi"}
>>> Dict2={"1":"2","3":"4","stu1102":"更新了"}
>>> Dict.update(Dict2)
>>> Dict
{'stu1105': 'lisi', 'stu1103': 'feixue', '3': '4', '1': '2', 'stu1104': 'zhangsan', 'stu1101': 'Tom', 'stu1102': '更新了'}
字典的合並是沒有的key:values會新增到舊的字典中,如果key值出現重復就會進行value的更新操作。
2.8 多級字典嵌套及操作
#代碼演示:
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# author:Mr.chen
av_catalog = {
"歐美":{
"www.youporn.com":["很多免費的,世界最大的","質量一般"],
"www.pornhub.com":["很多免費的,也很大","質量比yourporn高點"],
"x-art.com":["質量很高","全部收費,屌絲請繞過"]
},
"日韓":{
"tokyo-hot":["質量怎樣不清楚,個人已經不喜歡日韓范了","聽說是收費的"]
},
"大陸":{
"1024":["全部免費,真好,好人一生平安","服務器在國外,慢"]
}
}
av_catalog["大陸"]["1024"][1] += ",可以用爬蟲爬下來"
print (av_catalog["大陸"]["1024"])
#輸出
[root@localhost scripts]# python3 test.py
['全部免費,真好,好人一生平安', '服務器在國外,慢,可以用爬蟲爬下來']
2.9 循環dict
#代碼演示:
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# author:Mr.chen
Dict = {
"stu1001":"Tom",
"stu1002":"Amy",
"stu1003":"benet",
"stu1004":"yunjisuan"
}
for key in Dict :
print (key,Dict[key])
#輸出
[root@localhost scripts]# python3 test.py
stu1002 Amy
stu1001 Tom
stu1003 benet
stu1004 yunjisuan
2.10 循環dict時附帶索引
#代碼演示:
a = {
"yunjisuan":"33",
"benet":"44",
"Tom":"22",
"chensiqi":"88"
}
for index,keys in enumerate(a) :
print (index+1,keys,a[keys])
#輸出結果
[root@localhost scripts]# python3 test2.py
1 chensiqi 88
2 Tom 22
3 yunjisuan 33
4 benet 44
2.11 如何讓字典有序?
#代碼演示:
a = {
"yunjisuan":"33",
"benet":"44",
"Tom":"22",
"chensiqi":"88"
}
b = []
for index,keys in enumerate(a) :
b.append((index+1,keys,a[keys]))
print (index+1,keys,a[keys])
print (b)
#輸出結果
[root@localhost scripts]# python3 test2.py
1 Tom 22
2 yunjisuan 33
3 chensiqi 88
4 benet 44
[(1, 'Tom', '22'), (2, 'yunjisuan', '33'), (3, 'chensiqi', '88'), (4, 'benet', '44')]
三,利用字典優化"用戶登陸接口程序"
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# author:Mr.chen
#利用字典功能優化“用戶登陸驗證接口功能”
users = {"chensiqi1":"666666","chensiqi2":"666666"}
error = []
while True :
user_Name = input("請輸入登錄用戶的用戶名:")
if user_Name in error :
print ("用戶已經被鎖定,請嘗試登陸其他用戶!")
elif user_Name in users.keys() :
for i in range(3) :
user_Passwd = input("請輸入登陸用戶名的密碼:")
if user_Passwd == users[user_Name] :
print ("{}用戶登陸成功!".format(user_Name))
exit()
else :
print ("用戶賬戶或密碼輸入錯誤!請重新輸入,您還有{}次機會。".format(2-i))
else :
print ("您的密碼已經輸錯3次了,賬戶已經鎖定!請嘗試登陸其他用戶。")
error.append(user_Name)
else :
print ("沒有這個賬戶名,請重新輸入!")
四,邏輯引導與作業
邏輯引導:
- 我們學習了字典的各種存取方法,並且利用字典的key:values的便利的鍵值對應方式優化了“用戶登陸接口”
- 但是,我們仍在存在着不少問題。比如我們輸入輸出數據時,有不少的數據都是字符串的格式。尤其在用戶輸入數據時,用戶總是喜歡輸入一些非常奇怪的數據。比如:“你好嗎?”他非要輸入成“(空格)你好嗎(空格) ”。
- 對類似這些空格數據,我們很難做出判斷。他到底輸入的是不是一個正常數據。再比如用戶在菜單選擇里,我們同學們都已經知道了,通過字符串的.isdigit()來判斷用戶輸入的是不是一個純數字組成的數據。
- 是的,類似這些對字符串數據的判斷,是我們在日常編程中經常要遭遇的問題。這就需要我們學習下一節的知識--->字符串的24種常用方法
作業:
程序:三級菜單
要求:
- [x] :打印省,市,縣三級菜單
- [x] :只能用一個字典來存取地區名稱
- [x] :可返回上一級
- [x] :可隨時退出程序