1. 程式人生 > >Python運維開發基礎04-語法基礎【轉】

Python運維開發基礎04-語法基礎【轉】

2.7 rpo 如果 服務 ati zha unicode 之間 同學

上節作業回顧(講解+溫習90分鐘)

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# author:Mr.chen
# 僅用列表+循環實現“簡單的購物車程序”

import os,time

goods = [("蘋果",300),("白菜",400),("鴨梨",1000),("柿子",3000),("芒果",5000),("桂圓",8000)]
Tag = True
buy_List = []

while Tag :
    os.system("clear")
    salary = input("請輸入你的工資(輸入q退出程序):")
    if salary == "q" or salary == "Q" :
        print ("您並未購買商品,程序退出!")
        exit()
    elif salary.isdigit() :
        salary = int(salary)
        break
    else :
        print ("請以數字的形式輸入您的工資!")
        time.sleep(1.5)

while Tag :
    os.system("clear")
    title = "《商品清單》   您的余額為:{}元".format(salary)
    print (title)
    for item in goods :
        print (goods.index(item)+1,item[0],item[1])
    while Tag :
        num = input("請輸入想要購買的商品的編號(輸入q退出程序並結帳):")
        if num == "q" or num == "Q" :
            if len(buy_List) == 0 :
                print ("您沒有買任何東西,程序退出!")
                exit()
            else :
                for index in buy_List :
                    print ("您購買了一件{}商品,價格為:{}".format(goods[index-1][0],goods[index-1][1]))
                else :
                    print ("您的最後余額為{}元,程序退出!".format(salary))
                    exit()
        elif num.isdigit() and int(num) <= len(goods) and int(num) != 0 :
            num = int(num)
            break
        else :
            print ("請輸入正確的數字編號,只能單選!")
    while Tag :
        if salary < goods[num-1][1] :
            print ("您的余額已不足,請重新選擇商品!")
            time.sleep(1.5)
            break
        else :
            salary = salary - goods[num-1][1]
            buy_List.append(num)
            print ("{}商品購買成功!您的余額為{}元".format(goods[num-1][0],salary))
            time.sleep(1.5)
            break

一,Python3 入門知識補充

1.1 bytes類型

  • Python 3 最重要的新特性大概要算對文本和二進制數據作了更為清晰的區分。文本總是Unicode,由str類型表示,二進制數據則由bytes類型表示。Python 3不會以任意隱式的方式混用str和bytes,正是這使得兩者的區分特別清晰。你不能拼接字符串和字節包,也無法在字節包裏搜索字符串(反之亦然)。這是件好事。
  • 不管怎樣,字符串和字節包之間的界線是必然的,下面的圖解非常重要,務請牢記於心:

技術分享圖片

#在Python3中,字符串和二進制可以相互轉換

>>> "你好嗎?".encode()         #將字符串轉換成二進制
b‘\xe4\xbd\xa0\xe5\xa5\xbd\xe5\x90\x97\xef\xbc\x9f‘
>>> "你好嗎?".encode().decode()    #將二進制轉換成字符串
‘你好嗎?‘

特別提示:
在Python3中,如果要進行數據傳輸(Python的網絡編程),必須先將字符串轉換成二進制的格式才能進行傳輸。對方接收後,再轉換回字符串進行識別。
在Python2.7中則沒有以上要求。

1.2 三元運算

#正常寫法
>>> a,b,c
(1, 3, 5)
>>> if a > b : c = a
... else : c = b
... 
>>> c
3

#三元運算寫法

>>> a,b,c = 1,3,5
>>> d = a if a > b else c   #如果a大於b,那麽d = a 否則的話,d = c
>>> d
5

如果我們用正常邏輯來寫這段代碼,需要寫多行,很麻煩。如果我們用三元運算來寫,一行即可。

1.3 進制

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

二進制與十六進制之間的進制轉換

http://jingyan.baidu.com/album/47a29f24292608c0142399cb.html?picindex=1

計算機內存地址和為什麽用16進制?

為什麽用16進制?

  • 計算機硬件是0101二進制的,16進制剛好是2的倍數,更容易表達一個命令或者數據。十六進制更簡短,因為換算的時候一位16進制數可以頂4位2進制數,也就是一個字節(8位進制可以用兩個16進制表示)
  • 最早規定ASCII字符集采用的就是8bit(後期擴展了,但是基礎單位還是8bit),8bit用2個16進制直接就能表達出來,不管閱讀還是存儲都比其他進制要方便
  • 計算機中CPU運算也是遵照ASCII字符集,以16、32、64的這樣的方式在發展,因此數據交換的時候16進制也顯得更好
  • 為了統一規範,CPU、內存、硬盤我們看到都是采用的16進制計算

16進制用在哪裏?

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

二,字典

字典是一種key-value的數據類型,使用就像我們上學用的字典,通過筆畫,字母來查對應頁的詳細內容

語法:

info = {
    ‘stu1101‘:"TengLan Wu",
    ‘stu1102‘:"LongZe Luola",
    ‘stu11103‘:"XiaoZe Maliya",
}                        

字典的特性:

  • dict是無序的
  • key必須是唯一的(不能重復)

2.1 增加

#代碼演示

>>> Dict = {‘stu1101‘:"yunjisuan","stu1102":"benet","stu1103":"Tom","stu1104":"Amy"}
>>> Dict["stu1105"] = "蒼井空"
>>> Dict
{‘stu1102‘: ‘benet‘, ‘stu1104‘: ‘Amy‘, ‘stu1105‘: ‘蒼井空‘, ‘stu1101‘: ‘yunjisuan‘, ‘stu1103‘: ‘Tom‘}

如果想要賦值的字典的key值,在原字典裏沒有,那麽就會被判斷為是要新增字典元素
因為字典是無序的,所以增加的key:value後,在字典中的位置不固定。

2.2 修改

#代碼演示

>>> Dict = {‘stu1101‘:"yunjisuan","stu1102":"benet","stu1103":"Tom","stu1104":"Amy"}
>>> Dict["stu1102"] = "武藤蘭"
>>> Dict
{‘stu1102‘: ‘武藤蘭‘, ‘stu1104‘: ‘Amy‘, ‘stu1101‘: ‘yunjisuan‘, ‘stu1103‘: ‘Tom‘}

如果想要賦值的字典的key值,在原字典裏已經存在,那麽就會被判定為是要修改字典中已經有的key值所對應的value值;

2.3 刪除

(1)指定key值進行刪除

#代碼演示:

>>> Dict = {"stu1101":"Tom","stu1102":"Amy","stu1103":"feixue","stu1104":"zhangsan","stu1105":"lisi"}
>>> Dict
{‘stu1101‘: ‘Tom‘, ‘stu1103‘: ‘feixue‘, ‘stu1104‘: ‘zhangsan‘, ‘stu1105‘: ‘lisi‘, ‘stu1102‘: ‘Amy‘}
>>> Dict.pop("stu1101")     #刪除指定key,key所對應的value作為返回值(標準用法)
‘Tom‘
>>> Dict
{‘stu1103‘: ‘feixue‘, ‘stu1104‘: ‘zhangsan‘, ‘stu1105‘: ‘lisi‘, ‘stu1102‘: ‘Amy‘}
>>> del Dict["stu1104"]     #刪除指定key,無返回值
>>> Dict
{‘stu1103‘: ‘feixue‘, ‘stu1105‘: ‘lisi‘, ‘stu1102‘: ‘Amy‘}

(2)刪除整個字典

#代碼演示:

>>> Dict = {"stu1101":"Tom","stu1102":"Amy","stu1103":"feixue","stu1104":"zhangsan","stu1105":"lisi"}
>>> Dict
{‘stu1101‘: ‘Tom‘, ‘stu1103‘: ‘feixue‘, ‘stu1104‘: ‘zhangsan‘, ‘stu1105‘: ‘lisi‘, ‘stu1102‘: ‘Amy‘}
>>> del Dict
>>> Dict        #字典全被刪除,所以找不到了
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name ‘Dict‘ is not defined

(3)隨機刪除字典的key:value,並將刪除的key:value作為返回值

#代碼演示:

>>> Dict = {"stu1101":"Tom","stu1102":"Amy","stu1103":"feixue","stu1104":"zhangsan","stu1105":"lisi"}
>>> Dict.popitem()
(‘stu1101‘, ‘Tom‘)
>>> Dict.popitem()
(‘stu1103‘, ‘feixue‘)
>>> Dict.popitem()
(‘stu1104‘, ‘zhangsan‘)
>>> Dict
{‘stu1105‘: ‘lisi‘, ‘stu1102‘: ‘Amy‘}

