1 什麼是數據?html
name='sunkedong'#字符串類型 age=24 #整型 date=2017.9#浮點型 dic={'name':'sunkedong','age':16}#字典類型 list=['sunkedong','18','24','man'] #列表類型 #以上都表示存儲的數據
2 爲什麼數據要分不一樣的類型node
數據是用來表示狀態的,不一樣的狀態就應該用不一樣的類型的數據去表示python
3 數據類型linux
數字(整形,長整形,浮點型,複數)git
字符串正則表達式
字節串:在介紹字符編碼時介紹字節bytes類型編程
列表api
元組數組
字典瀏覽器
集合
4 按照如下幾個點展開數據類型的學習
#一:基本使用 1 用途 2 定義方式 3 經常使用操做+內置的方法 #二:該類型總結 1 存一個值or存多個值 只能存一個值 能夠存多個值,值均可以是什麼類型 2 有序or無序 3 可變or不可變 !!!可變:值變,id不變。可變==不可hash !!!不可變:值變,id就變。不可變==可hash
整型與浮點型
#整型int 做用:年紀,等級,身份證號,qq號等整型數字相關 定義: age=10 #本質age=int(10) #浮點型float 做用:薪資,身高,體重,體質參數等浮點數相關 salary=3000.3 #本質salary=float(3000.3) #二進制,十進制,八進制,十六進制
其餘數字類型(瞭解)
#長整形(瞭解) 在python2中(python3中沒有長整形的概念): >>> num=2L >>> type(num) <type 'long'> #複數(瞭解) >>> x=1-2j >>> x.real 1.0 >>> x.imag -2.0
在定義變量時,若是字符串或整數的話 在短字符的狀況下 兩個變量id 相同,若是長字符或整數,id不一樣
#做用:名字,性別,國籍,地址等描述信息 #定義:在單引號\雙引號\三引號內,由一串字符組成 name='egon' #優先掌握的操做: 按索引取值(正向取+反向取) :只能取 切片(顧頭不顧尾,步長) 長度len 成員運算in和not in 移除空白strip 切分split 循環
3.二、strip移除空白或自定義字符(經常使用)
#默認會把空格取掉 name = 'sunkedong ' print(name.strip()) #這樣能夠指定*號 去掉 name='*sunkedong**' print(name.strip('*')) #去掉左邊的* print(name.lstrip('*')) #去掉右邊的* print(name.rstrip('*')) #注意:不能去掉中間的內容
3.三、匹配開頭和結尾(經常使用)
name='sunkedong_dz' #若是結尾_dz 爲真
print(name.endswith('dz'))
#若是開頭爲sun 爲真 print(name.startswith('sun'))
3.四、替換(經常使用)
name='My name is sunkedong,I love sunkedong' #默認爲-1 所有替換 print(name.replace('sunkedong','sunkd',-1)) #1 表明替換一次 print(name.replace('sunkedong','sunkd',1))
user_info='root:x:/root:/bin/bash' # 取第一個和第三個,由於顧頭不顧尾 print(user_info[0:4]) #以冒號分割 print(user_info.split(':')[0]) #以冒號分割 取第一次的結果 print(user_info.split(':',1))
備註:切成列表展現
3.六、format(經常使用)
msg='My name is {},age is {},sex is{}'.format('sunkedong',24,'man') print(msg) msg1='My name is {0},age is {1},sex is {2}'.format('sunkedong',24,'man') print(msg1) #這種方式最經常使用 msg2='My name is {name},age is {age},sex is {sex}'.format(name='sunkedong',sex='man',age=24) print(msg2)
3.七、字符串的查找(經常使用)
#find,rfind,index,rindex,count
jobs='My job is carry the engineers' print(jobs.find('job',1,6))#顧頭不顧尾,找不到則返回-1 ,找到了現實索引, print(jobs.index('t',0,22))#同上,可是找不到會報錯 print(jobs.count('e',1,25))#顧頭不顧尾,若是不指定範圍,則查找全部,查找指定字符串的和
find 查找不到報-1(經常使用方式) index 查找報錯 都不經常使用,後面會用到正則表達式
3.八、split 字符串的切分(經常使用)
msg='root:x:0:0:root:/root:/bin/bash' print(msg.split(':')) #指定:號來分割,默認是空格 name='C:/a/b/c/d.txt' print(name.split('/',1)) #切割1次 name1='root|mayi|admin' print(name1.rsplit('|',1)) #從右邊切一次
3.九、join(經常使用)
tag=' ' print(tag.join(['sunkedong','sunkezhou','wuguoju'])) # 鏈接字符串數組 以空格鏈接
3.十、字符填充(經常使用)
#center,ljust,rjust,zfill name='sunkedong' print(name.center(30,'-')) #全局填充爲30個字符,填充物爲- print(name.ljust(30,'*'))#左邊填充* 到30個字符 print(name.rjust(30,'*'))#右邊填充* 到30個字符 print(name.zfill(30))#填充0 到30個字符
3.十一、 轉換爲空格
name='sunke\tdong' print(name) print(name.expandtabs(2)) #把tab鍵轉換爲2個空格
3.十二、大小寫轉換
name='sunkedong' print(name.lower()) #大寫轉換爲小寫 # print(name.swapcase()) print(name.upper())# 小寫轉換爲大寫 #captalize,swapcase,title print(name.capitalize()) #首字母大寫 print(name.swapcase()) #大小寫翻轉 msg='egon say hi' print(msg.title()) #每一個單詞的首字母大寫
3.1三、數字的判斷(isdigit最經常使用)
#is數字系列 #在python3中 num1=b'4' #bytes num2=u'4' #unicode,python3中無需加u就是unicode num3='四' #中文數字 num4='Ⅳ' #羅馬數字 #isdigt:bytes,unicode print(num1.isdigit()) #True print(num2.isdigit()) #True print(num3.isdigit()) #False print(num4.isdigit()) #False #isdecimal:uncicode #bytes類型無isdecimal方法 print(num2.isdecimal()) #True print(num3.isdecimal()) #False print(num4.isdecimal()) #False #isnumberic:unicode,中文數字,羅馬數字 #bytes類型無isnumberic方法 print(num2.isnumeric()) #True print(num3.isnumeric()) #True print(num4.isnumeric()) #True #三者不能判斷浮點數 num5='4.3' print(num5.isdigit()) print(num5.isdecimal()) print(num5.isnumeric()) 總結: 最經常使用的是isdigit,能夠判斷bytes和unicode類型,這也是最多見的數字應用場景 若是要判斷中文數字或羅馬數字,則須要用到isnumeric
3.1四、is的其餘用法
#is其餘 print('===>') name='egon123' print(name.isalnum()) #字符串由字母或數字組成 print(name.isalpha()) #字符串只由字母組成 print(name.isidentifier()) print(name.islower()) print(name.isupper()) print(name.isspace()) print(name.istitle())
字符串相關的練習總結
# 寫代碼,有以下變量,請按照要求實現每一個功能 (共6分,每小題各0.5分) name = " aleX" # 1) 移除 name 變量對應的值兩邊的空格,並輸出處理結果 # 2) 判斷 name 變量對應的值是否以 "al" 開頭,並輸出結果 # 3) 判斷 name 變量對應的值是否以 "X" 結尾,並輸出結果 # 4) 將 name 變量對應的值中的 「l」 替換爲 「p」,並輸出結果 # 5) 將 name 變量對應的值根據 「l」 分割,並輸出結果。 # 6) 將 name 變量對應的值變大寫,並輸出結果 # 7) 將 name 變量對應的值變小寫,並輸出結果 # 8) 請輸出 name 變量對應的值的第 2 個字符? # 9) 請輸出 name 變量對應的值的前 3 個字符? # 10) 請輸出 name 變量對應的值的後 2 個字符? # 11) 請輸出 name 變量對應的值中 「e」 所在索引位置? # 12) 獲取子序列,去掉最後一個字符。如: oldboy 則獲取 oldbo。
列表操做
列表是咱們最之後最經常使用的數據類型之一,經過列表能夠對數據實現最方便的存儲、修改等操做
重點(有限掌握)
定義列表
msg=['sunkdong',18,'man','IT','henan','beijing']
取值
print(msg[2])#正取 print(msg[-1])#反向取 print(id(msg))#查看id
切片
print(msg[0:3])#取索引0,1,2,的值,顧頭不顧尾 print(msg[0:5:3]) #取索引0,1,2,3,4 步長爲3,步長的意思應該就是隔2(笨方法)
長度
print(len(msg))#顯示元素個數
成員運算
print('sunkd' in msg) print('sunkedong' in msg) print(18 in msg)
列表的刪除
msg.append('test') # print(msg) del msg[6]#利用內置方法刪除,不推薦使用 print(msg) msg.pop() #安照索引刪除,默認從末尾開始刪除。並且會保存被刪除 的值 rs=msg.pop()#查看保存的值 print(rs) print(msg)
追加
msg.append('test') print(msg)
刪除
msg.append('test') # print(msg) del msg[6]#利用內置方法刪除,不推薦使用 print(msg) msg.pop() #安照索引刪除,默認從末尾開始刪除。並且會保存被刪除 的值 rs=msg.pop()#查看保存的值 print(rs) print(msg)
經常使用操做 插入內容
msg=['sunkdong',18,'man','IT','henan','beijing'] msg.insert(0,'test2')#在0元素後面插入 msg.insert(2,'test1')#在2元素後面插入 print(msg) msg.extend([1,2,3,4])#末尾追加多個元素 print(msg)
瞭解便可
msg.clear()#清除列表內容 print(msg) c=msg.copy() #複製列表到另外一個列表 print(msg) print(c)
my_girl_friends.reverse()#列表的反轉 print(my_girl_friends) l=[3,4,-1,2] l.sort(reverse=True) print(l)
練習
#隊列:先進先出 #append,pop l1=[] l1.append('first') l1.append('second') l1.append('third') print(l1.pop(0)) print(l1.pop(0)) print(l1.pop(0)) #堆棧:先進後出 l1=[] l1.append('first') l1.append('second') l1.append('third') print(l1.pop()) print(l1.pop()) print(l1.pop()) l1=[] l1.insert(0,'first') l1.insert(0,'second') l1.insert(0,'third') print(l1) print(l1.pop(0)) print(l1.pop(0)) print(l1.pop(0))
元組
做用:存多個值,對比列表來講,元組不可變(是能夠當作字典的key的),主要是用來讀
定義方式:
ages=(10,12,18,33,18) #ages=tuple((10,12,18,33)) print(id(ages),type(ages),ages)
優先掌握的知識點:
#按照索引取值,正向和反向取值 print(ages[3]) print(ages[-1]) print(ages[0:2])#切片,顧頭不顧尾 print(10 in ages)#判斷值是否在列表中 print(len(ages))#取出值的長度 #其餘操做 print(ages.index(32)) #查找對應的索引位置 print(ages.count(22))#查找值有多少個
練習循環取值
while循環的方式
l=['a','b','c','d','e'] ll='a,b,c,d,e' lll=('a','b','c','d','e') index=0 while index < len(l): print(l[index]) index+=1 while index < len(ll): print(ll[index].strip(',')) index+=1 while index < len(lll): print(lll[index]) index+=1
for循環的方式讀取列表
for key in l: print(key) for key in ll: print(key) for key in lll: print(key)
#也能夠循環序列 for i in range(1,10): print(i)
#下面這種方式至關於先取出元素個數,而後在根據個數來循環索引所對應的值
for i in range(len(l)):
print(i,l[i])
結論:for循環 對於這種循環方式比較高效,無序類型不適合用循環讀取
字典類型
做用:存多個值,key-value存取,取值速度快
定義:key必須是不可變類型,value能夠是任意類型
msg={'name':'sunkedong','age':24,'sex':'man','jobs':'IT'} msg1={'name':'mayun','msg':['sleep','play']}#字典裏面能夠套用列表 # msg2={[1,2,3]:num}#列表不能當字典的key print(msg['name'])
#取出長度
print(len(msg))
#成員運算 if 'name' in msg: print('ok')
if 'sunkz' not in msg:
msg['sunkdz']=('music')
else:
msg['sunkz']=('read')
刪除
print(info.pop('name'))
print(info.pop('name1213','確實是沒有的,個人哥'))
print(info.pop('name1213',None))
print(msg.keys())#打印鍵 print(msg.values())#打印值 print(msg.items())#打印鍵值對 for key in msg.keys():#循環取出鍵 print(key) for valaues in msg.values():#循環取出值 print(valaues) for item in msg.items(): #循環取出鍵值對 print(item[0],item[1])
for k,v in msg.items():# print(k,v)
經常使用方法
print(msg['name123'])#若是沒有會報錯 print(msg.get('name123'))#若是沒有不會報錯,返回none print(msg.popitem())#刪除最後一對鍵值對
print(msg.setdefault('name1',['read','muscic'])) #有則不改,返回已經有的值,沒有則新增,返回新增的值 print(msg)
查找 若是不在給個默認值
print(id(msg.setdefault('def',['123','234']))) print(msg) print(id(msg['def']))
瞭解
info_new={'a':1,'age':19} info.update(info_new) print(info) dic={'name':None,'age':None,'sex':None,'hobbies':None} dic1={}.fromkeys(['name','age','hobbies'],None) print(dic1)
集合
做用:去重,關係運算,
# 定義:
# 1:每一個元素必須是不可變類型(可hash,可做爲字典的key)
# 2:沒有重複的元素
# 3:無序
s={1,2,'a','b','c','d','e','f'} #s=set({1,2,'a'}) print(type(s),s)
# 優先掌握的操做:
# 長度len
s={1,2,'a','b','c','d','e','f'} print(len(s)) # 成員運算in和not in print('a' in s) for item in s: print(item)
# | 並集
s1={1,2,3} s2={3,4,5} print(s1 | s2)
# & 交集
print(s1 & s2)
# -差集
print(s1 - s2) print(s2 - s1)
# ^ 對稱差集
s1={1,2,3}
s2={3,4,5}
==
> , >= , <, <= 父集,子集
s1={1,2,3,4} s2={3,4,5} print(len(s1) > len(s2)) s1={1,2,3,4} s2={3,4} print(s1 > s2) print(s1 >= s2)
print(s1.issuperset(s2))
print(s2.issubset(s1))
#去重 # l=['a','b',1,'a','a'] # print(list(set(l))) # l=['a','b',1,'a','a'] # l_new=list() # s=set() # for item in l: # if item not in s: # s.add(item) # l_new.append(item) l=[ {'name':'egon','age':18,'sex':'male'}, {'name':'alex','age':73,'sex':'male'}, {'name':'egon','age':20,'sex':'female'}, {'name':'egon','age':18,'sex':'male'}, {'name':'egon','age':18,'sex':'male'}, ] l_new=list() s=set() for item in l: res = (item['name'], item['age'], item['sex']) if res not in s: s.add(res) l_new.append(item) print(l_new) #瞭解:不可變集合 fset=frozenset({1,2,3}) fset.
練習
有以下兩個集合,pythons是報名python課程的學員名字集合,linuxs是報名linux課程的學員名字集合
pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'}
linuxs={'wupeiqi','oldboy','gangdan'}
1. 求出即報名python又報名linux課程的學員名字集合
2. 求出全部報名的學生名字集合
3. 求出只報名python課程的學員名字
4. 求出沒有同時這兩門課程的學員名字集合
pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'} linuxs={'wupeiqi','oldboy','gangdan'} print(pythons&linuxs) print(pythons|linuxs) print(pythons) print(pythons^linuxs)
bool類型
bool值:全部的數據類型都自帶布爾值
#布爾值爲假的狀況:0,空,None
x=None
# print(bool(x))
if x:
print('ok')
else:
print('ono')
字符編碼
1. 計算機基礎知識
2. 文本編輯器存取文件的原理(nodepad++,pycharm,word)
打開編輯器就打開了啓動了一個進程,是在內存中的,因此,用編輯器編寫的內容也都是存放與內存中的,斷電後數據丟失
要想永久保存,須要點擊保存按鈕:編輯器把內存的數據刷到了硬盤上。
在咱們編寫一個py文件(沒有執行),跟編寫其餘文件沒有任何區別,都只是在編寫一堆字符而已。
3. python解釋器執行py文件的原理 ,例如python test.py
第一階段:python解釋器啓動,此時就至關於啓動了一個文本編輯器
第二階段:python解釋器至關於文本編輯器,去打開test.py文件,從硬盤上將test.py的文件內容讀入到內存中(小複習:pyhon的解釋性,決定了解釋器只關心文件內容,不關心文件後綴名)
第三階段:python解釋器解釋執行剛剛加載到內存中test.py的代碼( ps:在該階段,即執行時,纔會識別python的語法,執行文件內代碼,執行到name="egon",會開闢內存空間存放字符串"egon")
總結python解釋器與文件本編輯的異同:
相同點:python解釋器是解釋執行文件內容的,於是python解釋器具有讀py文件的功能,這一點與文本編輯器同樣
不一樣點:文本編輯器將文件內容讀入內存後,是爲了顯示or編輯,根本不去理會python的語法,而python解釋器將文件內容讀入內存後,是爲了執行,會識別python語法。
2、 什麼是字符編碼
計算機要想工做必須通電,即用‘電’驅使計算機幹活,也就是說‘電’的特性決定了計算機的特性。電的特性即高低電平(人類從邏輯上將二進制數1對應高電平,二進制數0對應低電平),關於磁盤的磁特性也是一樣的道理。結論:計算機只認識數字
很明顯,咱們平時在使用計算機時,用的都是人類能讀懂的字符(用高級語言編程的結果也無非是在文件內寫了一堆字符),如何能讓計算機讀懂人類的字符?
必須通過一個過程:
字符--------(翻譯過程)------->數字
這個過程實際就是一個字符如何對應一個特定數字的標準,這個標準稱之爲字符編碼
如下兩個場景下涉及到字符編碼的問題:
1. 一個python文件中的內容是由一堆字符組成的,存取均涉及到字符編碼問題(python文件並未執行,前兩個階段均屬於該範疇)
2. python中的數據類型字符串是由一串字符組成的(python文件執行時,即第三個階段)
三 字符編碼的發展史
階段一:現代計算機起源於美國,最先誕生也是基於英文考慮的ASCII
ASCII:一個Bytes表明一個字符(英文字符/鍵盤上的全部其餘字符),1Bytes=8bit,8bit能夠表示0-2**8-1種變化,便可以表示256個字符
ASCII最初只用了後七位,127個數字,已經徹底可以表明鍵盤上全部的字符了(英文字符/鍵盤的全部其餘字符)
後來爲了將拉丁文也編碼進了ASCII表,將最高位也佔用了
階段二:爲了知足中文,中國人定製了GBK
GBK:2Bytes表明一箇中文字符,1Bytes表示一個英文字符
爲了知足其餘國家,各個國家紛紛定製了本身的編碼
日本把日文編到Shift_JIS裏,韓國把韓文編到Euc-kr裏
階段三:各國有各國的標準,就會不可避免地出現衝突,結果就是,在多語言混合的文本中,顯示出來會有亂碼。
因而產生了unicode(定長), 統一用2Bytes表明一個字符, 雖然2**16-1=65535,但unicode卻能夠存放100w+個字符,由於unicode存放了與其餘編碼的映射關係,準確地說unicode並非一種嚴格意義上的字符串編碼表,下載pdf來查看unicode的詳情:
連接:https://pan.baidu.com/s/1dEV3RYp
很明顯對於通篇都是英文的文原本說,unicode的式無疑是多了一倍的存儲空間(二進制最終都是以電或者磁的方式存儲到存儲介質中的)
因而產生了UTF-8(可變長),對英文字符只用1Bytes表示,對中文字符用3Bytes,對其餘生僻字用更多的字節Bytes去存
須要強調的是:
毫無疑問utf-8比unicode更節省空間,並且都能兼容萬國,那爲什麼不所有采用utf-8呢?
其一:若是咱們能統一全世界,廢除全部現有的計算機編碼體系,而後大一統都採用utf-8,那麼亂碼問題將不復存在,很明顯不少地方仍會採用各類各樣的編碼,這是歷史遺留問題。於是咱們必須尋求一種與全世界的編碼都有映射關係的解決方案,這就是unicode,而utf8是沒有與其餘編碼的映射關係的。
其二:內存中統一採用unicode,浪費空間來換取能夠轉換成任意編碼(不亂碼),硬盤能夠採用各類編碼,如utf-8,保證存放於硬盤或者基於網絡傳輸的數據量很小,提升傳輸效率與穩定性。
四.字符編碼分類(簡單瞭解)
計算機由美國人發明,最先的字符編碼爲ASCII,只規定了英文字母數字和一些特殊字符與數字的對應關係。最多隻能用 8 位來表示(一個字節),即:2**8 = 256,因此,ASCII碼最多隻能表示 256 個符號
固然咱們編程語言都用英文沒問題,ASCII夠用,可是在處理數據時,不一樣的國家有不一樣的語言,日本人會在本身的程序中加入日文,中國人會加入中文。
而要表示中文,單拿一個字節表表示一個漢子,是不可能表達完的(連小學生都認識兩千多個漢字),解決方法只有一個,就是一個字節用>8位2進製表明,位數越多,表明的變化就多,這樣,就能夠儘量多的表達出不通的漢字
因此中國人規定了本身的標準gb2312編碼,規定了包含中文在內的字符->數字的對應關係。
日本人規定了本身的Shift_JIS編碼
韓國人規定了本身的Euc-kr編碼(另外,韓國人說,計算機是他們發明的,要求世界統一用韓國編碼)
這時候問題出現了,精通18國語言的小周同窗謙虛的用8國語言寫了一篇文檔,那麼這篇文檔,按照哪國的標準,都會出現亂碼(由於此刻的各類標準都只是規定了本身國家的文字在內的字符跟數字的對應關係,若是單純採用一種國家的編碼格式,那麼其他國家語言的文字在解析時就會出現亂碼)
因此迫切須要一個世界的標準(能包含全世界的語言)因而unicode應運而生(韓國人表示不服,而後沒有什麼卵用)
ascii用1個字節(8位二進制)表明一個字符
unicode經常使用2個字節(16位二進制)表明一個字符,生僻字須要用4個字節
例:
字母x,用ascii表示是十進制的120,二進制0111 1000
漢字中
已經超出了ASCII編碼的範圍,用Unicode編碼是十進制的20013
,二進制的01001110 00101101
。
字母x,用unicode表示二進制0000 0000 0111 1000,因此unicode兼容ascii,也兼容萬國,是世界的標準
這時候亂碼問題消失了,全部的文檔咱們都使用可是新問題出現了,若是咱們的文檔通篇都是英文,你用unicode會比ascii耗費多一倍的空間,在存儲和傳輸上十分的低效
本着節約的精神,又出現了把Unicode編碼轉化爲「可變長編碼」的UTF-8
編碼。UTF-8編碼把一個Unicode字符根據不一樣的數字大小編碼成1-6個字節,經常使用的英文字母被編碼成1個字節,漢字一般是3個字節,只有很生僻的字符纔會被編碼成4-6個字節。若是你要傳輸的文本包含大量英文字符,用UTF-8編碼就能節省空間:
字符 | ASCII | Unicode | UTF-8 |
---|---|---|---|
A | 01000001 | 00000000 01000001 | 01000001 |
中 | x | 01001110 00101101 | 11100100 10111000 10101101 |
從上面的表格還能夠發現,UTF-8編碼有一個額外的好處,就是ASCII編碼實際上能夠被當作是UTF-8編碼的一部分,因此,大量只支持ASCII編碼的歷史遺留軟件能夠在UTF-8編碼下繼續工做。
五 字符編碼的使用
unicode----->encode-------->utf-8
utf-8-------->decode---------->unicode
補充:
瀏覽網頁的時候,服務器會把動態生成的Unicode內容轉換爲UTF-8再傳輸到瀏覽器
若是服務端encode的編碼格式是utf-8, 客戶端內存中收到的也是utf-8編碼的結果。
詳細看下面文章
http://www.cnblogs.com/linhaifeng/articles/5950339.html
做業1:
menu_dic={ '北京':{'昌平':{'十三陵':{},'莽山':{}},'海淀':{'香山':{},'鳳凰嶺':{}}}, '上海':{'浦東':{'新區':{},'迪士尼':{}},'寶山':{'碼頭':{},'公園':{}}}, '江蘇':{'蘇州':{'蘇州園林':{},'古蹟':{}},'紹興':{'紹興古城':{},'西施故里':{}}}, } tag = True select_list = menu_dic layers_list = [menu_dic] count=0 while tag: for select in select_list: print(select) select_city = input("輸入你要去的城市[輸入quit程序/exit退出上層菜單]:").strip() if select_city == "exit": print('退出程序') break if select_city== "quit": if count == 0: print('退出程序...') #第一次退出,count爲0 break select_list = layers_list[-1] layers_list.pop() count-=1 elif select_city not in select_list:#若是輸入不在列表中,退出本次循環 continue else: # print(layers_list) layers_list.append(select_list) #這裏主要是quit使用 # print(layers_list) # print(select_list) select_list = select_list[select_city] # print(select_list) count+=1 #count+1
做業2:
shop_list = { 'apple': '8488', 'huawei': '3499', 'oppo': '2599' } user=open('user.txt'.encode('utf-8')) user_file=user.readline() user_line=user_file.split(':')[0] passwd=user_file.split(':')[1] count = 0 while count < 3: username = input('請輸入用戶名:').strip() password = input('請輸入密碼:').strip() if username == user_line and password == passwd: print('登陸成功') gongzi = input('輸入你的工資:') if gongzi.isdigit(): gongzi=int(gongzi) else: print('輸入錯誤,請重試.') tag = True while tag: for k, v in shop_list.items(): print('商品信息:%s,價格:%s' % (k, v)) print('你的工資是%s' % (gongzi)) shop = input('須要買哪款?'.strip()) shop_num = input('須要買的數量?') if shop_num.isdigit(): shop_num=int(shop_num) else: print('請輸入整數') continue if shop in shop_list: shop_price = int(shop_list[shop]) shop_all = (shop_price * shop_num) if shop_all > gongzi: print('餘額不足!還想買%s,好好努力吧!少年' % (shop)) q = input('是否退出[y/n]') if q == 'y': break else: gongzi_sy = gongzi - shop_all print('已經添加到購物列表.') gongzi = gongzi_sy if 'gm' not in locals().keys(): gm = [shop] else: gm.append(shop) q = input('是否退出[y/n]') if q == 'y': for key in gm: print('您夠買的商品以下:%s'%(key)) # print(gm) break else: count += 1 print('你已經輸入%s次' % (count))