Python3.5學習之旅——day2

本節內容:

一、模塊初識html

二、.pyc是什麼?java

三、Python的數據類型python

四、三元運算git

五、進制編程

六、byte類型網絡

七、數據運算app

八、列表函數

九、元組學習

十、課後練習優化

 

 

 

 

1、模塊初識

由day1的學習咱們知道,Python有一個很重要的優勢——具備強大的標準庫和第三方庫,這裏的「模塊」指的就是存放在標準庫或者第三方庫中的能夠實現某種特定的功能的「程序包」。

下面咱們先來學習兩個簡單的標準庫中的模塊:sys模塊和os模塊。

一、sys

咱們練習使用一下‘sys'模塊,模塊名爲「sys_mod2.py」

__author__ = 'Sunny Han'
import sys
print(sys.path)#打印出sys模塊所在路徑

運行結果以下:

能夠看到這段程序打印出了sys所在的路徑。

再加一段代碼:

__author__ = 'Sunny Han'
import sys
print(sys.path)#打印出sys模塊所在路徑
print(sys.argv)#打印相對路徑

也打印出了相對路徑。以下:

也就是說,若想導入sys模塊,電腦就是在這個路徑下去尋找。其次咱們要知道的是,Python的標準庫都存放在E:\\program\\python\\lib這個路徑下(硬盤的選擇因人而異,在這裏我存的是E盤),Python的第三方庫都存放在 'E:\\program\\python\\lib\\site-packages'這個路徑下。

此外,咱們如果在執行‘sys_mod2.py’時,再在其後加三個參數‘1’,‘2’,‘3’,執行結果以下:

如果想只讀取三個參數中的‘2’,由上述執行結果咱們能夠看到‘2’爲第2個參數(計算機從0開始計數),以下圖所示:

故代碼能夠改成:

__author__ = 'Sunny Han'

import sys
print(sys.path)#打印出sys模塊所在路徑
print(sys.argv[2])#打印相對路徑

執行結果爲:

二、os

os模塊的做用是和本機操做繫系統進行交互,下面經過兩個例子來講明:

(1)dir功能

__author__ = 'Sunny Han'

import os
os.system("dir")#"dir"在Windows操做系統中的做用是打開當前目錄下的文件

執行結果以下:

咱們在這裏能夠先忽略掉執行結果出現的亂碼,這是因爲Windows的輸出的字符編碼和咱們這裏使用的utf-8不一致致使的。咱們能夠看出上述結果便是「dir」的執行結果這就是os模塊的做用。

接下來咱們試一下是否能夠將上述的輸出結果存到一個變量中去,實驗以下:

 

__author__ = 'Sunny Han'

import os
os.system("dir")#"dir"在Windows操做系統中的做用是打開當前目錄下的文件
cmd_res=os.system("dir")
print("-->",cmd_res)#爲了比較清楚的看到咱們的變量值,故在變量前加「-->」來明示。

執行結果以下:

咱們能夠看到此次的執行結果相較上次的僅多了一個"-->」(紅框中的內容),也就是說最後變量值爲0!而不是以前輸出的結果,這是爲何呢?這是由於「os.system("dir")」這條指令只執行命令,而並不保存結果,也就是說它輸出了就沒了,因此不能存在變量中。那若是咱們想將這個輸出結果存在變量中應該怎麼作呢?請看下面的實驗:

__author__ = 'Sunny Han'

import os
cmd_res1=os.popen("dir")  #這時打印的是內存對象地址,而不是咱們的結果
cmd_res=os.popen("dir").read()#這裏加一個「read」就能夠從上述的內存對象地址中將結果取出來
print("-->",cmd_res1)
print(">>>",cmd_res)

執行結果以下:

在這裏咱們就將輸出的結果存入變量中了,並且也沒有以前的亂碼,全變成能夠看懂的中文內容了。在這裏咱們要注意一下加「read()」和不加的區別,因已在上文代碼中解釋到,這裏再也不贅述。