2.4 查找

#代碼演示:

>>> Dict = {"stu1101":"Tom","stu1102":"Amy","stu1103":"feixue","stu1104":"zhangsan","stu1105":"lisi"}
>>> "stu1102" in Dict       #標準用法
True
>>> Dict.get("stu1102")     #獲取value
‘Amy‘
>>> Dict["stu1102"]         #也是獲取value,但是看下面
‘Amy‘
>>> Dict["stu1108"]         #當字典中沒有該key,會報錯
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: ‘stu1108‘
>>> Dict.get("stu1108")     #get()找不到key不會報錯。

2.5 提取字典裏所有的keys

#代碼演示:

>>> Dict = {"stu1101":"Tom","stu1102":"Amy","stu1103":"feixue","stu1104":"zhangsan","stu1105":"lisi"}
>>> "stu1101" in Dict   #可以直接判斷字符串是否在一個字典的keys中
True
>>> Dict.keys()     #提取字典所有的keys,返回一個字典類型的keys列表
dict_keys([‘stu1102‘, ‘stu1104‘, ‘stu1101‘, ‘stu1103‘, ‘stu1105‘])
>>> "stu1101" in Dict.keys()    #也可以判斷字符串是否存在於字典所有keys所組成的列表中
True

特別提示:
在此處的應用上Python2.7和Python3是有比較大的差別的。

#在Python2.7中

>>> a = {"a":"1","b":"2"}
>>> a.keys()    #返回一個list類型
[‘a‘, ‘b‘]  
>>> list(a)     #也返回一個list類型
[‘a‘, ‘b‘]
>>> a.keys().index("b") #list類型才有index索引
1
>>> list(a).index("b")  #list類型才有index索引
1

#在Python3中
>>> a = {"a":"1","b":"2"}
>>> list(a)     #返回一個列表類型
[‘b‘, ‘a‘]
>>> list(a).index("b")  #列表類型才有索引
0
>>> a.keys()    #返回的還是一個字典類型的keys
dict_keys([‘b‘, ‘a‘])
>>> a.keys().index("b")     #字典類型的keys沒有索引
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: ‘dict_keys‘ object has no attribute ‘index‘

2.6 提取字典裏所有的values

#代碼演示:

>>> Dict = {"stu1101":"Tom","stu1102":"Amy","stu1103":"feixue","stu1104":"zhangsan","stu1105":"lisi"}
>>> "Amy" in Dict       #不能判斷字符串是否存在於字典的values中
False
>>> Dict.values()       #提取字典的所有values,返回一個字典類型的values列表
dict_values([‘Amy‘, ‘zhangsan‘, ‘Tom‘, ‘feixue‘, ‘lisi‘])
>>> "Amy" in Dict.values()  #可以判斷字符串是否存在於字典所有的values所組成的列表中
True

2.7 字典的合並

>>> Dict = {"stu1101":"Tom","stu1102":"Amy","stu1103":"feixue","stu1104":"zhangsan","stu1105":"lisi"}
>>> Dict2={"1":"2","3":"4","stu1102":"更新了"}
>>> Dict.update(Dict2)
>>> Dict
{‘stu1105‘: ‘lisi‘, ‘stu1103‘: ‘feixue‘, ‘3‘: ‘4‘, ‘1‘: ‘2‘, ‘stu1104‘: ‘zhangsan‘, ‘stu1101‘: ‘Tom‘, ‘stu1102‘: ‘更新了‘}

字典的合並是沒有的key:values會新增到舊的字典中,如果key值出現重復就會進行value的更新操作。

2.8 多級字典嵌套及操作

#代碼演示:

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# author:Mr.chen


av_catalog = {
    "歐美":{
        "www.youporn.com":["很多免費的,世界最大的","質量一般"],
        "www.pornhub.com":["很多免費的,也很大","質量比yourporn高點"],
        "x-art.com":["質量很高","全部收費,屌絲請繞過"]
    },
    "日韓":{
        "tokyo-hot":["質量怎樣不清楚,個人已經不喜歡日韓範了","聽說是收費的"]
    },
    "大陸":{
        "1024":["全部免費,真好,好人一生平安","服務器在國外,慢"]
    }
}

