NO.2:自學python之路
引言
本周初步認識了庫,並學習了Python中各種類型的變量和常用操作。並完成了較為完善的用戶與商家購物界面設計。
正文
模塊:
Python有標準庫和第三方庫。第三方庫需要安裝才能使用。大量的庫可以幫助我們更容易的完成復雜的操作。一般情況下,標準庫被保存在了‘lib/’目錄下,第三方庫被保存在了‘lib/site-packages’目錄下。導入一個庫非常簡單,例子:
import os
每種模塊都有很多操作,一般情況是用模塊名.操作名完成某些操作,例子:
os.system(‘dir‘)#讀取目錄下的文件列表,但不保存
變量類型:
整型(int),Python 3.X中整型只有int型,而在Python 2.X中整型分為int,和long,變量的類型不需定義,與Matlab中類似,但類型不可隨意更改。查看變量類型,例子:
x = 3
type(x)
其他類型與C++中類似,所以不再贅述。
虛數型,在Python中j表示虛數。
比特型(bytes),Python 2.X中比特型與字符型沒有區別,而在Python 3.X中存在不同,它們可以互相轉換,例子:
x = ‘我愛中國‘ y = x.encode()#轉換為比特型 print(y) z = y.decode())#轉換為字符型 print(z)
在日常使用Python中,字典與列表是最常使用的變量。下面將詳細介紹字典與列表的使用方法。
列表:
列表的定義,例子:
province = [‘Beijin‘,‘Hebei‘,‘Shanghai‘,‘Henan‘]
列表的切片與Matlab有相似之處,但有著巨大不同,Python的:後的數字是切片位置的後一位。所以,在Python中[1:2]=[1],例子:
province = [‘Beijin‘,‘Hebei‘,‘Shanghai‘,‘Henan‘] print(province[0:2])#切片(顧頭不顧尾)
Python還可以從右數來完成切片,例子:
province = [‘Beijin‘,‘Hebei‘,‘Shanghai‘,‘Henan‘] print(province[-1])#從右數 print(province[-2:])#最後的值省略
列表的增加有兩種方式,一種是最後追加,還有一種是某處插入。例子:
province = [‘Beijin‘,‘Hebei‘,‘Shanghai‘,‘Henan‘] province.append(‘Shannxi‘)#最後追加 province.insert(1,‘Xinjiang‘)#某處插入
列表的修改十分簡單,例子:
province = [‘Beijin‘,‘Hebei‘,‘Shanghai‘,‘Henan‘] province[1] = ‘Beijing‘#改變某處
列表的刪除有很多方法,del是Python中通用的刪除方法,此外還有刪除某個與刪除某處參數的方法,例子:
province = [‘Beijin‘,‘Hebei‘,‘Shanghai‘,‘Henan‘] del province[2]#刪除某處 province.remove(‘Beijing‘)#刪除某個 province.pop()#刪除最後一個(默認),或括號中的位置
此外,Python還為列表提供了許多功能。Python中可以輕松查詢某個參數的位置和個數,例子:
province = [‘Beijin‘,‘Hebei‘,‘Shanghai‘,‘Henan‘] province.index(‘Shanghai‘)#尋找位置 province.count(‘Shanghai‘)#尋找個數
改變列表的順序也十分簡單,例子:
province = [‘Beijin‘,‘Hebei‘,‘Shanghai‘,‘Henan‘] province.reverse()#反轉序列 province.sort()#排序序列(符號,數字,大寫,小寫(ASCII))
Python中列表的復制與Matlab不同,設計相對合理一些,但是有一點難以理解,學過C++中指針的可以相對容易理解一些。普通的賦值操作,只是將列表的地址復制,一旦其中列表中的值發生改變,兩者中的值都會改變,例子:
province = [‘Beijin‘,‘Hebei‘,‘Shanghai‘,‘Henan‘] province_copy = province#復制地址,改變後一起變化 province.append(‘Xinjiang‘) print(province) print(province_copy)
要想復制一個列表,有淺copy和深copy兩種方法。淺copy只復制列表的第一層,第二層將只復制地址。深copy則是完全在內存中建立一個一樣的區域。例子:
province = [‘Beijin‘,[‘Hebei‘,‘Shijiazhuang‘],‘Shanghai‘,‘Henan‘] province_copy = province.copy()#淺copy import copy province_copy = copy.copy(province)#淺copy province_copy = list(province)#淺copy province_copy = copy.deepcopy(province)#深copy
Python中也提供了列表的合並方法,例子:
province = [‘Beijin‘,‘Hebei‘,‘Shanghai‘,‘Henan‘] province_new = [‘Xinjiang‘,‘Dongbei‘] province.extend(province_new)#並入後面
列表的高效循環方法是用以下格式,[::x]切片中x為步距,例子如下:
province = [‘Beijin‘,‘Hebei‘,‘Shanghai‘,‘Henan‘] for i in province[::2]:#切片 循環體
當列表中存儲的信息不想被改變時,就可以用元組,元組的定義與列表幾乎相同,只是用‘()’代替了[]。元組不能修改,只能切片。例子:
province = (‘Beijin‘,‘Hebei‘,‘Shanghai‘,‘Henan‘)
字符:
字符中對字母大小寫變化的操作很多,可以有以下幾種方法,例子:
x = ‘l love china‘ x.capitalize()#首字母大寫 x.upper()#全變大寫 x.lower()#全變小寫 x.title()#變為標題形式 x.swapcase()#大小寫互換
在Python中還可以輕松的對字符進行修改,例子:
names = ‘Xiaohong Xiaohuang‘ names.replace(‘o‘,‘O‘,1)#舊字符,新字符,替換個數 tran = str.maketrans(‘aox‘,‘123‘)#設置替換密文 names.translate(tran)#替換加密 names.center(50,‘-‘)#50個字符,將name居中,不的夠用-填充 names.ljust(50,‘*‘)#50個字符,將name居左,不的夠用*填充 names.rjust(50,‘*‘)#50個字符,將name居右,不的夠用*填充 names.zfill(50)#50個字符,將name居右,不的夠用0填充 names = ‘ Xiaohong‘ names.lstrip()#去掉左邊空格,然後回車 names = ‘ Xiaohong ‘ names.strip()#去掉左右空格,然後回車 names = ‘Xiaohong\tXiaohuang‘#\t與下面結合,控制空格的數量 names.expandtabs(tabsize=30)#空格數
除此之外,還提供了查詢功能,例子:
names = ‘xiaohei‘ names.find(‘i‘)#從左找某個字符第一次出現的位置 names.rfind(‘i‘)#從右找某個字符第一次出現的位置
字符和列表之間還可以相互轉換,例子:
names = ‘Xiaohong Xiaohuang Xiaozhang Xiaoli‘ names.split()#按空格分成列表 names = ‘Xiaohong Xiaohuang Xiaozhang Xiaoli‘ names.splitlines()#按回車分成列表 names = [‘Xiaohong‘,‘Xiaohuang‘,‘Xiaozhang‘,‘Xiaoli‘] ‘+‘.join(names)#用+連接列表成字符
Python還為字符提供了很多判斷,這些功能大多以is開頭,例子:
names = (‘xiaohong hei‘) names.endswith(‘hei‘)#判斷以什麽結尾 names.isalnum()#判斷為阿拉伯數字 names.isalpha()#判斷為純英文 names.isdigit()#判斷為整數 names.isidentifier()#判斷為合法標識符(變量名) names.islower()#判斷為小寫 names.istitle()#判斷為標題形式
字典
字典也是常用的一種工具,字典是使用‘{}’定義的,字典中的數據是無序的,字典可以與序列與字典嵌套。
索引字典時使用KEY,例子:
info = { ‘2012020201‘:‘隨便‘, ‘2012020202‘:‘呵呵‘, ‘2012020203‘:‘不知‘ } print(info[‘2012020202‘])
字典的增加和修改都是通過復制操作,程序會首先查詢字典中是否有該KEY值,沒有,則新建一條。有,則修改該條的值。例子:
info = { ‘2012020201‘:‘隨便‘, ‘2012020202‘:‘呵呵‘, ‘2012020203‘:‘不知‘ } info[‘2012020201‘] = ‘蛤蛤‘#修改 info[‘2012020204‘] = ‘拉拉‘#增加
字典的刪除可以使用Python中通用的刪除方法,或者字典中提供的方法,例子:
info = { ‘2012020201‘:‘隨便‘, ‘2012020202‘:‘呵呵‘, ‘2012020203‘:‘不知‘ } del info[‘2012020203‘]#刪除 info.pop(‘2012020203‘)#刪除 info.popitem()#隨便刪除一個,不常用
查找是,可以用之前的方法來查找,但是還有一種安全的查找方法,例子:
info = { ‘2012020201‘:‘隨便‘, ‘2012020202‘:‘呵呵‘, ‘2012020203‘:‘不知‘ } info.get(‘2012020202‘)
判斷某個KEY是否在字典中,例子:
info = { ‘2012020201‘:‘隨便‘, ‘2012020202‘:‘呵呵‘, ‘2012020203‘:‘不知‘ } ‘2012020202‘ in info
字典也可以合並,合並時,將會用新的字典中覆蓋舊的字典,例子:
info = { ‘2012020201‘:‘隨便‘, ‘2012020202‘:‘呵呵‘, ‘2012020203‘:‘不知‘ } info_new = { ‘2012020202‘:‘王凱‘, ‘2012020206‘:‘彭浩‘, } info.update(info_new)#合並更新
Python也提供了新建一個字典的方法,但是存在很大的問題,所以一般不會使用,例子:
info_new = dict.fromkeys([1,2,3],[1,{‘name‘:‘X‘,2}])#初始化字典 info_new[3][1][‘name’] = Y
當修改Python新建的字典時,例子中只改了[3][1]中的‘name’為‘Y’但是可以發現字典中的所有‘name’都變為了‘Y’。所以,正常情況下很難使用。
字典可以轉為列表,例子:
info = { ‘2012020201‘:‘隨便‘, ‘2012020202‘:‘呵呵‘, ‘2012020203‘:‘不知‘ } info.items()
多級字典的操作與單級字典差別不大,修改略有不同。例子:
province = { ‘華北‘:{ ‘北京‘:[‘直轄市‘,‘很大‘], ‘河北‘:[‘石家莊‘,‘漂亮‘], }, ‘東北‘:{ ‘黑龍江‘:[‘哈爾濱‘,‘很棒‘], ‘遼寧‘:[‘沈陽‘,‘厲害‘], }, } province[‘華北‘][‘北京‘][1] = ‘首都‘#修改 province.setdefault(‘西北‘,{‘陜西‘:[‘西安‘,‘省會‘]})#取西北如果有,返回,沒有新建
字典的循環格式與列表類似,格式如下,例子:
info = { ‘2012020201‘:‘隨便‘, ‘2012020202‘:‘呵呵‘, ‘2012020203‘:‘不知‘ } for i in info:#高效循環 print(i,info[i]) 循環體
作業
編寫一個購物車程序,要求將商品信息存在文件裏。打開程序後需要用戶登陸,用戶入口需要實現,已購商品,余額記錄,啟動程序,輸入工資,根據編號,購買商品,檢測余額,夠用扣款,不夠提醒,隨時退出,打印已經購買的商品和余額。商家入口需要實現,添加商品,修改價格。
流程圖:
主程序:
#購物車程序 ‘‘‘ 商品信息存在文件裏 1.打印商品列表 用戶入口 已購商品,余額記錄 啟動程序,輸入工資 根據編號,購買商品 檢測余額,夠用扣款,不夠提醒 隨時退出,打印已經購買的商品和余額 商家入口 添加商品,修改價格 ‘‘‘ import getpass title = ‘‘‘ --------------------------- - 歡迎光臨本超市 - --------------------------- ‘‘‘ print(title) #讀取商品數據 goods = open(‘商品.txt‘) read_flag = True goods_list = [] while read_flag:#按行處理 goods_line = goods.readline() if goods_line == ‘‘: read_flag = False else: goods_list.append(goods_line.split()) goods.close() #讀取用戶信息 info = open(‘用戶信息.txt‘) read_flag = True info_user = [] while read_flag: info_line = info.readline() if info_line == ‘‘: read_flag = False else: info_user.append(info_line.split()) info.close() #用戶登陸 success_flag = False for count in range(0,6): account = input(‘請輸入用戶名:‘) password = getpass.getpass(‘請輸入密碼:‘) for i in range(0,len(info_user)): if account == info_user[i][0] and password == info_user[i][1]: success_flag = True user_number = i break if success_flag: print(‘尊敬的%s登陸成功!‘%info_user[user_number][2]) break else: print(‘用戶名或密碼錯誤!‘) else: print(‘輸入密碼次數超過6次,請重新開啟軟件嘗試!‘) exit() #進入入口 info_write = [] if info_user[user_number][3] == ‘0‘: #普通用戶 if info_user[user_number][4] == ‘0‘: #初次登陸 balance = input(‘您是第一次登陸,請輸入充值金額:‘) if balance.isdigit(): balance = int(balance) info_user[user_number][4] = ‘1‘ info_user[user_number][5] = str(balance) else: print(‘充值錯誤,退出系統!‘) exit() #非初次登陸 for i in range(0,len(goods_list)): goods = ‘{number}.物品名:{name} 價格:{price}‘.format(number = i + 1, name = goods_list[i][0], price = goods_list[i][1]) print(goods) print(‘%s.充值‘%(len(goods_list)+1)) buy_list = [] balance = int(info_user[user_number][5]) while True: buy_number = input(‘請輸入你所需要的商品序號[按q退出購買]:‘) if buy_number == ‘q‘: buy_list = ‘ ‘.join(buy_list) print(‘本次購物購買了:{list}‘.format(list = buy_list)) #更新信息 info_user[user_number][5] = str(balance) info = open(‘用戶信息.txt‘,‘w‘) for i in range(0,len(info_user)): info.write(‘ ‘.join(info_user[i])+‘\n‘) info.close() exit() elif buy_number.isdigit(): buy_number = int(buy_number)-1 if buy_number > len(goods_list) or buy_number < 0: print(‘請輸入正確的商品碼!‘) elif buy_number == len(goods_list): money = input(‘請輸入充值金額:‘) if money.isdigit(): balance += int(money) info_user[user_number][5] = str(balance) else: print(‘充值金額錯誤‘) else: if balance < int(goods_list[buy_number][1]): print(‘你的余額不夠購買這件商品!‘) else: balance = balance - int(goods_list[buy_number][1]) buy_list.append(goods_list[buy_number][0]) print(‘購買成功!還剩%s圓‘%balance)# else: print(‘輸入錯誤‘) elif info_user[user_number][3] == ‘1‘: #商家用戶 for i in range(0,len(goods_list)): goods = ‘{number}.物品名:{name} 價格:{price}‘.format(number = i + 1, name = goods_list[i][0], price = goods_list[i][1]) print(goods) print(‘%s.添加物品‘%(len(goods_list)+1)) add_list = [] while True: buy_number = input(‘請輸入你需要修改商品價格的序號[按q退出購買]:‘) if buy_number == ‘q‘: add_list = ‘ ‘.join(add_list) print(‘本次共添加了:{list}‘.format(list = add_list)) #更新信息 info = open(‘商品.txt‘,‘w‘) for i in range(0,len(goods_list)): info.write(‘ ‘.join(goods_list[i])+‘\n‘) info.close() exit() elif buy_number.isdigit(): buy_number = int(buy_number)-1 if buy_number > len(goods_list) or buy_number < 0: print(‘請輸入正確的商品碼!‘) elif buy_number == len(goods_list): goods_name = input(‘請輸入商品名稱:‘) goods_price = input(‘請輸入商品價格:‘) if goods_price.isdigit(): add_list.append(goods_name) goods_list.append([goods_name,goods_price]) else: print(‘商品價格信息錯誤!‘) else: goods_price = input(‘請輸入商品價格:‘) if goods_price.isdigit(): goods_list[buy_number][1] = goods_price else: print(‘商品價格信息錯誤!‘) else: print(‘輸入錯誤‘) else: print(‘用戶數據錯誤!請管理員維護!!‘)
信息記錄文件:
商品.txt
手機 1000 電腦 8000 耳機 500 泡面 3 娃娃 10000
用戶信息.txt
customer 123456 凱凱王 0 0 0
business 123456 賣力頭 1 0 0
NO.2:自學python之路