python開發學習筆記之二(購物車練習)

  

第二章 

二進制、字符編碼、數據類型 :
二進制:省略
 字符編碼:
 中文 GB2312  GBK   GB18030  
           BIG5(繁體)         
統一字符編碼:unicode   utf-8
在python2中默認不支持中文,須要在開頭聲明編碼格式爲UTF-8
 
數據類型:
列表:
語法 [  ]
 列表是一個數據集合,集合內能夠放各類數據類型
能夠進行建立/查詢/切片/增長/刪除/修改/循環/排序
建立:
name = ['zhangsan','lisi','wangwu',1,2,3,4,5,2,2]
查詢:
name[0] #取列表第一個
name[-1] #取列表最後一個
name.index('wangwu') #元素的索引值,當有重複的元素時只會返回第一個元素的索引值
name.count(2) #對同一元素計數
切片:
name[0:2]
name[-5:-1]

#切片只能從左往右切
增長:
  追加:
name.append(2333)
  插入:
name.insert(2,'wilbur')
  #在name[2]前插入元素‘wilbur’
替換(修改):
 name[3] = 'zzz'
刪除:
name.pop()  #刪除末尾
name.remove('zhangsan')    #刪除指定元素
del name[2]   #全局刪除
del name[2:6] #切片刪除
循環:
for i in name:
    print(i)
排序:
name.sort()   不一樣數據類型不能混排
排序規則爲ASCII碼順序
倒序:
name.reverse()
擴展:
name+n2
name.expend(n2)
清空:
name.clear()
copy(文本複製):
n2 = name.copy()

列表練習:
循環列表names,打印每一個元素的索引值和元素,當索引值爲偶數時,把對應的元素改成-1
names = ['zhangsan','lisi','wangwu','zhaoliu','shanshan','alex']
for index,i in enumerate(names):

    if index%2 == 0:
        names[index] = -1
    print(index, i)

print(names)
列表中包含多個2,返回第二個2的索引值
names = ['zhangsan','lisi','wangwu','zhaoliu','shanshan','alex',3,45,24,6,2,546,2]
 
names2 = names[names.index(2)+1:] #獲取第一個2的索引值後加一
print(names2.index(2)+names.index(2)+1) #打印第二個2的索引值

最後一個是購物車程序:python

寫一個循環,不斷的問用戶想買什麼,用戶選擇一個商品編號,就把對應的商品添加到購物車裏, 最終用戶輸入q退出時,打印購物車裏的商品列表
 1 # author:wilbur0402
 2 products = [['Iphone8', 6888], ['MacPro', 14800], ['小米6', 2499], ['Coffee', 31], ['Book', 80], ['Nike Shoes', 799]]
 3 
 4 shopping_cart = []
 5 while True:
 6     print('------products list------')
 7     for index,i in enumerate(products):
 8         print('%s.%s    %s'%(index,i[0],i[1]))
 9     chioce = input('請輸入你須要購買的序號:(0-5)')
10     if chioce.isdigit():
11         chioce = int(chioce)
12         if chioce >= 0 and chioce < len(products):
13             shopping_cart.append(products[chioce])
14             print('added %s to shopping cart!'%products[chioce][0])
15         else:
16             print('商品不存在!')
17     elif chioce == 'q':
18         print('------你已購買如下商品------')
19         for index, i in enumerate(shopping_cart):
20             print('%s.%s    %s' % (index, i[0], i[1]))
21         break
22     else:
23         print('輸入有誤!')

以前作這種題徹底沒有思路,各類需求混爲一談。在此我介紹一下個人方法:git

1.先作出最基本的功能api

  這個練習最基本的功能就是:打印商品列表——用戶輸入——打印輸入購買的商品安全

 

2.增長循環功能:app

  增長死循環,使其能不斷詢問用戶ide

3.增長判斷功能:測試

當用戶輸入爲q時,退出並打印已購列表,或者當用戶輸入不正確時,返回信息ui

總結一句話就是:google

基本功能——增長功能——完善功能編碼


 

 

字符串操做:

 

