1. 程式人生 > >NO.2:自學python之路

NO.2:自學python之路

電腦 安全 ++ 密碼 詳細 刪除 耳機 sort 參數

引言

本周初步認識了庫,並學習了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
Xiaolinames.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之路