Python自動化運維課程學習--Day2

本文爲參加老男孩Python自動化運維課程次日學習內容的總結。html

大體內容以下:python

  一、python模塊初識編程

  二、python程序運行流程segmentfault

  三、python數據類型(只講了numbers, bool, strings, bytes, list, tuple, dict, set)app

  四、python數據運算運維

0、關於本文中全部運行Python代碼的環境:編程語言

   --操做系統:Ubuntu 16.10 (Linux 4.8.0)ide

      

   --Python版本:3.5.2函數

      

   --Python IDE: PyCharm 2016.3.2學習

      

一、Python模塊初識,Python模塊分爲標準庫和第三方庫:  

      1) 標準庫(build-in lib)爲安裝python後自帶的模塊(庫),通常存放在安裝路徑下的lib文件夾下:

      Windows:C:\Users\[username]\AppData\Local\Programs\Python\Python35\Lib\

      Linux: /usr/lib/python3.5/

    2) 第三方庫:在安裝好python後,須要另外安裝的模塊(庫),通常存放在安裝路徑下的site_packages文件夾下:

      Windows:C:\Users\[username]\AppData\Local\Programs\Python\Python35\Lib\site_packages\

      Linux: /usr/lib/python3.5/site_packages/

        要引用這些模塊中的功能,必須在python代碼的開頭經過 import 導入要引用的模塊後,才能使用模塊中的各個功能。

        本節課就只簡單的來了解下sys和os兩個標準模塊。

        1)sys模塊:提供python解釋器與用戶交互的接口功能。如sys.exit(),sys.path等。

    官方解釋:This module provides access to some variables used or maintained by the interpreter and to functions that interact strongly with the interpreter. It is always available.   詳見https://docs.python.org/3.5/library/sys.html#module-sys

            sys.path: 打印Python全局環境變量

     sys.arve: 若是在執行python程序時,後面沒有跟任何參數(參數間以空格隔開),打印python代碼文件的路徑;

          若是有參數,則打印全部參數(以lists的形式打印);

           若是是sys.arve[N]:則打印後面的第N個參數。若是N大於後面參數的總個數,則報「out of range」錯。

#!/usr/bin/python3.5
# -*- coding:utf-8 -*-
# Function: check the sys mode with sys.path and sys.argv
# Author: Spencer Jiang
# Date: 2017-02-18

import sys

# 打印Python的全局環境變量信息
print("sys.path", sys.path)

# 打印Python程序文件路徑(Windows下是絕對路徑,Linux下是相對路徑)
print("\nsys.argv", sys.argv)

# 打印執行Python程序文件跟着的第1個參數 
print("\nsys.argv[1]", sys.argv[1])

# argv報錯:out of range
print("\nsys.argv[1]", sys.argv[10])

# End Of File

    

        2)os模塊:提供python解釋器與操做系統交互的接口功能。如os.path,os.error等。

    官方解釋:This module provides a portable way of using operating system dependent functionality. 詳見https://docs.python.org/3.5/library/os.html#module-os

            os.system("") : 調用系統命令,如os.system("ls -lh")、os.system("dir")等。

            os.mkdir(""): 調用系統的mkdir命令建立目錄

#!/usr/bin/python3.5
# -*- coding:utf-8 -*-
# Function: check the os mode with os.open(), os.system(), os.popen(), os.mkdir()
# Author: Spencer Jiang
# Date: 2017-02-18

import os

# 調用系統命令ls -lh 顯示當前路徑下全部文件和目錄列表 
print(os.system("ls -lh"))

cmd_line = os.system("ls -lh")

# 若是命令執行成功,則返回1,不然爲0
print("\ncmd_line: ", cmd_line)

# 建立test_day2文件夾
os.mkdir("test_day2")

# 用popen()替換system()
cmd_result = os.popen("ls -lh")

# 打印在內存的地址
print("\ncmd_result Address in memory: ", cmd_result)

# read() 打印cmd_result的值 
print("\n cmd_result : ", cmd_result.read())

# 再建立test_day2文件夾,報錯
os.mkdir("test_day2")

# End Of File

    

 

 二、Python程序運行流程  

     Python是解釋型語言,在執行過程當中涉及到兩個概念:PyCodeObject 和 pyc文件

      PyCodeObject: 指Python代碼執行時的結果保存在內存中的對象 

             pyc文件: 指Python代碼執行結果保存到磁盤上的文件,可視爲PyCodeObject的持久化存儲。因此咱們會在執行python代碼後,在python代碼文件(.py)同路徑下看到一個與python代碼文件同名的.pyc文件。

    

 

三、Python數據類型(numbers, bool, strings, bytes、list、tuple、dictionary、set)

    Numbers:有int、long、fload、complex(複數)

    Bool:True(數字1)、False(數據0): 在Python2中是沒有布爾型的,它用數字0表示False,用1表示True。在Python3中,把True和False定義成關鍵字了,但它們的值仍是1和0,它們能夠和數字作運算。

    Strings:字符串,單引號或雙引號或三引號。字符串拼接:修改字符串內容時,就須要再次開闢內存空間,經過「+」拼接字符串也是同樣的道理。

    Bytes:Python3中新增的類型,Bytes 對象是由單個字節做爲基本元素(8位,取值範圍 0-255)組成的序列,爲不可變對象。Bytes 對象只負責以二進制字節序列的形式記錄所需記錄的對象,至於該對象到底表示什麼(好比究竟是什麼字符)則由相應的編碼格式解碼所決定。(參考https://segmentfault.com/a/1190000004450876)

                bytes能夠與字符串相互轉換: 字符串經過 bytes(字符串, 編碼格式) 轉換成 bytes類型; bytes經過decode()轉換成字符串。

str_name = "字符串"

byte_uft8 = bytes(str_name, "utf-8")
print("name--utf-8: ", byte_uft8)

byte_gbk = bytes(str_name, "gbk")
print("name--gbk: ", byte_gbk)

byte_decode_utf8 = byte_uft8.decode("utf8")
print("byte_decode_utf8: ", byte_decode_utf8)

byte_decode_gbk = byte_gbk.decode("gbk")
print("byte_decode_gbk: ", byte_decode_gbk)

    

      list(列表):

        1)有序的元素集合,以方括號爲開始和結束標記,各元素以逗號隔開,如 list_a = [1, 2, 3, 4, "test"]。

               2)列表的起始下標是0。

      3)列表支持的操做:

        A、查詢:取某下標的元素值list_a[i]、取某元素對應的下標list_a.index("test")、對某元素計數list_a.count(1)。

#!/usr/bin/python3.5
# -*- coding:utf-8 -*-
# Function: list query ops
# Author: Spencer Jiang
# Date: 2017-02-27

list_a = [1, 2, 3, 4, "test", 4, "abc"]
print(list_a)

# 取某下標的元素值
print(list_a[4])
print(list_a[-1])

# 取某元素對應的下標
print(list_a.index("test"))

# 對某元素計數
print(list_a.count(4))

      

                      B、切片:取某個範圍內的全部元素 list_a[i:j:len],i爲起始下標,缺省時爲0;j爲結束下標,缺省時爲list_a的長度-1;len爲步長,缺省時爲1。

    

        C、更新

          在列表末尾添加新的元素:list.append(value);

                            在列表指定位置插入一個元素:list.insert(i, value);

                            在修改指定下標對應元素的值:list[i]=value;

                            將列表中全部元素的數據類型都一致的按ASCII碼排序:list.sort(); 若是列表中元素既有數字,又有字符串,則sort()函數會報錯「TypeError: unorderable types: str() < int()」。

                            將列表中全部元素反轉過來:list.reverse();

                            不一樣列表的拼接:list_a.extend(list_b),將列表list_b中全部元素鏈接到list_a的末尾。

#!/usr/bin/python3.5
# -*- coding:utf-8 -*-
# Function: list query ops
# Author: Spencer Jiang
# Date: 2017-02-27

list_a = [1, 2, 3, "test", 4, "abc"]
print("list_a:", list_a)

# 在列表末尾添加新的元素
list_a.append("hello")
print("list_a.append('hello'):", list_a)
# 在列表指定位置插入一個元素
list_a.insert(2, 123123)
print("list_a.insert(2, 123123):", list_a)
# 修改指定下標對應元素的值
list_a[1] = "b"
print("list_a[1]:", list_a)
# 將全部元素按ASCII碼排序
# list_a.sort()  # 列表中元素既有數字又有字符串,則sort()函數會報錯「TypeError: unorderable types: str() < int()」

list_b = [123, 3, 54, 234, 23, 4]
list_b.sort()
print("list_b.sort():", list_b)
# 將列表中全部元素反轉
list_b.reverse()
print("list_b.reverse():", list_b)

