Python自動化運維之路-01


python的主要應用

file://C:\Users\gxw\AppData\Local\Temp\ct_tmp/1.png
python的擅長領域

學python有沒有前途?python的語言排名

語言選擇

運維會了開發后可以干什么?


python的最大優勢就是什么都能做。

課程概述

畢業目標

周五十二點之前交作業。

學python的原因

節約時間,投資自己

結識更多的朋友

Becoming a better version of myself.

知識點

語言的分類

①編譯型語言和解釋性語言

 編譯型語言是指在程序執行之前,有一個單獨的編譯過程,將程序翻譯成機器語言,以后執行這個程序的時候,就不用再進行翻譯了。解釋型語言是指是在運行的時候將程序翻譯成機器語言,所以運行速度相對於編譯型語言要慢。C/C++ 等都是編譯型語言,而Java,C#等都是解釋型語言。雖然Java程序在運行之前也有一個編譯過程,但是並不是將程序編譯成機器語言,而是將它編譯成字節碼(可以理解為一個中間語言)。在運行的時候,由JVM將字節碼再翻譯成機器語言。

②動態語言和靜態語言

動態類型語言:動態類型語言是指在運行期間才去做數據類型檢查的語言,也就是說,在用動態類型的語言編程時,永遠也不用給任何變量指定數據類型。如python和ruby等。靜態類型語言:它的數據類型是在編譯其間檢查的,也就是說在寫程序時要聲明所有變量的數據類型。如C/C++,java,C#等。

③強類型定義語言和弱類型定義語言

強類型定義語言:強制數據類型定義的語言。也就是說,一旦一個變量被指定了某個數據類型,如果不經過強制轉換,那么它就永遠是這個數據類型了,如python。
弱類型定義語言:數據類型可以被忽略的語言。它與強類型定義語言相反, 一個變量可以賦不同數據類型的值。如VScript。

python的優點

①Python的定位是“優雅”、“明確”、“簡單”,所以Python程序看上去總是簡單易懂,初學者學Python,不但入門容易,而且將來深入下去,可以編寫那些非常非常復雜的程序。
②開發效率非常高,Python有非常強大的第三方庫,基本上你想通過計算機實現任何功能,Python官方庫里都有相應的模塊進行支持,直接下載調用后,在基礎庫的基礎上再進行開發,大大降低開發周期,避免重復造輪子。
③高級語言————當你用Python語言編寫程序的時候,你無需考慮諸如如何管理你的程序使用的內存一類的底層細節
④可移植性————由於它的開源本質,Python已經被移植在許多平台上(經過改動使它能夠工 作在不同平台上)。如果你小心地避免使用依賴於系統的特性,那么你的所有Python程序無需修改就幾乎可以在市場上所有的系統平台上運行
⑤可擴展性————如果你需要你的一段關鍵代碼運行得更快或者希望某些算法不公開,你可以把你的部分程序用C或C++編寫,然后在你的Python程序中使用它們。
⑥可嵌入性————你可以把Python嵌入你的C/C++程序,從而向你的程序用戶提供腳本功能。

python的缺點

①速度慢,Python 的運行速度相比C語言確實慢很多,跟JAVA相比也要慢一些,因此這也是很多所謂的大牛不屑於使用Python的主要原因,但其實這里所指的運行速度慢在大多數情況下用戶是無法直接感知到的,必須借助測試工具才能體現出來,其實在大多數情況下Python已經完全可以滿足你對程序速度的要求,除非你要寫對速度要求極高的搜索引擎等,這種情況下,當然還是建議你用C去實現的。
②代碼不能加密,因為PYTHON是解釋性語言,它的源碼都是以名文形式存放的,不過我不認為這算是一個缺點,如果你的項目要求源代碼必須是加密的,那你一開始就不應該用Python來去實現。
③線程不能利用多CPU問題,這是Python被人詬病最多的一個缺點,GIL即全局解釋器鎖(Global Interpreter Lock),是計算機程序設計語言解釋器用於同步線程的工具,使得任何時刻僅有一個線程在執行,Python的線程是操作系統的原生線程。在Linux上為pthread,在Windows上為Win thread,完全由操作系統調度線程的執行。一個python解釋器進程內有一條主線程,以及多條用戶程序的執行線程。即使在多核CPU平台上,由於GIL的存在,所以禁止多線程的並行執行。關於這個問題的折衷解決方法,我們在以后線程和進程章節里再進行詳細探討。

python的解析器

①cpyton

CPython是使用最廣的Python解釋器。教程的所有代碼也都在CPython下執行

②IPython

