在計算機程序的開發過程當中,隨着程序代碼越寫越多,在一個文件裏代碼就會愈來愈長,愈來愈不容易維護。python
爲了編寫可維護的代碼,使用者能夠把不少函數分組,分別放到不一樣的文件裏,這樣一來每一個文件包含的代碼就相對較少,不少編程語言都採用這種組織代碼的方式。在Python中,一個.py文件就稱之爲一個模塊(Module)。編程
Python的強大之處在於有豐富的實現各類功能的標準庫和第三方庫,另外還容許用戶本身創建庫文件。經常使用的標準庫有sys、os、glob、socket、threading、thread、queue、time、timeit、subprocess、multiprocessing、signal、select、shutil、functools、itertools、request、collections等。小程序
在Python的默認的安裝包中,僅包含部分基礎的或者核心的模塊,Python在啓動時也僅加載了基本模塊,在須要的時候纔會顯式的加載其餘模塊,這樣能夠減少程序運行的壓力。內置對象能夠直接使用,而擴展庫須要在正確導入以後才能使用其中的對象和方法。在Python中,導入模塊的方法有兩種。dom
這種方法在導入完成後,須要在之後的使用時在對象以前加上模塊名做爲前綴,也就是必須以「模塊名.對象名」這種方式來進行訪問。也能夠爲導入的模塊設置一個別名,而後就可使用「別名.對象名」的方式來對其中的對象進行調用了。此指令的使用方式以下:socket
>>> import random編程語言
>>> Kee = random.random() #將[0,1)內的隨機小數賦值給Kee函數
>>> import numpy as npoop
>>> kee = np.array((1,2,3)) #將[1 2 3]賦值給kee學習
使用這種方式僅導入明確指定的對象,而且能夠爲導入的對象起別名。這種導入方式能夠減小查詢次數,提升訪問速度,同時減小編程人員須要輸入的代碼量,而不須要使用模塊名做爲前綴,它的使用方法以下:測試
>>> from math import sin as f #調用math模塊中的求正弦函數sin並起別名爲f
>>> Kee = f(3) #將3的正弦值求出後賦值給Kee
當須要導入模塊中的全部對象時,指令以下:
>>> from math import * #一次性調用math模塊中的全部函數
>>> Kee = sin(3) #將3的正弦值求出後賦值給Kee
>>> kee = gcd(36,18) #求得36和18的最大公約數後賦值給kee
內置模塊__builtins__包含了Python的所有內置類和內置函數,不須要導入就能夠直接使用。
絕對值:abs(-1)
最大最小值:max([1,2,3])、min([1,2,3])
序列長度:len('abc')、len([1,2,3])、len((1,2,3))
取模:divmod(5,2) #(2,1)
浮點數:round(80.23456,2) #80.23,返回此浮點數的四捨五入的值
乘方:pow(2,3) #,得結果爲8
l 函數是否可調用:callable(funcname)
l 類型判斷:isinstance(x,list/int)
l 轉換爲整型:int(x)
l 轉換爲長整型:long(x)
l 轉換爲浮點型:float(x)
l 轉換爲複數形式:complex(x)
l 轉換爲字符型:str(x)
l 轉換爲列表:list(x)
l 轉換爲元組:tuple(x)
l 返回表示十六進制數值的字符串:hex(x)
l 返回一個表示八進制數值的字符串:oct(x)
l 返回以數值表達式值爲編碼的字符:chr(x)
l 以一個字符做爲參數,返回對應的ASCⅡ數值或者Unicode數值:ord(x)
time模塊是一個用於處理時間和轉換時間格式的模塊,其中經常使用的函數有time()、localtime()、sleep()、strftime()、strptime()。
time()函數用於返回當前時間的時間戳(北京時間1970年01月01日08時00分00秒到如今的浮點秒數)。time()函數的語法以下:
time.time()
localtime()函數的做用是格式化時間戳爲本地時間。若是secs參數未輸入,就以當前時間爲轉換標準。localtime()函數的語法以下:
time.localtime([secs])
sleep()函數用於推遲調用線程的運行,可經過參數secs指定線程掛起的時間。指令以下:
time.sleep(secs)
strftime()函數用於接收時間元組,並返回以可讀字符串表示的當地時間,格式由參數format決定。strfttime()函數的語法以下:
time.strftime(format[,t])
strptime()函數用於根據指定的格式把一個時間字符串解析爲時間元組。語法以下:
time.strptime(string[,format])
datetime模塊是date與time的結合體,它涵蓋了date與time的全部信息,而且它的功能強大,支持0001年到9999年。
datetime定義了兩個常量:datetime.MINYEAR和datetime.MAXYEAR。最小年份MINYEAR=1,最大年份MAXYEAR=9999。
datetime模塊定義瞭如下5個類。
datetime.date:表示日期的類。經常使用的屬性有year、month、day。
datetime.time:表示時間的類。經常使用的屬性有hour、minute、second、microsecond。
datetime.datetime:表示日期時間。
datetime.timedelta:表示時間間隔,即兩個時間點之間的長度。
datetime.tzinfo:與時區有關的相關信息。
其中,datetime.datetime類的應用最爲廣泛。下面對該類中的today()、now()兩個函數進行一些詳細講解。
today()函數用於返回一個表示當前時間的datetime對象。它的語法以下:
datetime.datetime.today()
該方法的使用示例以下:
>>> import datetime
>>> print(「Today is 」,datetime.datetime.today())
Today is 2018-5-3 10:24:25.9000990
now()方法用於返回一個表示當前日期時間的datetime對象。它的語法以下:
datetime.datetime.now([tz])
它的使用示例以下:
>>> import datetime
>>> print(‘Now is ’,datetime.datetime.now())
Now is 2018-5-3 10:29:55.634641
random函數存在於Python標準庫中,它能夠生成隨機浮點數、整數、字符串,甚至幫助你隨機選擇列表序列中的一個元素,打亂一組數據等。在Python3的random模塊中,經常使用的函數主要有random()、randint()、randrange()、choice()、shuffle()、sample()。
random()函數是這個模塊中最經常使用的方法了,它會生成一個隨機浮點數,範圍是在0.0~1.0之間。它的語法以下:
random.random()
randint(a, b),用於返回一個指定範圍內的隨機整數。其中參數a是下限,參數b是上限,生成的隨機數n: a <= n <= b。它的語法格式下:
random.randint(a,b)
randrange()函數的功能是從指定範圍內返回一個隨機數。它的語法命令以下:
random.randrange([start],[stop],[step])
choice()函數的功能爲從一個有序序列中隨機獲取一個元素,其中,這個有序序列不是一種特定的類型,而是泛指一系列的類型,列表,元組,字符串,數值等都被包括在內。它的語法命令以下:
random.choice(一個有序序列)
shuffle()函數的功能爲將一個列表中的元素隨機打亂,shuffle()函數的語法命令以下:
首先設定一個列表Kee
random.shuffle(p)
sample()函數的功能爲從指定序列中隨機獲取指定長度的片斷,可是在使用這個函數的同時,並不會影響到原有序列的序列。當用此函數對序列進行取片斷操做時,若是設定的想要取得的片斷長度超出了此有序序列的總長度,系統就會報錯,因此使用者在進行取片斷操做時要額外注意設定的所取片斷的長度。此命令的語法命令以下:
random.sample(有序序列,想要取得的片斷的長度)
sys模塊包括了一組很是實用的服務,內含不少函數方法和變量,用來處理Python運行時配置以及資源,從而能夠與前當程序以外的系統環境交互,如:Python解釋器。sys模塊中的成員有:
argv被人用來獲取當前正在執行的命令行參數的參數列表,它很像一個從程序外部獲取參數的橋樑。由於從外部獲取的參數能夠是多個,因此得到的是一個列表,也所以能夠用[]的方式來提取其中的元素。當提取元素時,其第一個元素時腳本自己名稱,以後才依次是外部給予的參數。它的使用方法以下:
sys.argv[0] #當前程序名
sys.argv[1] #第一個參數
sys.argv[0] #第二個參數
sys.argv #腳本全部參數
這個函數的功能爲中途退出程序。當參數非零時,會引起一個systemexit異常,從而能夠在主程序中捕獲該異常。用法示例以下:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import sys
print('running...')
try: #捕獲異常,運行sys.exit(1),若是在try部分引起了異常則打印出語句。
sys.exit(1)
except SystemExit:
print('SystemExit exit 1')
print('exited')
運行結果以下:
running···
SystemExit exit 1
exited
sys.path是Python中的搜索模塊的路徑集,它是一個列表(list),初始化時使用PYTHONPATH環境變量的值。使用命令以下:
sys.path
executable是有關於Python解釋器的絕對路徑的,能夠利用這個函數來將Python解釋器的絕對路徑賦值給某個變量,它的使用語法以下:
sys.executable
每一個Python源代碼文件均可以看作是一個模塊。Python編譯器經過__name__屬性來識別使用者編寫的程序的使用方式,每一個腳本在運行時都有一個__name__屬性,當將腳本做爲模塊進行導入時,__name__屬性的值就會被自動設置爲模塊名;若是腳本獨立運行的話,__name__屬性的值就會被編譯器自動設定爲字符串__main__。
對於一個大型的多功能的程序,爲了防止代碼行過多而不方便管理,編程人員通常都會使用包來管理程序的多個功能模塊。包是Python用來組織命名空間和類的重要方式,能夠看作是包含大量Python程序模塊的文件夾。在包的每一個目錄中都必須包含一個__init__.py文件,來告訴系統當前文件夾是一個包。__init__.py文件的主要用途是設置__all__變量以及執行初始化包所襲要的代碼,其中__all__變量中定義的對象能夠在使用「from···import···」時所有被正確導入。例如,設定了一個包,包的結構以下:
Kee/
__init__.py
kee/
echo.py
echo1.py
echo2.py
此時就能夠在所編寫的程序中使用下面的代碼對echo模塊:
import Kee.kee.echo
而後使用完整的名字來訪問或者調用其中的成員,例如:
Kee.kee.echo.echofilter(input,output,delay=0.8,atten=5)
若是在__init__.py文件中存在着下面這行代碼:
__all__=[‘echo’,’echo1’,’echo2’]
那麼就可使用下面這種方式進行導入:
from Kee.kee import *
而後使用下面這種方式來調用其中的函數模塊:
echo.echofilter(input,output,delay=0.8,attention=5)
算數運算符一共有7種,分別是加(+)、減(-)、乘(*)、除(/)、地板除(//)、取餘(%)以及求冪值(**)運算,涉及到的知識點比較簡單,他們的使用方法以下(表中a,b爲假設的兩個數值類型操做對象),如表2.4算數運算符所示。
表2.4 算數運算符
符號 |
功能 |
a + b |
對a和b進行相加操做 |
a - b |
對a和b進行相減操做 |
a * b |
對a和b進行乘法操做 |
a / b |
對a和b進行a除b操做 |
a // b |
用a除b並返回計算完成後所得的商 |
a % b |
用a除b並返回計算完成後所得的餘數 |
a ** b |
返回a的b次冪 |
本節爲你們介紹比較運算類、賦值運算類和位運算類。本節用三張表格來學習下(表中a,b爲假設的兩個操做對象),如表2.5比較運算類,表2.6賦值運算類,表2.7位運算類所示。
表2.5 比較運算類
符號 |
功能 |
a == b |
比較a,b是否相等,相等返回True,不相等則返回False |
a != b |
比較a,b是否不等,相等返回False,不相等則返回True |
a > b |
比較a是否大於b,大於返回True,不大於則返回False |
a < b |
比較a是否小於b,小於返回True,不小於則返回False |
a >= b |
比較a是否大於等於b,成立返回True,不成立則返回False |
a <= b |
比較a是否小於等於b,成立返回True,不成立則返回False |
表2.6 賦值運算類
符號 |
功能 |
a = b |
簡單的賦值運算,將b的值賦給a |
a += b |
加法賦值運算,等效於a = a + b |
a -= b |
減法賦值運算,等效於a = a - b |
a *= b |
乘法賦值運算,等效於a = a * b |
a /= b |
除法賦值運算,等效於a = a / b |
a %= b |
取模賦值運算,等效於a = a % b |
a **= b |
求冪值賦值運算,等效於a = a ** b |
a //= b |
取整(地板除)除賦值運算,等效於a = a // b |
表2.7 位運算類
符號 |
功能 |
a & b |
按位與運算,若是a,b的相應位都爲1,則返回結果1,不然爲0 |
a | b |
按位或運算,若是a,b的相應位都爲0,則返回結果0,不然爲1 |
a ^ b |
按位異或運算,當a,b對應位的二進制數不一樣時,結果爲1,相同爲0 |
~a |
按位取反運算,對a的每一個二進制位上的1變爲0,0變爲1 |
a << b |
左移運算符,將a的每一個二進制位所有左移b個位置,高位丟棄,低位補0 |
a >> b |
右移運算符,將a的每一個二進制位所有右移b個位置 |
在Python中,集合是一個無序不重複元素集,基本功能包括關係測試和消除重複元素,關於集合set的運算,包括union(並|),intersection(交&),difference(差-),sysmmetric difference(對稱差分^)和判斷是否爲子集(<),超集(>)等。集合不支持索引、分片或其它類序列的操做。
關於集合的運算操做以下,以集合a([1,2,3])和集合b([3,4,5])爲例,如表2.8集合運算類所示。
表2.8 集合運算符
符號 |
功能 |
a | b |
對a和b取並集並返回一個新的集合[1,2,3,4,5] |
a & b |
對a和b取交集並返回一個新的集合[3] |
a - b |
將a中和b相同的元素去掉後造成一個新的集合並返回[1,2] |
a ^ b |
將a和b中不相同的元素取出組成一個新的集合並返回[1,2,4,5] |
a < b |
判斷a是不是b的子集,是返回True,不是返回False |
a > b |
判斷a是不是b的超集,是返回True,不是返回False |
邏輯運算僅支持布爾運算,它的使用方式如表2.9邏輯運算所示。
表2.9 邏輯運算
符號 |
功能 |
a and b |
布爾「與」,若a爲False,則返回False,不然返回b的值 |
a or b |
布爾「或」,若a非零,則返回a的值,不然返回b的值 |
not a |
布爾「非」,若a爲True,則返回False;若爲False,則返回True |
Python支持成員運算,此種運算方式僅會產生True和False兩種結果,設變量a=1,列表list=[1,2,3,4],它的使用方式如表2.10成員運算所示。
表2.10 成員運算
符號 |
功能 |
a in list |
若在指定的序列中找到值,則返回True,不然返回False |
a not in list |
若在指定的序列中未找到值,則返回True,不然返回False |
身份運算符用於比較兩個對象的存儲單元,設定a=1,b=1,它的使用方式如表2.11身份運算所示。
表2.11 身份運算
符號 |
功能 |
a is b |
判斷a和b是否引用自同一個對象,是返回1(True),不是則返回0(False) |
a is not b |
判斷a和b是否引用自同一個對象,不是返回1(True),是則返回0(False) |
運算符之間的執行時存在前後順序的,當一個表達式中出現多個操做符時,這些操做符的被執行順序就依賴於優先級規則了,Python遵照數學操做符的傳統規則。下表列出來了它們之間的優先被執行的等級。如表2.12運算符優先級所示。
表2.12 運算符優先級
符號 |
功能 |
** |
指數(最高優先級) |
~+ - |
按位翻轉,一元加號和減號(最後兩個的方法名爲+@和-@) |
*/%// |
乘、除、取模和地板除 |
+ - |
加法減法 |
>><< |
右移左移運算 |
& |
位‘and’ |
^| |
位運算符 |
<= < > >= |
比較運算符 |
<> == != |
等於運算符 |
= %= /= //= -= += *= **= |
賦值運算符 |
is is not |
身份運算符 |
in not in |
成員運算符 |
not or and |
邏輯運算符 |
選擇結構經過判斷某些特定條件是否知足來決定下一步的執行流程,是很是重要的控制結構。常見的選擇結構有單分支選擇結構、雙分支選擇結構、多分支選擇結構和嵌套的分支結構。形式比較靈活多變,具體使用哪種最終仍是取決於要實現的業務邏輯。循環結構和異常處理結構中也能夠帶有else子句,這也能夠看作是一種特殊形式的選擇結構。
當編寫某個大型程序時,每每會由於選擇了不一樣的路線,而獲得了不一樣的效果,而這不一樣路線所組成的結構,也是有必定區別的,在Python程序中,常見的選擇結構有單分支、雙分支、多分支和選擇結構的嵌套等。
單分支,是指若是if條件成立,則繼續執行知足條件的代碼,不成立則跳過if語句下的代碼,繼續執行其餘代碼塊。它的語法表達格式以下:
l if 表達式:
語句塊
雙分支,是指若是if條件成立,則執行知足條件的代碼,若是不成立,則跳轉到else,執行else下面的代碼。它的語法表達格式以下:
l if 表達式:
語句塊1
l else:
語句塊2
多分支,是指若是if條件成立,則執行知足條件的代碼,若是不成立,則跳轉到elif進行判斷,若elif條件成立,則執行elif條件下的代碼,在多分支結構中,能夠有多個elif條件語句的存在。若是全部的if條件語句和elif條件語句都不符合,則跳轉到else下的代碼執行。它的語法表達格式以下:
l if 表達式1:
語句塊1
l elif 表達式2:
語句塊2
l elif 表達式3:
語句塊3
·
·
·
l else:
語句塊n
選擇結構嵌套,是指在大選擇結構下,還在每一個分支下包含着小的選擇結構,知足條件跳轉到大選擇結構下的分支後,進入到另外一個選擇結構中進行更加詳細的條件判斷和篩選。使用嵌套選擇結構時,必定要嚴格控制好不一樣級別代碼塊的縮進量,由於這決定了不一樣代碼塊的從屬關係和業務邏輯是否能被正確地實現,以及代碼可否被Python正確的理解和執行。它的語法表達結構以下:
l if 表達式1:
語句塊1
if 表達式2:
語句塊2
else:
語句塊3
l else:
if 表達式4:
語句塊4
如下面的小程序爲例:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
name = input('請輸入用戶名:')
pwd = input('請輸入密碼:')
if name == "awei" and pwd == "abc123": #第一次判斷若是不知足條件,則跳 轉到elif語句進行下一步判斷
print("歡迎,awei!")
elif name == 「awei」 or pwd == 「abc123」: #第二次判斷,若是也不知足條件則跳轉到 else語句下的代碼進行執行輸出
print(」用戶名和密碼不符」)
else: #若是上兩步的條件都不知足,則直接跳轉 到此步下的語句執行
print("用戶名和密碼錯誤")
首先介紹第一種循環結構體while循環結構體。以一個小程序爲例:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
n = 1
while n<=100: #先判斷n是否小於等於100,若是是則執行下面的代碼, 不是則終止循環並輸出結果
print('當前數字是:',n)
n += 1
從上面的代碼能夠看出,while循環結構是要先進行條件語句判斷再決定是否要繼續執行循環操做的。在while循環結構中,判斷條件能夠是任何合法的表達式,任何非零的或者非空的值均爲True。通常在循環次數不肯定的狀況下使用while循環結構。
和while相同的是,for循環也是條件前置的循環結構,即它也是須要先進行條件判斷再確認是否能夠繼續執行循環結構中的代碼塊的。但不一樣的是for循環結構的書寫相對於while循環結構來講更加規範與規整,因此for循環結構通常被用於循環次數比較肯定的狀況中。尤爲適合被應用於枚舉和遍歷還有迭代對象元素中的場合。示例代碼以下:
>>> for i in range(10): #判斷i是否在1~10內,是則輸出i,不是則終止循環
print("loop:", i )
當選擇循環結構時,更推薦你們運用for循環結構來進行循環操做,由於相對於while循環結構來講,for循環結構體思路更加清晰,代碼邏輯出錯率也比while循環結構低,但並非說while循環結構就應該被摒棄,二者各有利弊,編譯人員在選擇時應結合當時的環境和狀況。
break和continue語句是兩個中斷指令語句,它們常常被應用於while循環和for循環體中,而且常與選擇結構結合使用。但這兩個指令不一樣的是,在循環結構中執行break語句後,進程會直接跳出整個循環結構,繼續執行循環結構之下的代碼塊。而在循環結構中執行continue指令後,並不會跳出整個循環結構體,而是終止了當前被執行的循環步驟並將全部此次循環中continue語句以後的代碼忽略掉,從新跳轉回了循環結構體的頂端,而後再提早進入到下一次執行。
須要注意的是,這兩個指令若是過多的話,會讓整個程序的結構的條理性顯得很是的混亂,下降程序的可讀性,因此建議你們在編程時,除非必要,不然不要輕易過多的使用這兩個指令。
雖然while和for爲循環結構體,可是這兩種循環結構體中仍有條件判斷的操做,因此在使用這兩個結構體時,能夠配合着else子句來使用,使用方式和if··else語句的使用方式相似,其語法結構以下。
while循環:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
n = 1
while n<=100: #先判斷n是否小於等於100,若是是則執行下面的代碼, 不是則終止循環並輸出結果
print('當前數字是:',n)
n += 1
else: #若是不知足n小於等於100,則跳入到此步中執行
print(‘程序結束。’)
for循環:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
for i in range(10): #判斷i是否在1~10內,是則輸出i,不是則終止循環
print("loop:", i )
else:
print(「程序結束」) #若i不在1~10內,則跳出循環體,執行此步以後的操做
在學習完選擇和循環結構後,能夠來玩個小遊戲放鬆下,同時也來鞏固下本章所學的知識點。
假設有一個數,若是想要肯定這個數是幾,猜謎者應該怎麼設定程序來求得這個數呢?
先來整理下猜數思路,當參與者提出一個數以後,會出現三種狀況:
(1)輸入的值大於出題者假定的值
(2)輸入的值正好等於出題者假定的值
(3)輸入的值小於出題者假定的值
若是是狀況(2),那麼很幸運,猜謎者能夠結束進程了,而若是是狀況(1)和(3),則須要猜謎者繼續輸入來猜想,直至猜出這個數爲止。
有了程序的大體思路,就能夠進行程序代碼的設計了。下面就爲你們提供一份基礎代碼以供參考。
在這段代碼中,一共有三個變量,一個變量用於記錄給定值(number,由系統從1~100中隨機擇定),一個變量用於記錄猜謎者輸入的值(number_input,由控制檯輸入),一個變量用於記錄猜謎者輸入了多少次(guess,每執行一次循環就進行一次自加操做)。
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import random
number = random.randint(1,100) #這裏使用了random隨機函數模塊來擇定須要 進行猜想的數值,範圍爲1~100。
guess = 0
while True:
number_input = int(input("請輸入一個1到100的數字:"))
guess += 1
if number_input == number:
print("恭喜您,您猜對了,您總共猜了 %d 次"%guess)
break
elif number_input < number:
print("您輸入的數字小了!")
else:
print("您輸入的數字大了!")