# 將列表list_a中全部元素鏈接到list_b的末尾
list_b.extend(list_a)
print("list_b.extend(list_a):", list_b)

      

         D、刪除

            刪除列表中最後一個元素:list_a.pop()

            刪除列表中指定的元素:list_a.remove(value)

                                 刪除列表中指定下標的元素:list_a.pop(i)

            刪除列表中指定下標的元素:del list_a[i]

            清空列表中全部的元素: list_a.clear()

            刪除整個列表: del list_a 

#!/usr/bin/python3.5
# -*- coding:utf-8 -*-
# Function: list query ops
# Author: Spencer Jiang
# Date: 2017-02-27

list_a = [1, 2, 3, "test", 4, "abc", "cde"]
print("list_a:", list_a)

# 刪除列表中最後一個元素:list_a.pop()
list_a.pop()
print("list_a.pop():", list_a)

# 刪除列表中指定的元素:list_a.remove(value)
list_a.remove("abc")
print("list_a.remove('abc''):", list_a)

# 刪除列表中指定下標的元素:list_a.pop(i)
list_a.pop(1)
print("list_a.pop(1):", list_a)

# 刪除列表中指定下標的元素:del list_a[i]
del list_a[1]
print("del list_a[1]:", list_a)

# 清空列表中全部的元素: list_a.clear()
list_a.clear()
print("list_a.clear():", list_a)

# 刪除整個列表: del list_a
del list_a
print(list_a)      # list_a對象被刪除,打印報錯"name 'list_a' is not defined"

      

         E、拷貝操做:copy

            直接將一個列表賦值給另外一個列表:list_b = list_a,list_b與list_a中全部元素都會實時保持一致。

            淺copy: list_a = list_b.copy() 或 經過 導入copy包,list_a = copy.copy(list_b),只有對嵌套列表中的元素纔會實時保持一致。

                                  深copy:經過導入copy包, list_a = copy.deepcopy(list_b),不論是不是嵌套列表,全部元素都會實時保持一致。

 

           tuple(元組):元組是不可變的列表,以括號爲開始和結束標記,各元素以逗號隔開,如 tuple_a = (1, 2, 3, "test"),起始下標爲0。

               元組支持的操做:取某下標的元素值tuple_a[i]、取某元素對應的下標tuple_a.index("test")、對某元素計數tuple_a.count(1)。

#!/usr/bin/python3.5
# -*- coding:utf-8 -*-
# Function: check tuple
# Author: Spencer Jiang
# Date: 2017-02-27

# 元組是不可變的列表,以括號爲開始和結束標記,各元素以逗號隔開
name_tuple = (1, 2, 3, "wu", "test", "SZ", "wu")
print(name_tuple)
# 起始下標爲0
print(name_tuple[1])
# 對某元素計數
print(name_tuple.count("wu"))
# 取某元素對應的下標
print(name_tuple.index("SZ"))

    

       

      set(集合):無序的,能自動去重的數據組合,經過set()函數定義, set_a = set("hello, python")。

set_a = set("hello, python")

print(set_a)

{'y', ' ', 'h', 'e', ',', 'l', 't', 'n', 'p', 'o'}     # 打印結果

       A、運算操做

           取set_a 和 set_b 的並集: set_a | set_b

                               取set_a 和 set_b 的交集: set_a & set_b

           取set_a 和 set_b 的差集: set_a - set_b

           取set_a 和 set_b 的對稱差集: set_a ^ set_b

set_a = set("hello, python")
print(set_a)
set_b = set("hello, world")
print(set_b)
# 取set_a 和 set_b 的並集: set_a | set_b
print(set_a | set_b)
# 取set_a 和 set_b 的交集: set_a & set_b
print(set_a & set_b)
# 取set_a 和 set_b 的差集: set_a - set_b
print(set_a - set_b)
print(set_b - set_a)
# 取set_a 和 set_b 的對稱差集: set_a ^ set_b
print(set_a ^ set_b)

     

           B、新增操做

            新增1個元素:set_a.add(value)

            新增多個元素:set_a.update(value1, value2, value3...) 

set_a = set(["hello, python"])
print(set_a)

set_a.update("hel", "lo")  # will separate to 'h', 'e', 'l', 'o'
print(set_a)