# author:wilbur0402
name = 'my name is \t{nm} and im {yr}year old'
print(name.capitalize())#首字母大寫
print(name.count('a'))#統計字符中a的個數
print(name.center(50,'-'))#字符居中填充,,輸出50個字符,字符不夠用-補上
print(name.endswith('an'))#判斷字符串是否以an結尾
print(name.expandtabs(tabsize=30))#將\t轉爲30個空格
print(name.find('name'))#查找字符位置  用來切片
print(name.format(nm='zhangsan',yr=21))
print('wilbur0402'.isalnum())#判斷是否只包含數字和字母
print(name.isalpha())#判斷是否爲純英文字母
print(name.isdigit())print('1a'.isidentifier())#判斷是否爲合法的標識符(變量名稱)
print('My Name Is'.istitle())#判斷是否爲標題
print('My Name Is'.isupper())#判斷全爲小寫
print('My Name Is'.islower())
print('My Name Is'.upper())#將小寫修改成大寫
print('My Name Is'.lower())

print(','.join(['zhangsan','lisi','wangwu']))#列表轉進字符串中
print(name.ljust(50,'*'))#字符居左填充,輸出50個字符,字符不夠右側用*補上
print(name.rjust(50,'*'))#字符居右填充,輸出50個字符,字符不夠右側用*補上
print('\nMy Name Is\n'.lstrip())#去掉左側換行或空格
print('\nMy Name Is\n'.rstrip())
print('\nMy Name Is\n'.strip())#去掉兩側換行或空格
p = str.maketrans('abcdef','123456')#對應
print('zhangsan'.translate(p))#傳入
print("zhangsan".replace('a','A',1))#替換
print('zhangsan'.rfind('n'))#返回n最右邊的那個的下標
print('zhang san'.split('a'))#將字符串按a分紅列表
print('zhang\nsan'.splitlines())
print('ZhangSan'.swapcase())#反向大小寫
print('zhangsan'.title())#標題化
print('zhangsan'.zfill(50))

 

以上爲字符串的基本方法,沒必要所有記憶,強調幾個經常使用的方法:

'zhangsan'.isdigit() #判斷是否爲數字
'zhangsan'.replace('a','A',1) #替換
'zhangsan'.find('a') #查找字符並返回下標,無則返回-1
'zhangsan'.count('a') #對字符計數
' \n My Name Is \n '.strip() #去掉兩側換行或空格
'zhangsan'.center(50,'-') #字符居中以「-」填充,輸出50個字符
'zhang san'.split('a') #將字符串按a分紅列表,a再也不顯示
'my name is \t{nm} and im {yr}year old'.format(nm='zhangsan',yr=21) #格式化
'-'.join(['zhangsan','lisi','wangwu'])#列表轉字符串,用-鏈接元素

 元組:

相似於列表的數據類型,能夠計數,切片,查找索引,可是不能修改內容

字典:

字典是一種key-value格式的數據類型

字典的特徵:key-value格式;key可hash,且惟一的不可變數據類型;可存放多個不惟一的可修改的數據;字典是無序的;查找速度快

字典操做:

 

 1 #字典爲key-value類型,無序
 2 info = {
 3     'stu1101' : "zhangsan",
 4     'stu1102' : "lisi",
 5     'stu1103' : "wangwu",
 6 }
 7 print(info)
 8 print(info['stu1101'])
 9 info['stu1101']='張三'#修改
10 
11 
12 info['stu1104']='zhaoliu'#增長
13 print(info)
14 del info['stu1101']#刪除
15 info.pop('stu1102')
16 print(info)
17 info.popitem()#隨機刪除
18 print(info)
19 info = {
20     'stu1101' : "zhangsan",
21     'stu1102' : "lisi",
22     'stu1103' : "wangwu",
23 }
24 print(info.get('stu1104'))#嘗試獲取(安全地獲取)
25 print('stu1103' in info)#查找是否存在
26 info.items()#返回k-v的列表形式
27 info.update()
28 info.formkey()

 

 字典練習題:

 1 >>> dict = {'k1':'v1','k2':'v2','k3':'v3'}
 2 >>> for k in dict:
 3 ...     print(k)
 4 ...
 5 k1
 6 k2
 7 k3
 8     #遍歷全部的key
 9 >>> for k in dict:
10 ...     print(dict[k])
11 ...
12 v1
13 v2
14 v3
15     #遍歷全部的value
16 >>> for k in dict:
17 ...     print(k,dict[k])
18 ...
19 k1 v1
20 k2 v2
21 k3 v3
22     #遍歷全部的key與value
23 >>> dict['k4'] = 'v4'
24 >>> dict
25 {'k1': 'v1', 'k2': 'v2', 'k3': 'v3', 'k4': 'v4'}
26     #添加鍵值對'k4':'v4',並輸出添加後的字典
27 >>> dict.pop('k1')
28 'v1'
29 >>> dict
30 {'k2': 'v2', 'k3': 'v3', 'k4': 'v4'}
31     #刪除鍵值對 k1 ,並輸入刪除後的字典
32>>> print(dict.pop('k5',None))

33None  

  #嘗試刪除K5,K5存在則刪除,不存在則返回None

一行實現修改value和添加k-v:

>>> dict = {'k2': 'v2', 'k3': 'v3', 'k4': 'v4'}
>>> dict.update({'k1':'v1','k2':'v22222'})

>>> dict {'k2': 'v22222', 'k3': 'v3', 'k4': 'v4', 'k1': 'v1'}

下面的再也不贅述,小寫變大寫能夠用swapcase,upper更改,替換可使用replace和 = 賦值來完成替換。

集合:

 無序,不重複的數據總和

做用:去重,關係測試

集合的方法:

list_1 = [1,3,53,21,64]#此爲列表
list_1 = set(list_1)#列表轉換爲集合
print(list_1,type(list_1))

list_2 = [34,3,76,1,98]
print(list_1,list_2)
交集
print(list_1.intersection(list_2))
並集
print(list_1.union(list_2))
差集
print(list_1.difference(list_2))#在集合1中與集合2不一樣的元素
對稱差集
print(list_1.symmetric_difference(list_2))#集合1與集合2中都不相同的元素
判斷子集
list_3 = set([1,3])
print(list_3.issubset(list_1))
判斷父集
print(list_1.issuperset(list_3))
判斷是否有交集
print(list_1.isdisjoint(list_2))#Return True if two sets have a null intersection.
添加一項
list_1.add(999)
print(list_1)
添加多項
list_1.update([999,888,777])
print(list_1)
刪除一項
list_1.remove(999)
print(list_1)
長度
print(len(list_1))
判斷是不是集合的元素
print(888 in list_1)
判斷是否不是集合的元素
print(888  not in list_1)

任意刪除一項
print(list_1.pop())
print(list_1.pop())

嘗試刪除一項
print(list_1.discard(1))

 附上此次的大做業,花費1天半寫出來的。。。