IPython是基於CPython之上的一個交互式解釋器,也就是說,IPython只是在交互方式上有所增強,但是執行Python代碼的功能和CPython是完全一樣的。好比很多國產瀏覽器雖然外觀不同,但內核其實都是調用了IE。
CPython用>>>作為提示符,而IPython用In [序號]:作為提示符。

③PyPy

PyPy是另一個Python解釋器,它的目標是執行速度。PyPy采用JIT技術,對Python代碼進行動態編譯(注意不是解釋),所以可以顯著提高Python代碼的執行速度。
絕大部分Python代碼都可以在PyPy下運行,但是PyPy和CPython有一些是不同的,這就導致相同的Python代碼在兩種解釋器下執行可能會有不同的結果。如果你的代碼要放到PyPy下執行,就需要了解PyPy和CPython的不同點。

④Jython

Jython是運行在Java平台上的Python解釋器,可以直接把Python代碼編譯成Java字節碼執行。

⑤IronPython

IronPython和Jython類似,只不過IronPython是運行在微軟.Net平台上的Python解釋器,可以直接把Python代碼編譯成.Net的字節碼。

在編寫Python程序時,/usr/bin/python和/usr/bin/env python的區別?

#!/usr/bin/python是告訴操作系統執行這個腳本的時候,調用/usr/bin下的python解釋器;
#!/usr/bin/env python這種用法是為了防止操作系統用戶沒有將python裝在默認的/usr/bin路徑里。當系統看到這一行的時候,首先會到env設置里查找python的安裝路徑,再調用對應路徑下的解釋器程序完成操作。
#!/usr/bin/python相當於寫死了python路徑;
#!/usr/bin/env python會去環境設置尋找python目錄,推薦這種寫法

變量和字符編碼

name = “alex Li”

變量的命名規則

①變量名只能是 字母、數字或下划線的任意組合
②變量名的第一個字符不能是數字
③以下關鍵字不能聲明為變量名
['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield']
④變量名要見名之義。
跑車哥牛朋友的名字:glOfOldBoy gf_of_oldboy

常量

不能改變的量,變量名要大寫。(可以修改,但是不應該改)。

字符編碼

二進制:通過01排列表示復雜的數字,例如7=111,4=010
字符編碼的區別與聯系
①ASCII(American Standard Code for Information Interchange,美國標准信息交換代碼)是基於拉丁字母的一套電腦編碼系統,最多只能有八位字節來表示,ASCII碼最多只能表示 255 個符號。,占八位,一個字節。
②unicode(統一碼、萬國碼、單一碼)是一種在計算機上使用的字符編碼。Unicode 是為了解決傳統的字符編碼方案的局限而產生的,
它為每種語言中的每個字符設定了統一並且唯一的二進制編碼,規定雖有的字符和符號最少由 16 位來表示(2個字節),即:2 **16 = 65536,備注:是至少需要2個字節。
③UTF-8,是對Unicode編碼的壓縮和優化,他不再使用最少使用2個字節,而是將所有的字符和符號進行分類:ascii碼中的內容用1個字節保存、歐洲的字符用2個字節保存,東亞的字符用3個字節保存。

Python3默認的字符編碼就是utf-8

注釋:

①單行注釋 #

②多行注釋 ‘’'注釋內容''' “”“注釋內容”“”

打印多行就要用到多行,
shell中,$符號單引號不會被轉義,雙引號會對轉義。
在python中單引號和雙引號是沒有區別的。

標准化輸出:

①第一種標准輸出:

②第二種標准輸出(使用占位符)

#!/usr/bin/env python
# _*_ coding:utf8 _*_
#author:snate
name=input("name:")
age=int (input("age:"))
Job=input("Job:")
salary=float (input("salary:"))
info="""
    -----------info of %s-----------
    name:%s
    age:%d
    Job:%s
    salary:%f
    -------------------------------
""" %(name,name,age,Job,salary)
print(info)

其中%s是占位符,""" 標准輸出內容""",此處單引號雙引號都可以。
input默認輸入的是字符串,要轉化成數字類型需要強轉。
#在python2.#中raw_input和python3.#的input的作用完全相同。
#在python2.#中input輸入的是什么類型就是什么類型。

③第三種標准輸出

#!/usr/bin/env python
# _*_ coding:utf8 _*_
#author GXW
name=input("name:")
age=int(input("age:"))
job=input("Job:")
salary = float(input("salary:"))
info2='''
    =================info of {_name}====================
    name:{_name}
    age:{_age}
    job:{_job}
    salary:{_salary}
    ===================================================
'''.format(_name=name,
               _age=age,
               _job=job,
               _salary=salary)