av_catalog["大陸"]["1024"][1] += ",可以用爬蟲爬下來"
print (av_catalog["大陸"]["1024"])

#輸出
[root@localhost scripts]# python3 test.py 
[‘全部免費,真好,好人一生平安‘, ‘服務器在國外,慢,可以用爬蟲爬下來‘]

2.9 循環dict

 #代碼演示:
 
 #!/usr/bin/env python3
# -*- coding:utf-8 -*-
# author:Mr.chen


Dict = {
    "stu1001":"Tom",
    "stu1002":"Amy",
    "stu1003":"benet",
    "stu1004":"yunjisuan"
}

for key in Dict :
    print (key,Dict[key])


#輸出
[root@localhost scripts]# python3 test.py 
stu1002 Amy
stu1001 Tom
stu1003 benet
stu1004 yunjisuan

2.10 循環dict時附帶索引

#代碼演示:

a = {
    "yunjisuan":"33",
    "benet":"44",
    "Tom":"22",
    "chensiqi":"88"
}

for index,keys in enumerate(a) :
    print (index+1,keys,a[keys])  
    
#輸出結果

[root@localhost scripts]# python3 test2.py 
1 chensiqi 88
2 Tom 22
3 yunjisuan 33
4 benet 44

2.11 如何讓字典有序?

#代碼演示:

a = {
    "yunjisuan":"33",
    "benet":"44",
    "Tom":"22",
    "chensiqi":"88"
}
b = []

for index,keys in enumerate(a) :
    b.append((index+1,keys,a[keys]))
    print (index+1,keys,a[keys])
                                        
print (b)

#輸出結果

[root@localhost scripts]# python3 test2.py 
1 Tom 22
2 yunjisuan 33
3 chensiqi 88
4 benet 44
[(1, ‘Tom‘, ‘22‘), (2, ‘yunjisuan‘, ‘33‘), (3, ‘chensiqi‘, ‘88‘), (4, ‘benet‘, ‘44‘)]

三,利用字典優化"用戶登陸接口程序"

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# author:Mr.chen
#利用字典功能優化“用戶登陸驗證接口功能”

users = {"chensiqi1":"666666","chensiqi2":"666666"}
error = []

while True :
    user_Name = input("請輸入登錄用戶的用戶名:")
    if user_Name in error :
        print ("用戶已經被鎖定,請嘗試登陸其他用戶!")
    elif user_Name in users.keys() :
        for i in range(3) :
            user_Passwd = input("請輸入登陸用戶名的密碼:")
            if user_Passwd == users[user_Name] :
                print ("{}用戶登陸成功!".format(user_Name))
                exit()
            else :
                print ("用戶賬戶或密碼輸入錯誤!請重新輸入,您還有{}次機會。".format(2-i))
        else :
            print ("您的密碼已經輸錯3次了,賬戶已經鎖定!請嘗試登陸其他用戶。")
            error.append(user_Name)
    else :
        print ("沒有這個賬戶名,請重新輸入!")

四,邏輯引導與作業

邏輯引導:

  • 我們學習了字典的各種存取方法,並且利用字典的key:values的便利的鍵值對應方式優化了“用戶登陸接口”
  • 但是,我們仍在存在著不少問題。比如我們輸入輸出數據時,有不少的數據都是字符串的格式。尤其在用戶輸入數據時,用戶總是喜歡輸入一些非常奇怪的數據。比如:“你好嗎?”他非要輸入成“(空格)你好嗎(空格) ”。
  • 對類似這些空格數據,我們很難做出判斷。他到底輸入的是不是一個正常數據。再比如用戶在菜單選擇裏,我們同學們都已經知道了,通過字符串的.isdigit()來判斷用戶輸入的是不是一個純數字組成的數據。
  • 是的,類似這些對字符串數據的判斷,是我們在日常編程中經常要遭遇的問題。這就需要我們學習下一節的知識--->字符串的24種常用方法

作業:

程序:三級菜單

要求:

  • [x] :打印省,市,縣三級菜單
  • [x] :只能用一個字典來存取地區名稱
  • [x] :可返回上一級
  • [x] :可隨時退出程序

轉自

Python運維開發基礎04-語法基礎 - 陳思齊 - 博客園 https://www.cnblogs.com/chensiqiqi/p/9163035.html

Python運維開發基礎04-語法基礎【轉】