# author:wilbur0402
# 帶用戶登陸的購物車程序
goods = [['電腦', 9999], ['大保健', 998], ['iPhone X', 8688], ['煎餅果子多加個蛋', 5]] user = { 'zhangsan': 'aaa111', 'lisi': 'bbb222', 'wangwu': 'ccc333', 'alex': 'abc123' } while True: # 用戶登陸死循環 username = input('please input your username:') password = input('please input your password:') if username in user and password == user[username]: # 判斷帳號密碼正確性 print('\033[35;1m welcome %s back! \033[0m' % username) while True: # 判斷輸入的工資的循環 with open('%s_balance' % username, 'a+', encoding='utf-8') as user_balance: # 打開文件,第一次建立文件 user_balance.seek(0) # 重置指針位置 users_balance = user_balance.read() # 讀取文件內容賦值給變量users_balance if len(users_balance) == 0: # 若是讀不到內容,讓用戶本身輸入變量salary salary = input('please input your salary:') else: # 讀到內容,把讀到的數據賦值給變量salary salary = users_balance print('your balance is \033[31;1m %s \033[0m yuan' % users_balance) if salary.isdigit(): # 判斷輸入的工資是否爲數字 salary = int(salary) shopping_cart = [] # 建立購物車 while True: # 判斷輸入的選擇循環 print('product list'.center(30, '-')) for index, i in enumerate(goods): print('%s.%s %s' % (index, i[0], i[1])) choice = input('\033[35;1m please input number (0-3) or quit(q) or display list(l): \033[0m') # 讓用戶輸入序號、退出或查看已購列表 balance = salary # 初始餘額等於工資 if choice.isdigit(): # 判斷choice是否爲數字 choice = int(choice) if 0 <= choice < 4: # 過濾(0-4)的輸入 if salary > goods[choice][1]: # 若是當前金錢大於商品價格,進行循環購買操做 balance = salary - goods[choice][1] # 餘額等於工資減去商品價格 print('\033[32;1m added %s to cart, balance is %s \033[0m' % (goods[choice][0], balance)) shopping_cart.append(goods[choice]) # 把商品加入購物車 salary = balance # 將餘額賦值給工資,以便進行下一次循環操做 else: # 不然返回信息 print('\033[31;1m your balance no enough to buy it! \033[0m') else: print('\033[31;1m invalid input! \033[0m') elif choice == 'q': # 若是輸入爲q,進行退出工做 if bool(shopping_cart): # 若是購物車不爲空,打印購物車內容 print('bought list'.center(30, '*')) for index, i in enumerate(shopping_cart): print('%s.%s %s' % (index, i[0], i[1])) print('your balance is \033[31;1m %s \033[0m yuan' % balance) # 打印餘額 with open('%s_balance' % username, 'w+', encoding='utf-8') as user_balance: user_balance.write('%s' % balance) # 打開文件,將餘額寫入文件 with open('%s_goods_list' % username, 'w+', encoding='utf-8') as goods_list: goods_list.write('%s' % shopping_cart) # 打開文件,將購物車內容寫入文件 break # 結束購物循環 elif choice == 'l': # 若是輸入爲l,打開文件 with open('%s_goods_list' % username, 'a+', encoding='utf-8') as goods_list: goods_list.seek(0) print('goods_list'.center(30, '-')) last_list = goods_list.read() # 讀取上次購物內容 if len(last_list) != 0: # 判斷讀取的文件是否爲空文件,非空文件再進行去字符串格式的操做 last_list = eval(last_list) for index, i in last_list: # 打印文件中列表內容 print(index, i) else: print('\033[31;1m invalid input! \033[0m') # 輸入時不合法時返回信息,並繼續循環 break # 當輸入工資是數字就跳出循環 else: # 當不是數字,返回信息,繼續循環 print('\033[31;1m invalid input salary! \033[0m') break # 用戶認證成功,跳出循環
# author:wilbur0402
# 三級菜單
menu = { '北京': { '海淀': { '五道口': { 'soho': {}, '網易': {}, 'google': {} }, '中關村': { '愛奇藝': {}, '汽車之家': {}, 'youku': {}, }, '上地': { '百度': {}, }, }, '昌平': { '沙河': { '老男孩': {}, '北航': {}, }, '天通苑': {}, '回龍觀': {}, }, '朝陽': {}, '東城': {}, }, '上海': { '閔行': { "人民廣場": { '炸雞店': {} } }, '閘北': { '火車站': { '攜程': {} } }, '浦東': {}, }, '山東': {}, } var = menu # 中間變量,用來存儲當前位置,初始值爲menu var_list = [] # 用來記錄進入的位置和前後次序 while True: # 循環體 for i in var: # 遍歷打印var所指向的字典 print(i) choice = input('請輸入內容(返回b,退出q):') # 用戶輸入內容,返回或退出 if choice in var: # 判斷輸入內容是否在var所指的字典中 var_list.append(var) # 將當前的位置的字典追加到列表中 var = var[choice] # 將下一級字典賦值給var elif choice == 'b': # 判斷輸入是否爲b if len(var_list) != 0: # 當列表不爲空時,將上一次保存的字典從列表中彈出(最後一項)賦值給var var = var_list.pop() else: # 當列表爲空時返回信息 print('到達頂層!') elif choice == 'q': # 當輸入爲q時,結束循環,程序終止 break
相關文章
相關標籤/搜索