set_a.update(["hel", "lo", "2"])
print(set_a)

          

            合併兩個集合:set_a.union(set_b),等於set_a | set_b

          C、刪除

            隨機移除一個元素: set_a.pop()

            移除某個元素: set_a.remove(value)

set_a = set("hello, python")
print(set_a)

set_a.add("1")
set_a.update("2", "3")
print(set_a)

set_a.remove("h")
print(set_a)

print(set_a.union(set("HELLO")))

set_a.pop()
print(set_a)

## 運行結果
{'o', 'e', 'l', 't', 'n', ',', 'p', 'y', 'h', ' '}
{'o', 'e', 'l', 't', '2', 'n', ',', 'p', 'y', 'h', '3', ' ', '1'}
{'o', 'e', 'l', 't', '2', 'n', ',', 'p', 'y', '3', ' ', '1'}
{'o', 'L', 'E', 'H', 'e', 'l', 't', '2', 'n', 'O', ',', 'p', 'y', ' ', '3', '1'}
{'e', 'l', 't', '2', 'n', ',', 'p', 'y', '3', ' ', '1'}

         D、比較操做:

          獲取set_a中全部不屬於set_b的元素: set_a.difference(set_b)          

 

    dictonary(字典):無序的key-value對數據集合,key必須是惟一的。以大括號{}開頭和結束,key和value前以冒號分隔。

         A、查詢:查詢某key對應的值:dist.get(key)、dist[key]

            獲取全部的key: dist.keys()

            獲取全部的value: dist.values()

            獲取全部key-value: dist.items()

         B、更新

            更新某個key的值:dist[key] = value,若是key不在,則新增;存在則更新

            獲取某個key的值:dist.set(key, value): 若是key已存在,則返回該key的值;若是不存在key,則新增該key-value。          

            合併兩個dist:disct.update(dist_b),將dist_b合併到dist中,若是key重複,則覆蓋

         C、刪除:刪除某個指定key-value:dist.pop(key)

            隨機刪除某個元素:dist.popitem()

            刪除某個指定key-value:del dist(key)

     

dis_person = {
    "Spencer": {
        "sex": "boy",
        "age": 23,
        "job": ["Dev", "Test"]
    },
    "Jack": {
        "sex": "boy",
        "age": 17,
        "job": "stud"
    },
    "Jen": {
        "sex": "girl",
        "age": 22,
        "job": "stud"
    }
}

print(dis_person["Spencer"])
print(dis_person["Spencer"]["job"])
print(type(dis_person.keys()), dis_person.keys())
print(dis_person.get("Jen"))
print(type(dis_person.items()), dis_person.items())
print(dis_person.values())

dis_person["Spencer"].pop("job")
print(dis_person["Spencer"])

   附上整理的數據類型思惟導圖:

 

四、Python數據運算 及 運算優先級         

        一、算數運算:  +(加)、 -(減)、 *(乘)、 /(除)、  %(取模)、 //(取商的整數部分)、 **(冪)

        在計算機中,全部的算數運行,都要先轉換成二進制後再進行運算。

#!/usr/bin/python3.5
# -*- coding:utf-8 -*-
# Function: practice of the calculator
# Author: Spencer Jiang
# Date: 2017-02-22

a = 123
b = -321

print("123 + (-321)=", a + b)

print("123 - (-321)=", a - b)

print("123 * (-321)=", a * b)

print("(-321) / 123=", b / a)

print("123 % (-321)=", a % b)

