1、Python基本類型
1.1數值
解釋器的行爲就像是一個計算器。你可以向他輸入一個表達式,它會返回結果。
>>>2+2
4
等號(“=”)用於給變量賦值,被分配的值是隻讀的。
>>>width = 20
>>>height = 5*9
>>>width*height
900
同一個值可以同時賦給幾個變量:
>>>x=y=z=0
>>>x
0
1.2字符串
字符串用單引號或雙引號標識:
>>>'hello'
hello
>>>'"Yes",he said.'
"Yes",he said.
1.3None類型
None類型是一個特殊的類型,表示出錯。
邏輯表達式:Python中沒有Boolean類型,除了0以外,其他都是真。但是Python中‘假’有很多種,包括None,0,0.0,“”(空字符串),[](空list),()(空元組),{}(空字典)。
Python中的邏輯運算符有:and,or,not
1.4鏈表(列表list)
python中最通用的是鏈表,他寫爲中括號之間用逗號分隔的一列值(子項),鏈表的子項不一定是同一類型的值。
>>>a = ['me','she',100,200]
>>>a
['me','she',100,200]
0 1 -1 0
鏈表也以零開始,可以被切片、連接等等:
>>>a = ['me','she',100,200]
>>>a[0]
'me'
>>>a[3]
100
>>>a[-2]
100
>>>a[1:-1]
['she',100]
>>>a[:2]+['he',2*2]
['me','she','he',4]
1.5元組(Tuples)
一個元組由數個逗號分隔的值組成,元組在輸出時總是有括號的,以便於正確表達嵌套結構。在輸入時可能有或沒有都可以,不過經常括號都是必須的(如果元組是一個更大的表達式的一部分)。
>>>t=12345,54321,'hello'
>>>t[0]
12345
>>>t
(12345,54321,'hello')
>>>u=t,(1,2,3,4,5)
>>>u
((12345,54321,'hello'),(1,2,3,4,5))
1.6字典(Dictionary)
字典以關鍵字爲索引,關鍵字可以是任意不可變類型,通常用字符串或數值。理解字典的最佳方式是把他看作無序的關鍵字:值(key:value pairs)對集合,關鍵字必須是互不相同的(在同一個字典之內)。一對大括號創建一個空的字典:{}。
>>>tel = {'Jack':123456,'Tom',654321}
>>>tel['Cherry']=666666
>>>tel
{'Jack':123456,'Tom',654321,'Cherry',666666}
2、Python程序流程
2.1if語句-語法格式
if<expr1>:<one_line_statement>
if<expr1>:
<statement_block>
if<expr1>:
<statement_block>
else:
<statement_block>
if<expr1>:
<statement_block>
elif<expr2>:
<statement_block>
elif<expr3>:
<statement_block>
...
else:
<statement_block>
if語句-----使用說明
- if後面的表達式可以是任何表達式,除了None,0,“”(空字符串),[](空list),()(空元組),{}(空字典)以外,其他都是真的。
- 表達式以冒號分隔
- 若是一行的簡單表達式,可以直接跟在冒號後面
- 若是多行的表達式,就要使用縮進的方式,表示一組語句。python認爲同樣縮進長度的語句是一組
- python中沒有switch語句,使用elif來完成這個功能
- else表示條件不滿足時應該執行的語句,比忘了後面的冒號
2.2 for循環語句----語法格式
for x in <sequence>:#它的for語句竟然有else
<statement_block>
else:
<else_block>
for循環語句-----使用說明
- sequence表示任何string,tuple,dictionary
- break語句可以強制退出循環
- continue語句可以繼續執行下一次循環
- else語句是可有可無的。若有,則表示如果每個序列中的元素都循環到了,那麼就執行else-block
- else語句可以理解爲,如果循環沒有被break語句強行中斷,或者說循環正常結束後,就會執行else中的語句
2.3 while循環語句----語法格式
while <exprl>:#for和while竟然都有else
<block>
else:
<else-block>
while循環語句-----使用說明
- 只要exprl是真,那麼就一直執行block中的語句
- 如果沒有break跳出循環,也就是exprl爲假的時候,執行else-block中的語句
2.4 break和continue語句,以及循環中的else子句
- break語句和C中的類似,以及循環中的else子句
- continue語句是從C中借鑑來的,它表示循環繼續執行下一次迭代
- 循環可以有一個else子句;它在循環迭代完整個列表(對於for)或執行條件爲false(對於while)時執行,但循環會被break中止的情況下不會執行。
2.5 pass語句
pass語句什麼也不做。它用於那些語法上必須要有什麼語句,但程序上什麼也不要做的場合,例如:
>>>while True:
... pass #Busy-wait for keyboard interrupt...
3、python函數
3.1 函數定義
def <function_name>(<parameters_list>):
<code block>
說明:
- function_name是函數名稱,冒號用來分隔函數的內容
- Parameters_list是列表參數。參數也沒有類型,可以傳遞任何類型的值給函數,由函數的內容定義函數的接口。如果傳遞的參數類型不是函數想要的,那麼函數可以拋出異常。
- code block是和if,while一樣的代碼,應該有相同的縮進。
- 函數沒有返回值類型,return可以返回任意類型
3.2 函數參數默認值
最有用的形式是給一個或多個參數指定默認值。這樣創建的函數可以在調用時使用更少的參數。默認參數: retries=4 這種形式:
def ask_ok(prompt,retries=4,complaint='Yes or no,please!'):
while True:
ok = input(prompt)#在 Python3.x 中 raw_input( ) 和 input( ) 進行了整合,去除了 raw_input( ),僅保留了 input( ) 函數,其 #接收任意任性輸入,將所有輸入默認爲字符串處理,並返回字符串類型。
if ok in ('y','ye','yes'):return 1
if ok in ('n','no','nop','nope'):return 0
retries = retries - 1
if retries < 0:
raise IOError('refusenik user')
print complaint
調用的時候:
只給出必要的參數: ask_ok('Do you really want to quit?')
給出一個可選的參數: ask_ok('OK to overwrite the file?', 2)
或者給出所有的參數: ask_ok('OK to overwrite the file?', 2, 'Come on, only yes or no!')
(運行的時候compliant出不來)
默認參數的特點:
重要警告: 默認值只被賦值一次。這使得當默認值是可變對象時會有所不同,比如列表、字典或者大多數類的實例。
例如,下面的函數在後續調用過程中會累積(前面)傳給它的參數:
def f(a, L=[]):
L.append(a)
return L
print f(1)
print f(2)
print f(3)
這將會打印:
[1]
[1, 2]
[1, 2, 3]
如果你不想在隨後的調用中共享默認值,可以像這樣寫函數:
def f(a, L=None):
if L is None:
L = []
L.append(a)
return L
3.3 函數參數關鍵字
函數可以通過參數關鍵字的形式來調用,形如“keyword = value”,例如以下的函數:
def parrot(voltage,state='a stiff',action='voom',type='Norwegian Blue'):
print("--This parrot wouldn't",acition)
print("if you put",voltage,"Volts through it.")
print("--Lovely plumage,the",type,"--It's",state,"!")
可以用以下的任一方法調用:
parrot(1000)
parrot(action = 'VOOOM',voltage = 100000)
parrot(voltage = 100000,state = 'pushing up the daisies')
函數參數關鍵字
- 參數列表中的每一個關鍵字都必須來自於形式參數,每個參數都有對應的關鍵字
- 形式參數有沒有默認值並不重要
- 實際參數不能一次賦多個值
- 形式參數不能再同一次調用中同時使用位置和關鍵字綁定值
3.4 函數可變參數列表
一個最不常用的選擇是可以讓函數調用可變個數的參數。這些參數被包裝進一個拓撲。在這些可變個數的參數之前,可以有領導多個普通的參數:(這個沒有懂具體怎應用)
def fprintf(file,format,*args):
file.write(format%args)
3.5 嵌套函數
這種機制提供了一個函數範圍的概念,某些函數只在某些函數的內部才能看到。如果需要公開的話,可以 通過返回值返回內部函數。
>>> def outfun(a,b):
... def innerfun(x,y):
... return x+y
... return innerfun(a,b)
3.6 lambda關鍵字
通過lambda關鍵字,可以創建很小的匿名函數。這裏有一個函數返回它的兩個參數的和:“lambda a,b:a+b”。Lambda形式可以用於任何需要的函數對象。出於語法限制,它們只能有一個單獨的表達式。語義上講,它們只是普通函數定義中的一個語法技巧。類似於嵌套函數定義,lambda形式可以從包含範圍內引用變量:
>>> def make_invrementor(n):
return lambda x:x+n...
>>>f = make_invrementor(42)#默認初始值x = 0
>>>f(0)
42
>>>f = lambda a,b:a+b
>>>f(1,2)
3
>>>f("abc","def")
'abcdef'
3.7 DocString函數描述
>>> 文檔字符串(DocString函數描述)
def printMax(x, y):
'''Prints the maximum of two numbers.
The two values must be integers.'''
x = int(x) # convert to integers, if possible
y = int(y)
if x > y:
print(x, 'is maximum')
else:
print(y, 'is maximum')
printMax(3, 5)
print(printMax.__doc__)
輸出:5 is maximum
Prints the maximum of two numbers.#最後才輸出文檔字符串
The two values must be integers.
4、python類
4.1 類定義
定義一個類的時候,會創建一個新的命名空間,將其作爲局部作用域使用----因此,所有對局部變量的賦值都引入新的命名空間。特別是函數定義將新函數的命名綁定與此。
class ClassName:
<statement-1>
...
<statement-N>
4.2 類對象引用
類對象支持兩種操作:屬性引用和實例化。
屬性引用使用和python中多有的屬性引用一樣的標準語法:obj.name。類對象創建後,類命名空間中所有的命名都是有效屬性名。所以如果類定義使這樣:
class Myclass:
"A simple example class"
i = 12345
def f(self):
return 'hello world'
那麼 Myclass.i和Myclass.f是有效的屬性引用,分別返回一個整數和一個方法對象。
4.3 類的實例化
類的實例化使用函數符號。只要將類對象看作是一個返回新的類實例的無參數函數即可。例如:
>>>x = Myclass()
以上創建了一個新的類實例並將該對象賦給局部變量x。這個實例化操作創建了一個空的對象。創建爲有初始狀態的類可以通過定義一個名爲_init_()的特殊方法來實現,像下面這樣:
def _init_(self):
self.data = []
類定義了_init_()方法的話,類的實例化操作會自動爲新建的類實例調用_init_()方法。
4.4 類的繼承
如果一種語言不支持繼承,“類”就沒有意義。派生類的定義如下所示:
class DerivedClassName(BaseClassName);
<statement-1>
...
<statement-N>
命名BaseClassName(實例中的基類名)必須與派生類定義在一個作用域內。
4.5 類的多繼承
python同樣有限的支持多繼承形式。多繼承的類定義如下例:
class DerivedClassName(Base1,Base2,Base3);
<statement-1>
...
<statement-N>
這裏唯一需要解釋的語義是解析類屬性的規則。順序是深度優先,從左到右。
5、python模塊和包
5.1 模塊(Module)
一個module不過是一些函數,class放在一個*.py文件中,例如test.py:
"""
this is only a very simple module
"""
age = 0#a sample attribute
def sayHello():#a sample function in a module
print "Hello"
if _name_=="_main_"
sayHello()
5.2 包(Package)
Package是一組module的集合,用以下方法創建一個package。
- 在當前目錄下創建一個目錄testpackage;
- 在testpackage目錄中創建一個空文件_init_.py;
- 在testpackage目錄中創建一個testpackage.py文件,裏面含有一些代碼。
>>>import testpackage.testmodule
>>>testpackage.testmodule.sayHello()
Hello
Package是一種組織module的方法,提供了一個name space,防止發生名稱衝突。
5.3 命名空間(name space)
命名空間是從命名到對象的映射。以下有一些命名空間的例子:內置命名(想abs()這樣的函數,以及內置異常名)集,模塊中的全局命名,函數調用中的局部命名。某種意義上講對象的屬性集也是一個命名空間。關於命名空間需要了解的一件很重要的事就是不同命名空間中的命名沒有任何聯繫,例如兩個不同的模塊可能都會定義一個名爲“maximize”的函數而不會發生混淆----用戶必須以模塊名爲前綴來引用它們。
不同的命名空間在不同的時刻創建,有不同的生存期。包含內置命名的命名空間在python解釋器啓動時創建,會一直保留,不會刪除。
5.6一些常用的語法
一定要理解這句話(包括數字、字符串與函數、變量(叫對象變量))
java中的構造函數的名字是與類名相同的,這點與python不同,python默認把__init__看作構造函數。