(2)mkdir功能

咱們要是想在當前目錄下建立一個新的目錄,代碼以下:

__author__ = 'Sunny Han'
import os
os.mkdir("new dir")  #在當前目錄下建立一個新的名爲「new dir"的目錄

執行結果以下:

就在當前的‘day1’目錄下建立了一個名爲'new dir'的新目錄。

三、本身寫一個模塊

咱們能夠練習本身寫一個模塊,以用戶輸入用戶名和密碼爲例,文件名爲‘login.py’。

代碼以下:

__author__ = 'Sunny Han'

import getpass
username='han'
password='123456'
user=input('請輸入用戶名:')
pwd=getpass.getpass('請輸入密碼:')
if user==username and pwd==password:
    print("welcome user %s login..."%user)
else:
    print("invalid username or password!")

而後再寫一個腳本,直接調用‘login.py’便可,文件名爲‘import_login.py’以下:

__author__ = 'Sunny Han'

import login

執行結果與‘login.py’的結果同樣,都爲用戶登陸界面。

可是,在這裏咱們尤爲要注意的是,若是咱們所寫的模塊文件(例如‘login.py’)與調用此模塊的文件不在同一目錄下,那麼將會出現報錯的狀況,即沒法調用此模塊,因此咱們要求這兩個文件應該放在同一目錄下。這是由於電腦若想調用某模塊,首先會在當前目錄下尋找該模塊,若在當前目錄下找不到該模塊,則在全局環境變量下尋找。

若咱們想調用某不在同一目錄下的模塊,咱們有兩種方法:

(1)將此模塊copy到咱們以前提到過的用於存放第三方庫的site-package文件中,這樣就可調用成功。

(2)修改環境變量(以後再詳細講解)。

2、.pyc是什麼?

1. Python是一門解釋型語言?

我初學Python時,聽到的關於Python的第一句話就是,Python是一門解釋性語言,我就這樣一直相信下去,直到發現了*.pyc文件的存在。若是是解釋型語言,那麼生成的*.pyc文件是什麼呢?c應該是compiled的縮寫纔對啊!

爲了防止其餘學習Python的人也被這句話誤解,那麼咱們就在文中來澄清下這個問題,而且把一些基礎概念給理清。

  

2. 解釋型語言和編譯型語言 

計算機是不可以識別高級語言的,因此當咱們運行一個高級語言程序的時候,就須要一個「翻譯機」來從事把高級語言轉變成計算機能讀懂的機器語言的過程。這個過程分紅兩類,第一種是編譯,第二種是解釋。

編譯型語言在程序執行以前,先會經過編譯器對程序執行一個編譯的過程,把程序轉變成機器語言。運行時就不須要翻譯,而直接執行就能夠了。最典型的例子就是C語言。

解釋型語言就沒有這個編譯的過程,而是在程序運行的時候,經過解釋器對程序逐行做出解釋,而後直接運行,最典型的例子是Ruby。

經過以上的例子,咱們能夠來總結一下解釋型語言和編譯型語言的優缺點,由於編譯型語言在程序運行以前就已經對程序作出了「翻譯」,因此在運行時就少掉了「翻譯」的過程,因此效率比較高。可是咱們也不能一律而論,一些解釋型語言也能夠經過解釋器的優化來在對程序作出翻譯時對整個程序作出優化,從而在效率上超過編譯型語言。

此外,隨着Java等基於虛擬機的語言的興起,咱們又不能把語言純粹地分紅解釋型和編譯型這兩種。

用Java來舉例,Java首先是經過編譯器編譯成字節碼文件,而後在運行時經過解釋器給解釋成機器文件。因此咱們說Java是一種先編譯後解釋的語言。

 

3. Python究竟是什麼 

其實Python和Java/C#同樣,也是一門基於虛擬機的語言,咱們先來從表面上簡單地瞭解一下Python程序的運行過程吧。

當咱們在命令行中輸入python hello.py時,實際上是激活了Python的「解釋器」,告訴「解釋器」:你要開始工做了。但是在「解釋」以前,其實執行的第一項工做和Java同樣,是編譯。

熟悉Java的同窗能夠想一下咱們在命令行中如何執行一個Java的程序:

javac hello.java

java hello

 

只是咱們在用Eclipse之類的IDE時,將這兩部給融合成了一部而已。其實Python也同樣,當咱們執行python hello.py時,他也同樣執行了這麼一個過程,因此咱們應該這樣來描述Python,Python是一門先編譯後解釋的語言。

4. 簡述Python的運行過程

在說這個問題以前,咱們先來講兩個概念,PyCodeObject和pyc文件。

咱們在硬盤上看到的pyc天然沒必要多說,而其實PyCodeObject則是Python編譯器真正編譯成的結果。咱們先簡單知道就能夠了,繼續向下看。

當python程序運行時,編譯的結果則是保存在位於內存中的PyCodeObject中,當Python程序運行結束時,Python解釋器則將PyCodeObject寫回到pyc文件中。

當python程序第二次運行時,首先程序會在硬盤中尋找pyc文件,若是找到,則直接載入,不然就重複上面的過程。

因此咱們應該這樣來定位PyCodeObject和pyc文件,咱們說pyc文件實際上是PyCodeObject的一種持久化保存方式。

3、Python的數據類型

一、數字

數字分爲整型、浮點型和複數。

(1)首先關於整型咱們這裏要說明的一點是,在Python2中,整型分爲int和long兩種形式,可是在Python3中則沒有了long這個概念,即不論整數值有多大都爲int類型,以下:

能夠看出不論值多大都爲int類型。

(2)其次關於浮點型,浮點數是屬於有理數中某特定子集的數的數字表示,在計算機中用以近似表示任意某個實數。具體的說,這個實數由一個整數定點數(即尾數)乘以某個基數(計算機中一般是2)的整數次冪獲得,這種表示方法相似於基數爲10的科學計數法例如1.9E13表示1.9×10^13。

(3)複數是指能寫成以下形式的數a+bj,這裏a和b是實數,j是虛數單位(即-1開根)。在複數a+bj中,a稱爲複數的實部,b稱爲複數的虛部,j稱爲虛數單位。當虛部等於零時,這個複數就是實數;當虛部不等於零時,這個複數稱爲虛數。

二、布爾值

       真或假
  1 或 0

三、字符串

字符串通常放在兩個雙引號或者單引號之間,這裏咱們要注意雙引號和單引號同時使用時的規範問題。以下:

__author__ = 'Sunny Han'

print("my name is "jake"")

若是像這樣使用雙引號的話會形成混亂,機器不能識別出這個輸出的字符串究竟是哪一個,故會報錯,修改以下:

__author__ = 'Sunny Han'

print("my name is 'jake'")

這樣就能夠執行了。

此外再簡單介紹一下字符串格式化輸出,代碼以下:

__author__ = 'Sunny Han'

name='jake'
print("my name is %s"%name)#注意這裏的%name應放在括號內,本身以前老是放在括號外,以此提醒你們。

PS: 字符串是 %s;整數 %d;浮點數%f

字符串經常使用功能:
  • 移除空白
  • 分割
  • 長度
  • 索引
  • 切片

4、三元運算

三元運算是一個相對更爲簡便的寫法,舉例以下:

a,b,c=1,2,3
d=a if a>b else c

即若是a>b,則d=a=1,不然d=c=5,那麼這裏咱們能夠知道d=5。上述代碼能夠換成if-else語句,但它比if-else語句更爲簡潔。

三元運算格式:result=值1 if 條件 else 值2.

5、進制

這裏咱們介紹四種計算機學習中經常使用到的進制:二進制、八進制、十進制和十六進制。

  • 二進制,01
  • 八進制,01234567
  • 十進制,0123456789
  • 十六進制,0123456789ABCDEF