print("(-321) // 123=", b // a)

print("123 ** 2=", a**2)

    

      二、比較運算符: ==(判斷兩個對象是否相等)、 !=(判斷兩個對象是否不相等)、 >(大於)、 <(小於)、 <>(不相等,不建議用這個符號)、 >=(大於等於)、 <=(小於等於)

      三、賦值運算符[在算數運算符後面加個等號(=)]:=(簡單的賦值)、 +=(加法賦值)、 -=(減法賦值)、 *= (乘法賦值)、/=(除法賦值)、%=(取模賦值)、//=(取商的整數賦值)、**=(取冪賦值)

   四、邏輯運算符:or(或)、and(與)、not(非),用於條件判斷語句中對單個或多個條件的運算。

#!/usr/bin/python3.5
# -*- coding:utf-8 -*-
# Function: user login input
# Author: Spencer Jiang
# Date: 2017-02-25

user_name = input("please input username: ")
password = input("Please input password: ")

_username = "spencer"
_password = "1234abcd"

if user_name == _username and password == _password:
    print("Welcome, login successfully!!")
elif user_name != _username or password != _password:
    print("Invalid username or password!!")
else:
    print("I am not happy!")

    

  五、成員運算:in(若是在指定的列表中能找到則返回True,不然爲False)、not in(若是在指定的列表中沒有能找到則返回True,不然爲False)

      六、身份運算:is(判斷兩個標識是否引用同一個對象)、 not is(判斷兩個標識是否不是引用同一個對象)

      七、位運算:&(按位與)、 |(按位或)、^(按位異或)、~(按位取反)、<<(左移運算)、>>(右移運算) 

    1)按位與運算(&):兩個數的二進制各位上的數值都爲1(真)時,才爲1(真);不然就是0(假)。

      示例:a, b = 123, -123 

                 a & b = 0111 1011 & 1000 0101 = 0000 0001 = 1

      注:負數在二進制裏是以補碼來表示的——以b=-123爲例:

        a)先取其絕對值的二進制值(按8位二進制來算,123的二進制是 0111 10十一、首位加0表示正數、首位加1表示負數)

        b)再進行按位取反,變爲:1000 0100

                      c)末位加1,就是補碼:1000 0101 

    2)按位或運算(|):兩個數的二進制各位上的數值只要有一個爲1(真)時,就爲1(真);不然就是0(假)。

       a | b = 0111 1011 | 1000 0101 = 1111 1111 = -1

      3)按位異或運算(^):兩個數的二進制各位上的數值同時都爲1(真)、或者同時爲0(假)時,就爲0(假);不然就是1(真)。

       a ^ b = 0111 1011 ^ 1000 0101 = 1111 1110 = -2

    4)按位取反(~):只對1個數進行操做,對二進制數各位上數值取相反的一位,即若爲0,則取反就變1;若爲1,則取反爲0。  

        (1) 正數的取反 過程:  ~a = -124 = -(a+1)
           a、將正數轉換成 二進制數(按8位二進制來算),並在最前面加一個符號爲 0 表示正數,1 表示負數:
             如 a = 123; 二進制數爲: 0 0111 1011
           b、 取該二進制數的補碼: 0 0111 1011 (正數的補碼爲其自己,負數的補碼爲按位取反末位加1)
           c、在按位取反: 1 1000 0100 
           d、再按位取反(符號位不變): 1 0111 1011  
           e、若是首位是1(表示負數),末位需加1。 1 0111 1100  (-124)
       (2) 負數的取反 過程:  ~b = 122 = -(b+1)

        a、將正數轉換成 二進制數,並在最前面加一個符號爲 0 表示正數,1 表示負數:
          如 b= -123; 取其絕對值的二進制數,最前面加符號位,爲: 1 0111 1011
        b、 取該二進制數的補碼: 0 1000 0101 (正數的補碼爲其自己,負數的補碼爲按位取反末位加1)
        c、再按位取反(符號位不變): 0 0111 1010 (122)

    5)左移運算:只對1個數的操做,表達式爲:A<<X,表示 A的二進制全部位向左移X位,右邊補0

    6)右移運算:只對1個數的操做,表達式爲:A>>X,表示 A的二進制全部位向右移X位

#!/usr/bin/python3.5
# -*- coding:utf-8 -*-
# Function: Bitwise operations
# Author: Spencer Jiang
# Date: 2017-02-25

a = 123
b = -123

print("binary of %d is  0011 1101" % a)
print("binary of %d is  1000 0101" % b)

print("b<<2 = ", b << 2)
print("a>>2 = ", a >> 2)

    

      8、三元運算: 對3個操做數的運算

#!/usr/bin/python3.5
# -*- coding:utf-8 -*-
# Function: three opts
# Author: Spencer Jiang
# Date: 2017-02-25

b, c = 5, 19

a = c if b > c else c

print(a)

    

 最後:Python是面向對象的編程語言,在Python裏一切皆對象。

 

第二週做業------購物車

一、分爲用戶入口和商家入口二、用戶入口:    1)、首次運行程序才須要輸入存款(工資)    2)、從文件中讀取商品信息    3)、購買商品後,顯示己購商品列表、帳戶餘額,並都保存到文件中三、商家入口:    1)、能夠添加商品、修改商品價格    2)、商品信息保存在文件中

相關文章
相關標籤/搜索