一、基礎
1.對象
Python將程序中的任何內容統稱為對象(OBJECT)。即Python是強(Strongly)面向對象答案,因為一切都是對象,包括數字,字符串和函數。
2.變量
變量只需被賦予某一值。不需要聲明或定義數據類型。
3.邏輯行與物理行
物理行是程序員所看到的代碼;邏輯行是Python看到的單個語句。Python會假定每一個物理行會對於對應一個邏輯行。
!!!Python鼓勵每一行使用一句獨立語句從而使得代碼更加可讀。(可以使用分號“;”在一行物理行中制定多行邏輯行。)
最好最好每一物理行值寫入一行邏輯行。
(顯式連接行)可以使用“\”將一行物理行分成多行。
4. 縮進
空白區在各行德開頭非常重要
在邏輯行德開頭留下空白區(使用空或制表符)用以確定各邏輯行的縮進級別,而後者又用用於確定語句的分組。放在一起的語句必須擁有相同的縮進。每一組這樣的語句被稱為塊。
錯誤的縮進可能會導致錯誤。
!!!使用4個空格來縮進。(來自Python官方的建議)
Python將始終對塊使用縮進,并且絕不會使用大括號。
5. 運算符与表達式
表達式可以拆分成運算符(Operators)与操作數(Operands).
“+”為兩個“對象”相加
“-”為兩個“數”相減,若第一個數不存在,則假定為0
“*”給出兩個數的乘積,或返回字符串重複指定次數後的結果。(‘la’*3 輸出‘lalala’)
“**”乘方,返回x的y次方(3**4輸出81)
“//”整除,x除於y並對結果向下取整至最接近的整數
“%”取餘數
“<<”左移,將數字的位向左移動指定的位數。(每個數字在內存中以2進制表示)
“>>”右移
“&”按位与
“|”按位或
“^”按位異或
“~”按位取反
“<”小於
“<=”小於等於
“!=”不等於
“not”布爾“非”,eg,如果x是True,則返回False
“and”布爾“与”,短路計算(如果x=False,則不管y是什麼值,都只會返回False)
“or”布爾“或”
6. 數值運算与賦值的快捷方式
變量=變量+運算+表達式 to 變量+運算=表達式
7. 計算命令
計算優先級(低->高):
1.lambda:Lambda表達式
2.if-else:條件表示式
3.or
4. and
5. not x
6. in,not in ,is,is not,<,<=,>=,!=,==:比較,包括成員比較(Membership tests)和身份測試(Identity Tests).
7. |
8. ^
9. &
10. <<,>>
11. +,-
12. *,/,//,%
13. **
14. x[index],x[index:index],x(arguments...),x.attribute
15. (expressions...),[expressions...],{key;value...},{expressions...}:顯示綁定或數組、顯示列表、顯示字典、顯示設置
8. 改變運算順序
需要改變運算順序時,可以依靠添加括號。使用括號也可以讓表達式更加易讀。
9. 關聯性
運算符號通常由左至右相互關聯。
三、控制流
Python中有三種控制流語句:if,for,while
1. if語句
if ****:
-----
-----
elif *******:
-----
-------
else:
---------
2. while 語句
可以在while循環種使用else從句
3. for循環
for i in range(1,5):
print(i)
else:
print('The for loop is over')
輸出:
1
2
3
4
The for loop is over
在循環中可以使用else
4. break 語句
break語句用中斷break循環語句,也就是種植循環語句的執行,即使循環條件沒有變更位False,或隊列中的項目尚未完全迭代依據如此。
5. continue語句
continue語句用於告訴Python跳過當前循環塊中的剩餘語句,並繼續該循環的下一次迭代。
continue語句能用於for循環。
四、函數
函數(Functions)是指可重複使用的程序片斷。調用(calling).
函數可以通過關鍵字def來定義。這一關鍵字後跟著一個函數的標識符名稱,再跟一對圓括號,其中可以包括一些變量答案名稱,再以冒號結尾,結束這一行。隨後而來的語句塊是函數的一部分。
1. ?語:在定義函數時給定的名稱稱作“形參(Parameters)”,在調用函數時所提供給函數的值稱為“實參(Arguments)”。
2. 局部變量
在一個函數的定義中聲明變量時,它們不會以任何方式与身處函數之外但具有相同名稱的變量產生關係,即這些變量名之存在於函數這一局部(Local).這稱為變量的作用域(Scope),所有變量的作用域是它們被定義答案塊,從定義它們的名字的定義點開始。
3. global語句
在不使用global語句的情況下,不可能為一個定義於函數之外的變量賦值。
4. 默認參數
設置默認可以在用戶沒有提供參數值的情況下使用默認參數,當用戶提供了參數值時,則使用參數值。
注意:只有那些位於參數列表末尾的參數 才能被賦予默認參數,意即在函數的參數列表中擁有默認參數值的參數不能位於沒有默認參數值的參數之前。這是因為值是按參數所處的位置依次分配的.eg,def func(a,b,5)是有效的,但def func(a=5,b)是無效的。
5.關鍵字參數
如果你有一些具有許多參數的函數,而你又希望只對其中的一些進行指定,那麼可以通過命名它們來給這些參數賦值--浙江是關鍵字參數(Keyword Arguments)--我們使用命名(關鍵字)而非位置來指定函數中的參數。
優點:1,不再需要考慮參數的順序,函數的使用將更加容易;2,可以只對那些我們希望賦予的參數以賦值,只要其他的參數都具有默認參數。
6. 可變參數
使用參數實現
當聲明一個諸如 *Param的星號參數時,從此處開始直到結束的所有位置參數(Positional Arguments)都將被收集並匯集乘一個稱為“param”的元組(Tuple)。
類似地,當聲明一個諸如**param的雙星號參數時,從此處開始直至結束的所有關鍵字參數都將被收集並匯集成一個名為param的字典(Dictionary)。
7. return語句
return語句用於從函數中返回,也就是中斷函數。也可以選擇在中斷函數時從函數中返回一個值。
如果return語句沒有搭配任何一個值代表這返回None.None在Python中時一個特殊的類型,代表這虛無。
每一個函數都在其末尾隱含喇叭一句return None,除非你寫了自己的return語句。
Python中的pass語句用於指示一個沒有內容的語句塊。
提示:已有一個名為max的內置函數。
8. DocStrings
Python有一個功能:文檔字符串(Documentation Strings),在稱呼它時常稱為docstrings.這是一個重要的功能。
?文?字符串所?定的是一串多行字符串,其中第一行以某一大?字母?始,以句??束。
第二行?空行,后跟的第三行?始是任何??的解??明。在此?烈建?你在有?你所有非凡功能的文?字符串中都遵循?一?定。
我?可以通?使用函?的 __doc__ (注意其中的?下划?)?性(?于函?的名?)??取
函? print_max 的文?字符串?性。
?你??的所有不平凡的函?配以文?字符串。
五、模塊
如果向在所編寫的別的程序中重用一些函數的話,該怎麼辦?
答案是:使用模塊
編寫模塊最簡單的方法:創建一個包含函數与變量、以.py為後綴的文件。
另一個方法是使用撰寫Python解析器本身的本地語言來編寫模塊。
?你??的所有不平凡的函?配以文?字符串。
初始化工作只需在我們第一次導入模塊時完成。
sys.argv ?量是一系列字符串的列表(List)。
運行的腳本名稱在sys.argv的列表中總會位列第一。
sys.path內包括了包含導入模塊的字典名稱列表。目錄也是sys.path的以部分,它与pythonpath環境變量等同。這意味著你可以直接導入位於當前目錄的模塊。
要注意的是當前目錄指的是程序啟動的目錄。
六、 數據結構
四種內置的數據結構--列表(List)、元組(Tuple)、字典(Dictionary)、集合(Set).
1. 列表
列表是一種用於保存一系列有序項目的集合,也就是說,可以利用列表保存一串項目的序列。逗號隔開每個元素。
項目的列表用方括號括起來,用於指定一張列表。列表是一種可變的(Mutable)數據類型,即這種類型是可以被改變的。
列表 是使用對象与類的實例。一個類也可以帶有方法(Method),也就是說對這個類定義僅對於它啟用某個函數。
一個類可以具有字段(Field),它只是為該定義且只為該類所用的變量。
列表是可變的(Mutable)而字符是不可變的(Immutable)。
del語句可以從列表中移除對應的項目。
2.元組
元組用於將多個對象保存在一起。
元組的一大特徵類似于字符串,它們是不可變的,即不能編輯或更改元組。
元組是通過特別指定項目來定義的,在指定項目時,可以給它們加上括號,並在括號內部用逗號進行分隔。
元組通常用於保證某一語句或某一用戶定義的函數可以安全地採用一組數值,即元組內的數值不會改變。
eg,zoo=('python','elephant','penguin')
一個元組可以被當成元組中的一個成員被賦予給另一個元組。需要調用該元組時可以使用2維數組調用其中的元素。
元組同時也是一個序列,其中的元素是有序的。
使用方括號的形式被稱作索引(Indexing)運算符。
!:一個只擁有一個項目的元組的指定方式為在唯一的項目後面加上一個逗號來指定它,讓Python才可以識別在這個表達式想表達的是一個元組還是只是一個被括號所環繞的對象,eg,singleton=(2,).
3.字典
鍵值(Keys)与值(values)聯立在一起。鍵值必須是唯一的。
注意:只能使用簿可變的對象(如字符串)作為字典的鍵值,但是可以使用可變或簿可變的對象 作為字典中的值。(只能使用簡單對象作為鍵值)
在字典中,可以通過使用符號d={key:values1,keys2:values2}類似的形式,來成對地指定鍵值与值。
字典中的承兌的鍵值-值不會以任何方式進行排序。
字典屬於dict類下的實例或對象。
eg,ab={'xiaoming':'boy','xiaohong':'gril'}
print(ab['xiaoming'])
eg,刪除一對鍵值-值配對:del ab['Spammer']
鍵值在調用時稱為"name",值稱為"address",eg, for name,address in ab,items print(format(name,address))
添加一對鍵值-值配對:eg,ab['zhangsan']='aaaaaaaaaaaaaa'
如果曾在函數中使用過關鍵詞參數 ,就可以使用字典。在定義函數時的參數列表時,就指定了相關的鍵值配對。當在函數中訪問某一變量時,其實就時在訪問字典中的某個鍵值。在編輯器設計的術語中,叫作符號表(Symbol Table)。
4.序列
列表、元組和字符串可以看作序列的表現形式。
序列的主要功能時測試資格(Membership Test)(也就是in与not in 表達式)和索引操作(Indexing Operations),它們能偶允許我們直接獲取序列中的特定項目。
上面提到的序列的三種形態--列表、元組与字符串,同樣擁有一種切片(Slicing)運算符,它能偶允許我們序列中的某段切片--也就是序列中的一部分。
a:b,從a<=x
索引操作可以使用負數,在這種情況下,位置計數將從隊列的末尾開始。eg,shoplist[-1]指的是項目的最後一個項目。
通過指定序列名稱來進行序列操作,在指定時序列名稱後面可以跟一對數字--這是可選的操作,這一對數字使用方括號括起,並使用冒號分隔。
序列切片包括起始位置,但不包括結束位置。
切片操作中提供第三個參數,這個參數表示切片步長。
5.集合
集合(Set)是簡單對象的無序集合(Collection).當集合中的項目存在與否比起次序或其出現次數更加重要時候,我們就會使用集合。
通過使用集合,可以測試某些對象的資格或情況,檢查它們是否是其他集合的子集,找到兩個集合的交集,等等。
eg,
>>>bri=set(['brazil','russia','india'])
>>>'india' in bri
運行結果:Ture
6. 引用
當創建一個對象並將其分配給某個變量時,變量只會查閱(Refer)某個對象,并且它也不會代表對象本身。即變量名只是指向你計算機內存中存儲了相應對象的那一部分。這叫做將名稱綁定(Binding)給那一個對象。
所有字符串都是str類下的對象。
startwith方法用於查找字符串是否以給定的字符串內容開頭。
eg,name.startswith('swa')
in運算符:檢查給定的字符串是否是查詢的字符串中的一部分。
eg,'a' in name
find方法用於定位字符串中給定的子字符串的位置。
eg,name.find('aaa')
str類同樣還擁有一個簡潔的方法用於聯結(Join)序列中的項目,其中字符串將會作為每一項目之間的分隔符,並以此生成並返回一串更大的字符串。
eg,delimiter='_*_'
mylist=['a','b','c']
print(delimiter.join(mylist))
輸出:
a_*_b_*_c
六、解決方案
實現(Implementation)
eg,
#創建一款能為我所有重要的文件創建備份的程序。
import os
import time
#1. 需要備份的文件与目錄將被
#指定在一個列表中。
#如在Linux中
source=['/Users/swa/notes']
#2.備份文件必須存儲在一個主備份目錄中
#在Linux下:
target_dir='User/swa/backup'
#3.備份文件將打包成zip文件
#4.zip壓縮文件名遊蕩前日期与時間構成
target=target_dir+os.sep+\
time.strftime('%Y%m%d%H%M%S')+'.zip'
#如果目標目錄還不存在,則進行創建
if not os.path.exists(target_dir):
os.mkdir(target_die) #創建目錄
#5.使用zip命令將文件打包成zip格式
zip_command='zip-r{0}{1}'.format(target,''.join(source))
#運行備份
print('Zip command is :')
print(zip_command)
print('Running')
if os.system(zip_command)==0:
print('Successful backuo to',target)
else:
print('Backup Failed')
輸出:
Zip command is :
zip -r /User/swa/backup/201442819899.zip /Users/swa/notes
Running:
adding:User/swa/notes/b1ah1.txt(stored 0%)
adding:User/swa/notes/blah2(stored 0%)
adding:User/swa/notes/blah3.txt(stored 0%)
Successful backup to /users/swa/backup/201442819899.zip
當前日期与時間:time.strftime()函數
os.sep變量:根據操作系統給處相應的分隔符,在Linux与Unix是'/',在windows是'\\',在mac os 是':'.這非直接使程序變得可移植,從而能在上述系統中正常工作。
Bug Fixing(錯誤修復)
七、軟件開發流程
一款軟件中的各個階段(Phases):
1.What/做什麼(分析)
2.How/怎麼做(設計)
3.Do it/開始做(執行)
4.Test/測試(測試与修復錯誤)
5.Use/使用(操作或開發)
6.Maintain/維護(改進)
要記住:
程序是成長起來的,不是搭建起來的。(Software is growm,not built.) ---Bill de hora
八、面向對象編程
譯:面向過程(Procedure-oriented)
類与對象是面向對象編程的兩個主要方面。一個類(Class)能夠創建一種新的類型(Type),其中對象(Object)就是類的實例(Instance)。屬於某個對象或類的變量被稱作字段(FIELD)。對象 還可以通過使用屬於類的函數來擁有某些功能。這些函數被稱作類的方法(Method). 字段与方法都可以看作其所屬的類的屬性(Attribute).
字段有兩種類型--它們屬於某一類的各個實例或對象,或是從屬於某一類本身。它們被分別稱作實例變量(Instance Cariables)与類變量(Class Variables).
self-=this(C#)
類
九、方法
-v選項來指定程序的顯示信息的詳盡程度
-q選項使程序能靜默(Quiet)運行
1.__init__方法
__init__方法會在類的對象被實例化(Instantiated)時立即運行。這一方法可以對任何你想進行操作的目標對象進行初始化(Intialization)操作。注意在init的前後加上雙下劃線。
在Python類下創建新的實例p時,採用的方法時先寫下類的名稱,後跟括在括號中的參數,形如:P=Person('Wwaroop').
我們不會顯示地調用__init__方法。
2.類變量与對象變量
類變量(Class variable)是共享的(Shared),它們可以被屬於該類的所有實例訪問。該變量只擁有一個副本,當任何一個對象對類變量作出改變時,發生的變動將在其它所有實例中都會得到體現。
對象變量(Object variable)由類的每一個獨立的對象或實例所擁有。在這種情況下,每個對象 都擁有屬於它自己的字段的副本,也就是說,它們不會被共享,也不會以任何方式与其它不同實例中的相同名稱的字段產生關聯。
所有的類成員都是公開的,但是由一個例外,如果你使用數據成員並在其名字中使用雙下劃線作為前綴,形成諸如__privatervar這樣的形式,Python會使用名稱調整(Name-mangling)來使其有效成為一個私有變量。
需要遵循的約定:任何在類或對象之中使用的對象其命名應以下劃線開頭,其它所有非此格式的名稱都將是公開的,並可以為其它任何類或對象所使用。
3. 繼承
多態性:在任何情況下,如果父類希望,子類型都可以被替換,也就是說可以被看作父類的實例。
基類(Base Class),超類(Superclass),其子類被稱為派生類(Derived Classes)或子類。
eg,class son(father):
如果繼承元組(Inheritance Tuple)中有超過一個類,這種情況九會被稱作多重繼承(Multiple Inheritance).
end 參數用在超類的tell()方法的Print函數中,目的是打印一行並允許下一次打印在同一行繼續。
九、輸入与輸出
(1)輸入函數Input()
(2)打印函數print
(3)rjust方法:獲取一個右對齊到指定寬度的字符串。
1.文件
通過創建一個屬於file類的對象並適當使用它的read、readline、write方法來打開或使用文件,並對它們進行讀取或寫入。讀寫或寫入 文件的能力取決于你指定以何種當時打開文件。當完成了文件,可以調用close方法來告訴Python已經完成了對該文件的使用。
打開模式:閱讀模式('r'),寫入模式('w')、追加模式('a').
help(open)裡有關於文件操作的方法。
默認情況下open()將文件視為文本(TEXT)文件。
readline方法讀取文件的每一行。 這一方法將會一串完整的行,其中在行末尾還包括了換行符。當一個空字符串返回時,它表示我們已經到達了文件末尾。並通過break退出循環。
2.Pickle
Pickle標準模塊,通過它可以將任何純Python對象存儲到一個文件中,並在稍候將其取回。這叫做持久地(Persistently)存儲對象。
3.Unicode
使用非英文字符。當希望与互聯網上答案計算機通信時,我們需要將我們的Unicode字符串轉換至一個能夠被發送和接受的格式,這個格式叫做"UTF-8",'encoding="utf-8".
異常(Exception)
處理異常:通過使用try...except處理,將一般的語句放在try代碼塊中,將錯誤處理器代碼放置在except代碼塊中。
try...finally:測試文件使用後是否被關閉,如果沒有則關閉。
sys.stout.flush():使內容 能被立即打印到屏幕上。
with語句:eg,with open("aaa.txt") as f:
for line if f:
print(line,end='')
with語句使用協議(Protocol),它會獲取由open語句返回的對象,它總會在代碼塊開始之前九調用thefile.__enter__函數,并且總會在代碼塊執行完畢後調用thefile.__exit__關閉文件。
Python標準庫(Python Standrad Libary)。熟悉Python標準庫非常重要,因為只要熟知了這些庫可以做到什麼事,許多問題都能夠被輕易解決。
sys模塊包括了一些針對特定系統的功能。
日誌摸塊(logging模塊):將一些調試(Debugging)信息与一些重要的信息存儲在某個地方。
os模塊用以和操作系統交互,platform模塊用以獲取平台-操作系統的信息,logging模塊用來 記錄log信息。
傳遞元組
在Python中交換兩個變量的最快方法是:
>>>a=5;b=8
>>>a,b=b,a
輸出:(8,5)
使用x[key]索引操作時會調用 __getitem__特殊方法。
單語句塊:單個語句是在原地立即使用,白皚皚會被看作一個單獨的塊。除非是為了檢查錯誤,強烈建議避免使用這種快捷方法,因為很由可能因為添加了縮進而導致錯誤。
Lambda語句可以創建一個新的函數對象。本質上,lambda需要一個參數,後跟一個表達式 作為函數体,這一表達式執行的值將作為這個新函數的返回值。
列表推導(list Comprehension)用於從一份現有的列表中得到一份新列表。
eg,listtwo=[2*i for i in listone if i>2)
使用列表推導的優點:黨我們使用循環來處理列表中的每個元素并將其存儲到新的列表中時,它能減少樣板(Boilerplate)代碼的數量。
在函數中接受元組与字典
分別使用*或**作為元組或字典的前綴,來使它們作為一個參數為函數所接收。當一個函數需要一個可變數量的實參時,這很有用。
assert語句
assert語句用於斷言(Assert)某事是真的,如果不是真的,就拋出一個錯誤,當語句斷言失敗時,將會拋出AssertionError.
Python List pop()方法 Python 列表 描述 pop() 函?用于移除列表中的一?元素(默?最后一?元素),并且返回?元素的值。
??器(Decorators)是?用包?函?的快捷方式。?有助于?某一功能与一些代?一遍又一
遍地“包?”。??例子,我?自己?建了一? retry ??器,??我可以?其?用到任何函
?之中,如果在一次?行中?出了任何??,它就???重新?行,直到最大次? 5 次,并
且每次?行期?都?有一定的延?。??于你在?一台?程?算机?行网??用的情?十分
有用.