這幾種進制間的相互轉換讀者能夠自行百度,這裏再也不贅述,不過我仍要說明強調一點的是一般三位二進制數對應一位八進制數,四位二進制數對應一位十六進制數。

下面是關於十六進制在計算機中的應用的簡單介紹:

計算機內存地址和爲何用16進制?
一、計算機硬件是0101二進制的,16進制恰好是2的倍數,更容易表達一個命令或者數據。十六進制更簡短,由於換算的時候一位16進制數能夠頂4位2進制數,也就是一個字節(8位進制能夠用兩個16進製表示)。
二、最先規定ASCII字符集採用的就是8bit(後期擴展了,可是基礎單位仍是8bit),8bit用2個16進制直接就能表達出來,無論閱讀仍是存儲都比其餘進制要方便。
三、計算機中CPU運算也是遵守ASCII字符集,以1六、3二、64的這樣的方式在發展,所以數據交換的時候16進制也顯得更好。
四、爲了統一規範,CPU、內存、硬盤咱們看到都是採用的16進制計算。

16進制用在哪裏
一、網絡編程,數據交換的時候須要對字節進行解析都是一個byte一個byte的處理,1個byte能夠用0xFF兩個16進制來表達。經過網絡抓包,能夠看到數據是經過16進制傳輸的。
二、數據存儲,存儲到硬件中是0101的方式,存儲到系統中的表達方式都是byte方式。
三、一些經常使用值的定義,好比:咱們常常用到的html中color表達,就是用的16進制方式,4個16進制位能夠表達好幾百萬的顏色信息。  
 

6、byte類型

Python 3最重要的新特性大概要算是對文本和二進制數據做了更爲清晰的區分。文本老是Unicode,由str類型表示,二進制數據則由bytes類型表示。Python 3不會以任意隱式的方式混用str和bytes,正是這使得二者的區分特別清晰。你不能拼接字符串和字節包,也沒法在字節包裏搜索字符串(反之亦然),也不能將字符串傳入參數爲字節包的函數(反之亦然)。這是件好事。

無論怎樣,字符串和字節包之間的界線是必然的,下面的圖解很是重要,務請牢記於心:

下面以一個例子來講明:

__author__ = 'Sunny Han'

msg='我愛中國'
print(msg)
print (msg.encode(encoding='utf-8'))
print (msg.encode(encoding='utf-8').decode(encoding='utf-8'))

執行結果爲:

這個問題要這麼來看:字符串是文本的抽象表示。字符串由字符組成,字符則是與任何特定二進制表示無關的抽象實體。在操做字符串時,咱們生活在幸福的無知之中。咱們能夠對字符串進行分割和分片,能夠拼接和搜索字符串。咱們並不關心它們內部是怎麼表示的,字符串裏的每一個字符要用幾個字節保存。只有在將字符串編碼成字節包(例如,爲了在信道上發送它們)或從字節包解碼字符串(反向操做)時,咱們纔會開始關注這點。

7、數據運算

算數運算:

比較運算:

賦值運算:

邏輯運算:

成員運算:

身份運算:

位運算:

 8、列表

一、列表的建立和讀取

在這裏咱們創建一個包含城市名字的列表,並以此爲例學習如何進行讀取,文件名爲「name.py」。

__author__ = 'Sunny Han'
names=['Los Angeles','Cleveland','Boston','Oakland','Miami']
print(names)

這樣就創建了一個包含五個城市名字的列表。運行結果以下:

接下來嘗試將其中的幾個元素提取出來,代碼以下:

__author__ = 'Sunny Han'
names=['Los Angeles','Cleveland','Boston','Oakland','Miami']
print(names)
print('1',names[1]) #將列表中第二個元素(Cleveland)提取出來,須要注意的是,列表元素的計數從0開始而不是1.
print('2',names[0],names[2])#將列表中的第一個和第三個個元素一併提取出來。
print('3',names[1:3])#將列表中的從第二個到第四個元素(但取不到第四個,即顧頭不顧尾)讀取出來
print('4',names[:3])#至關於print('4',names[0:3]),即這裏的0能夠省略
print('5',names[-1])#將列表中最後一個元素提取出來
print('6',names[-3:-1])#由顧頭不顧尾原則,咱們能夠知道這裏取得是「-3」和「-2」位置上的元素
                       #這裏也要注意不能寫成[-1:-3],也即冒號左邊的數要比右邊的小
print('7',names[-3:])#取出列表的最後三個元素

上面的註釋已經介紹了相關的用法,這裏再也不贅述。

代碼運行以下:

二、列表的基本操做

(1)增長列表元素

在列表末尾加一個元素,代碼以下:

__author__ = 'Sunny Han'
names=['Los Angeles','Cleveland','Boston','Oakland','Miami']
names.append('Chicago')#在列表的末尾位置加一行元素"Chicago"
print(names)

代碼運行結果以下:

若要在列表任意位置加元素,示例代碼以下:

__author__ = 'Sunny Han'
names=['Los Angeles','Cleveland','Boston','Oakland','Miami',]

names.append('Chicago')#在列表的末尾位置加一行元素"Chicago"

names.insert(2,'Orlando')#將'Orlando'插入到位置2上

print(names)

代碼運行結果以下:

 (2)修改列表元素

若想修改列表中部分元素,舉例以下:

__author__ = 'Sunny Han'
names=['Los Angeles','Cleveland','Boston','Oakland','Miami']
names[3]='The Golden State'#將列表中位置序號爲3的元素改成'The Golden State'
print(names)

代碼運行結果以下:

能夠看到咱們將原列表中的位置序號爲3的元素(Oakland)改成了‘The Golden State’。

(3)刪除列表元素

在這裏咱們介紹三種刪除列表元素的方法,代碼以下:

__author__ = 'Sunny Han'
names=['Los Angeles','Cleveland','Boston','Oakland','Miami']
names.remove('Cleveland')#刪除列表中的元素‘Cleveland’
print(names)

在這裏我使用remove來將列表中某元素移除,注意這裏的括號裏面寫的是元素名稱,而不是元素位置序號。

代碼運行結果以下:

接下來介紹第二種方法,代碼以下:

__author__ = 'Sunny Han'
names=['Los Angeles','Cleveland','Boston','Oakland','Miami']
del names[2]#刪除處在位置2上的元素
print(names)

在這裏我使用的是del,可直接將位置2上的元素刪除。

代碼運行結果以下:

最後介紹第三種方法,代碼以下:

__author__ = 'Sunny Han'
names=['Los Angeles','Cleveland','Boston','Oakland','Miami']
names.pop()#刪除列表中最後一個元素
print(names)

在這裏咱們使用pop可直接刪除列表中的最後一個元素,固然也能夠在括號中寫想要刪除的元素的位置序號。

代碼運行結果以下:

(4)查找列表元素序號

如有一個元素數量龐大的列表,元素的序號不能很方便快捷的看出來時怎麼辦呢,這裏咱們爲你們介紹一種方法,代碼以下:

__author__ = 'Sunny Han'
names=['Los Angeles','Cleveland','Boston','Oakland','Miami']
print(names.index('Boston'))

運行結果以下:

這裏咱們的列表數目較少,體會不到太大的優點,但若列表元素數目很大的話用這個方法會很快捷。咱們要注意的是在查找時要注意別寫錯元素內容,否則會提示列表(list)內沒有此元素。

(5)統計元素個數

若想統計列表中某元素的個數,代碼實現以下:

__author__ = 'Sunny Han'
names=['Los Angeles','Cleveland','Boston','Oakland','Boston','Miami']
print(names.count('Boston'))#統計元素‘Boston’的個數
print(names.count('Miami'))#統計元素‘Miami’的個數

代碼運行結果以下:

(6)列表元素順序翻轉

若想將列表內的元素倒序打印,代碼實現以下:

__author__ = 'Sunny Han'
names=['Los Angeles','Cleveland','Boston','Oakland','Boston','Miami']
names.reverse()
print(names)

代碼運行結果以下:

(7)列表拓展

若想將列表擴展一下,將另外一個列表的元素放進此列表,舉例以下:

__author__ = 'Sunny Han'
names=['Los Angeles','Cleveland','Boston','Oakland','Boston','Miami']
name2=['Nanjing','Seatle']
names.extend(name2)#將列表‘name2’的元素放進列表‘names'中
print(names)

代碼運行以下:

(8)列表打印

  • 若想將列表逐個循環打印出來,咱們可使用for循環:
names=['Los Angeles','Cleveland','Boston','Oakland','Boston','Miami']
for i in names:
    print(i)

代碼執行結果以下:

  • 若想每隔幾個元素打印一個,舉例以下:
names=['Los Angeles','Cleveland','Boston','Oakland','Orlando','Miami']
print(names[0:-1:2])#從第一個(0)元素每隔一個打印到最後一個(-1)元素
print(names[::2])#至關於print(names[0:-1:2]),也就是說0和-1能夠省略

代碼運行結果以下:

 三、copy的用法

copy的使用在列表中極爲重要,在這裏爲你們詳細的講解一下。

首先,copy的一個最簡單的做用就是複製列表,即將一個列表複製到另外一個列表,舉例以下:

__author__ = 'Sunny Han'
names=['Los Angeles','Cleveland','Boston','Oakland','Boston','Miami']
name2=names.copy()
print(names)
print(name2)

代碼運行結果以下:

能夠看到列表name2是從列表names複製過來的。

可是,這裏有一個問題,假入咱們把初始列表names中的元素稍加改動,copy的列表name2會不會也作出相應的變化呢?咱們一試便知:

__author__ = 'Sunny Han'
names=['Los Angeles','Cleveland','Boston','Oakland','Boston','Miami']
name2=names.copy()
names[1]='Nanjing'#將列表names中的第二個元素改成‘Nanjing’
print(names)
print(name2)

代碼執行結果以下:

根據上面的結果咱們能夠看到,若改變names列表中的某個元素,copy獲得的列表name2並不會作出相應的改變,咱們稱之爲「淺copy」。

接下來咱們再來看一個有趣的例子:假如說初始列表names中有一個子列表,若咱們改動子列表中的元素時,狀況會不會和以前同樣呢,示例以下:

names=['Los Angeles',['Utah','Boston'],'Oakland','Miami']
name2=names.copy()
print('->',names)
print('->',name2)
names[0]='Nanjing'#將列表names中的第一個元素改成「Nanjing」
names[1][0]='Phoenix'#將列表names中的子列表的第一個元素改成「Phoenix」
print(names)
print(name2)

代碼運行結果以下:

咱們能夠看到若改動列表names中子列表元素內容時,copy的列表name2也會作出相應的改變,這是爲何呢?

這是由於第一層列表中的第二層列表(子列表)['Utah','Boston'] 存的只是一個列表指針,而並非元素自己,當使用copy指令時,複製的是第二層列表的內存地址,因此,若第一層作出改變,第二層也會根據內存地址去察覺到相應的變化,並進一步作出改動。一樣的,若在name2中改動第二層列表中的元素,則names中的元素也會作出相應改變。

那麼若是說咱們想避免出現 這種子列表變化,copy列表也會相應變化的狀況發生,咱們應該怎麼辦呢?

接下來我爲你們介紹一種方法,示例以下:

import copy
names=['Los Angeles',['Utah','Boston'],'Oakland','Miami']
name2=copy.deepcopy(names)
print('->',names)
print('->',name2)
names[0]='Nanjing'#將列表names中的第一個元素改成「Nanjing」
names[1][0]='Phoenix'#將列表names中的子列表的第一個元素改成「Phoenix」
print(names)
print(name2)

代碼運行結果以下:

也就是說,咱們經過使用deepcopy就能夠實現‘只打印一次’的功能。

 9、元組

元組與列表相似,不一樣的是列表能夠修改列表內容,但元組不能修改內容,舉個簡單的元組的例子,以下:

names=('Los Angeles','Cleveland','Boston','Oakland','Orlando','Miami')
print(names)

代碼運行結果以下:

在這裏要注意,元組使用小括號()括起來的,列表是用方括號[ ] 括起來的。

除此以外,元組的使用和列表相似,在這裏就不做詳細的介紹了。

10、課後練習

在本節咱們嘗試編寫一個購物車程序,主要有如下幾個要求:

  • 啓動程序後,讓用戶輸入工資,而後打印商品列表。
  • 容許用戶根據商品列表編號購買商品。
  • 用戶選擇商品後,檢測餘額是否足夠,夠就直接扣款,不夠就提醒。
  • 可隨時退出,退出時打印已購買的商品和餘額。

在這以前,咱們先向你們介紹一種能夠直接將列表元素和下標一塊兒打印出來的方法:enumerate

舉例以下:

__author__ = 'Sunny Han'
a=[2,3,4]
for i in enumerate(a):
    print(i)

代碼運行結果以下:

咱們能夠看到,這裏直接將列表中的元素及其下標一同打印了出來。這對咱們寫購物車程序頗有幫助。

接下來咱們練習寫購物車程序,代碼以下:

__author__ = 'Sunny Han'
product_list=[
    ('Iphone',5800),('Mac Pro',9800),('Bike',800),('Watch',10600),('coffee',31)
]
shopping_list=[]
salary=input('input your salary:')#輸入工資
if salary.isdigit():
    salary=int(salary)#將salary轉爲整型變量
    while True:
        for index,item in enumerate(product_list):
            print(index,item)

        user_choice=input('請問要買什麼商品:>>>:')
        if user_choice.isdigit():
            user_choice=int(user_choice)
            if user_choice>len(product_list)-1:
                print('商品 [%s] 不存在!'%user_choice)
            else:
               p_item=product_list[user_choice] #將用戶選擇的商品信息值賦給p_item
               if p_item[1]<=salary:   #若是餘額大於商品價格,則買得起
                   salary-=p_item[1]   #salary=salary-p_item[1],即自動扣款
                   shopping_list.append(p_item)  #將所購商品的信息加進空列表shopping_list
                   print('已將 %s 放入您的購物車,您的餘額爲 %s'%(p_item,salary))
               else:
                  print('餘額不足。')
        elif user_choice=='q': #若用戶想要退出系統,輸入「q"
            print('----購物車----')
            for p in shopping_list:
             print(p)
            print('您的餘額爲:',salary)
            exit()  #注意這裏要有一個退出的部分,不然用戶輸入"q"後會一直停留在商品列表界面
        else:
         print('請輸入商品編號!')
else:
    print('格式錯誤!')

代碼寫好後,咱們嘗試着執行一下,結果以下:

第一步會出現讓咱們輸入本身工資的界面,假設輸入9999,以下:

輸入後會顯示商品列表並詢問本身想要購買什麼商品,假設要購買IPhone,咱們輸入商品的下標0,執行以下:

咱們能夠看到界面會給出咱們的餘額和已購買商品信息,假如再買一杯咖啡,運行以下:

 

 咱們能夠看到與以前相似的界面,只不過餘額扣除了咖啡的價格,假如咱們想買一個「Mac Pro」,咱們看看會發生什麼狀況:

咱們能夠看到會提示餘額不足,這時倘若咱們想退出購物系統,就輸入「q」,運行以下 :

咱們能夠看到界面會顯示咱們已購買的商品信息和餘額。

以上就是咱們本節課的練習內容。

相關文章
相關標籤/搜索