print(info2)

使用format進行標准輸出,利用key的形式。'.format(_name=name,_age=age,_job=job,_salary=salary)
備注:掌握第二種和第三種標准輸出格式。

初識模塊

在輸入密碼時,為了使密碼不可見,可以條用getpass模塊的getpass()方法。
password = getpass.getpass("請輸入您的您的密碼:");
代碼如下:


執行結果如下:

①sys

結果返回的是一個列表,其中argv[0]是程序名,argv[1]是緊跟的第一個參數,agrv[2】是第二個參數。

②os

os.system("pwd"),保存的是程序的執行結果的狀態(0或者是1,0表示執行成功,1表示失敗)但是並不記錄程序的輸出結果。

os.poopen("pwd").read()是保存linux命令的執行結果,但是末尾有個\n,通過字符串的strip()方法,將\n過濾掉。

③commands(python2中有一個模塊,在python3中沒有這種模塊)

在ubuntu14.04中中驗證如下:

以元組的形式保存,保存結果為(status,result)。

流程控制(if else)

#!/usr/bin/env python
# _*_ coding:utf8 _*_
#author:snate
cnt=0;
alex_age=50
while cnt<3:
   guess_age =int(input("請輸入您猜測的年齡:"))
   if alex_age==guess_age:
      print("You are lucky,you got it");
      break
   elif alex_age>guess_age:
      print("Think bigger");
   else:
      print("think smaller");
   cnt += 1
else:
   print("Your input number is too much,fuck off!")

還有break,continue的用法,其中break是結束循環,continue是結束本次循環。無限循環,使用 while true:使用break可以跳出循環。

 #!/usr/bin/env python
# _*_ coding:utf8 _*_
#author:snate
cnt=0;
alex_age=50
while cnt<3:
   guess_age =int(input("請輸入您猜測的年齡:"))
   if alex_age==guess_age:
      print("You are lucky,you got it");
      break
   elif alex_age>guess_age:
      print("Think bigger");
   else:
      print("think smaller");
   cnt += 1
   if cnt==3:
      continue_flag = input("do you want continue?(yes or no)")
      if continue_flag !="n":
         cnt=0
      else:
         print("提出系統!\n")
         break

當用戶的次數超過三次時,提示是否還要繼續?輸入為N,或者為n就退出系統,否則繼續。

for 循環:

#!/usr/bin/env python
# _*_ coding:utf8 _*_
#author:snate
for i in range(0,10,3):
   print("loop",i)
   if i>=6:
      break

range(0,10,3)表示從0.10 步符是3.

數據類型的分類

運算符

①算數運算

②邏輯運算

③比較運算

④賦值運算

⑤成員運算

⑥位運算

作業1:

用戶登錄接口

#!/usr/bin/env python
# _*_ coding:utf8 _*_
#author:snate
import sys

user_lock_file="user_lock.txt"  # 用戶所鎖文件
user_file="user.txt"  # 用戶文件
retry_limit = 3  # 輸入的限制次數,若超過此次數,就將用戶鎖定
retry_count = 0   # 用戶輸入次數的計數器

while retry_limit >retry_count:
    user_name=input("\033[31m請輸入用戶名:\033[0m")
    # 開始檢測輸入的用戶名是否被鎖
    lock_check = open(user_lock_file)  # 當輸入用戶名之后,打開鎖文件判斷用戶是否以被鎖。
    #print("nihao")
    for line in lock_check.readlines():  # 循環鎖文件,判斷用戶是否被鎖
        #print("nihao")
        if user_name in line:
            sys.exit("\033[31m %s is locked!\033[0m" %user_name)
    user_password=input("\033[31m請輸入密碼:\033[0m")
    # 當用戶不在鎖文件中,輸入密碼,開始檢測用戶名和密碼
    flag = False  # 用來記錄是否用戶名和密碼是否匹配成功
    user_check = open(user_file,"rb")
    for line in user_check.readlines():
        # print (type(line))
        user, password = str(line).strip("b'").strip("\\r\\n'").split(" ");  # 問題出在這里,晚上回去問助教
        # print(user,password)
        if user_name == user and user_password == password:
            flag = True
            break
        else:
            flag = False
    user_check.close()
    if flag:
        print("Welcome to Oldboy IT System!I wait you too long!")
        break
    else:
        print("User not matched!")
        retry_count += 1
else:
    print("您輸入用的次數已到,用戶已被鎖!")
    add_lock=open(user_lock_file,"w")
    add_lock.write(user_name)  # 當用戶的輸入次數大於規定的次數后,用戶被添加到鎖文件中
    add_lock.close()

流程圖:

Readme:

用戶登錄接口程序 
 作者介紹: 
  name:angle
 nickName:snate 
 blogaddreess:http://192.168.1.1/csdn.log/ 
 
 功能介紹: 
  根據輸入的用戶名,首先判斷用戶是否在鎖文件中。 
 不在鎖文件中,輸入用戶的密碼,判斷密碼是否匹配,若匹配,進入系統登錄成功界面; 若不匹配次數超過限定的輸入次數,就將用戶寫入到鎖文件中。 
 
 環境依賴: 
  python3.* 
 ngetpass 
 sys 
 
 目錄結構: 
 User_login
├── __init__.py
├── README.md
├── user_lock.txt#鎖用戶文件
├── user.txt #用戶文件
├── test_user_login.py#用戶登錄測試程序
 
 運行說明: 
  將程序拷貝到安裝好python3.*的環境中,執行python test_user_login運行即可。 
 
 

三級菜單:

#!/usr/bin/env python
# _*_ coding:utf8 _*_
#author:GXW
import sys
# 用戶打印一級菜單
def menu():
    print("----------------------一級菜單-------------------")
    for index, key in enumerate(province_dic.keys(), 1):
        print(index, key)
        dic_key[str(index)] = key
    choose1 = input("請選擇一級菜單!輸入q時,退出系統,輸出b時,返回上一級目錄")
    if choose1 == 'q':
        quit()
    elif choose1 == 'b':
        print("目錄為一級目錄,不能跳轉,請重新選擇")
        return
    elif dic_key.get(choose1, 0):
        menu2(dic_key[choose1])
    else:
        print("您的輸入有誤,請重新輸入")

# 用戶打印二級菜單
def menu2(choose1):
    print("----------------------二級菜單---------------------------")
    for index, key in enumerate(province_dic[choose1].keys(), 1):
        print(index,key)
        dic_key[str(index)] = key
    choose2 = input("請選擇二級菜單!輸入q時,退出系統,輸出b時,返回上一級目錄")
    if choose2 == 'q':
        quit()
    elif choose2 == 'b':
        menu()
    elif dic_key.get(choose2, 0):
        menu3(choose1, dic_key[choose2])
    else:
        print("您輸入有誤,請重新輸入")
def menu3(choose1, choose2):
    print("-----------三級菜單---------------------------------------")
    for index, key in enumerate(province_dic[choose1][choose2], 1):
        print(index,key)
        dic_key[str(index)] = key
    choose3 = input("請選擇三級菜單!輸入q,退出系統,輸入b,返回b時,返回上一級目錄")
    if choose3 == 'q':
        print("")
        quit()
    elif choose3 == 'b':
            menu2(choose1)
    else:
        print("您輸入有誤,請重新輸入")

province_dic = {
    "山東省":{
        "濱州市":{"惠民縣","沾化縣","無棣縣","鄒平縣","陽信縣"},
        "濟南市":{"濟陽縣","商河縣","平陰縣","歷下區","天橋區"},
        "菏澤市":{"定陶縣","單縣","巨野縣","東明縣","開發區"},
        "德州市":{"德城區","夏新縣","平原縣","陵縣","樂陵縣"}
    },
    "北京市":{
        "海淀區":{"航天科工","航天科技"},
        "朝陽區":{"巨人教育","老男孩教育"},
        "豐台區":{"下埔","岳各庄"}
    },
    "湖北省":{
        "武漢市":{"武昌區","江漢區","洪山區"},
        "荊州市":{"青山區","硚口區","江夏區"},
        "襄樊市":{"新洲區","南山區","北山區"}
    }
}
if __name__ == '__main__':
    dic_key = {}
    menu()

流程圖:

Readme:

這是一個全國的三級菜單(省/直轄市、市、縣/區)程序
個人介紹
name:angle
nickName:snate
blog_addr:http://192.168.0.2/csdn.blog
功能介紹
根據三級列表,查詢各個省有哪些城市。例如:北京市:分為:海淀區、豐台區、 朝陽區、石景山區等。
環境依賴
python3.*
window/linux os
目錄結構:
three_level_menu
├── __init__.py
├── README.md
├── provice_city_county.py#用戶登錄測試程序
      ├── menu#打印一級菜單
      ├── menu2#打印二級菜單
      ├── menu3#打印一級菜單
運行說明
將文件拷貝到安裝好python3.*的系統環境中,執行python provicecitycounty.py即可。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM