Python學習筆記(一)基礎,python學習筆記基礎
Python基礎
Python使用縮排來組織代碼塊,請務必遵守約定俗成的習慣,堅持使用4個空格的縮排。
在文字編輯器中,需要設定把Tab自動轉換為4個空格,確保不混用Tab和空格。
整數
浮點數
整數和浮點數在電腦內部的儲存方式是不同的,整數運算永遠是精確的(除法也是),而浮點數運算則可能會有四捨五入的誤差。
字串
字串是以單引號'或雙引號“括起來的任意文本。如果'本身也是一個字元那就可以用“”括起來,如“I'm OK”。
如果字串既包含'又包含“,可以用逸出字元\來標識:
'I\'m \"OK\"!'
表示的字串內容為 I'm "OK"!
逸出字元可以轉義很多字元,如\n表示換行,\t表示定位字元,字元\本身也要轉義,所以\\表示的字元就是\。
如果字串裡面有很多字元都需要轉義,就需要加很多\,為了簡化,Python還允許用r''表示''內部的字串預設不轉義
>>> print('\\\t\\')\ \>>> print(r'\\\t\\')\\\t\\
如果字串內部有很多換行,用\n寫在一行裡不好閱讀,為了簡化,Python允許用'''...'''的格式表示多行內容。
>>> print('''line1... line2... line3''')line1line2line3
如果寫成程式並存為.py檔案,就是:
print('''line1line2line3''')
多行字串'''...'''還可以在前面加上r使用,即多行字串不轉義。
布爾值一個布爾值只有True和False兩種,布爾值可以用and(&)、or(|)和not運算。
>>> TrueTrue>>> FalseFalse>>> 3 > 2True>>> 3 > 5False
>>> True and TrueTrue>>> True and FalseFalse>>> False and FalseFalse>>> 5 > 3 and 3 > 1True
>>> True or TrueTrue>>> True or FalseTrue>>> False or FalseFalse>>> 5 > 3 or 1 > 3True
>>> not TrueFalse>>> not FalseTrue>>> not 1 > 2True
空值
Python的空值用None表示。
變數
在Python中,=是賦值語句,可以把任何資料類型賦給變數,同一個變數可以反覆賦值,而且可以是不同類型的變數,例如:
a=123 #a是整數print(a)a='ABC' #a是字串print(a)
這種變數本身類型不固定的語言叫做動態語言,即不需要聲明標量類型。
理解變數在電腦記憶體中的表示:
a=‘ABC’
Python解譯器幹了兩件事:
1.在記憶體中建立了一個'ABC'的字串;
2.在記憶體中建立了一個名為a的變數,並把它指向'ABC'。
同樣可以把變數a賦值給變數b:
a='ABC'b=aa='XYZ'print(b)
可以得到結果'ABC'。
常量
在Python中有兩種除法,一種除法是/:
>>>10/33.3333333333333335
/除法計算結果是浮點數,即使兩個整數恰好整除,結果也是浮點數:
>>>9/33.0
還一種除法是//,稱為地板除,兩個整數的除法仍然是整數:
>>>10/33
//除法只取結果的整數部分,相當於C語言/除法。
Python提供餘數運算:(%)
>>>10%31
故無論是//還是%,結果永遠是整數,也就是前文所述整數運算永遠是精確的。
注意:Python的整數沒有大小限制。浮點數也沒有大小限制,但是超出一定的範圍就直接表示為inf(無限大)。
字元編碼
UTF-8編碼把一個Unicode(通常是2位元組)字元根據不同的數字大小編碼成1-6個位元組,常用的英文字元被編碼成1位元組,漢字通常是3個位元組,只有很生僻的字元才會編碼成4-6個位元組。如果要傳輸的文本包含大量英文字元,用UTF-8編碼就能節省空間的:
| 字元 |
ASCII |
Unicode |
UTF-8 |
| A |
01000001 |
00000000 01000001 |
01000001 |
| 中 |
x |
01001110 00101101 |
11100100 10111000 10101101 |
在電腦記憶體中,統一使用Unicode編碼,當需要儲存到硬碟或者需要傳輸時,就轉換為UTF-8編碼。
即當編輯文本時,UTF-8字元轉換為Unicode字元到記憶體,編輯完成後,儲存或傳輸時,再把Unicode轉換為UTF-8進行儲存或者傳輸。
Python的字串
對於單個字元的編碼,Python提供了ord()函數把字元轉換為字元的編碼數,chr()函數把編碼轉換為對應的字元:
>>> ord('A')65>>> ord('中')20013>>> chr(66)'B'>>> chr(25991)'文'由於Python的字串類型是str,在記憶體中以Unicode表示,一個字元對應若干個位元組。如果要在網路上傳輸,或者儲存到磁碟上,就需要把str變為以位元組為單位的bytes。
Python對bytes類型的資料用帶b首碼的單引號或雙引號表示:
x=b'ABC'
要注意區分'ABC'和b'ABC',前者是str,Unicode編碼,後者雖然內容顯示一致,但每個字元都只佔用一個位元組。
以Unicode表示的str通過encode()方法可以編碼為指定的bytes,例如:(' '.encode(' '))
>>> 'ABC'.encode('ascii')b'ABC'>>> '中文'.encode('utf-8')b'\xe4\xb8\xad\xe6\x96\x87'>>> '中文'.encode('ascii')>>> x='ABC'>>> x.encode('utf-8')b'ABC'注意:含有中文的str無法用ASCII編碼。
反過來,如果我們從網路或磁碟上讀取了位元組流,那麼讀到的資料就是bytes。要把bytes變為str,就需要用decode()方法:(' '.decode(' '))
>>> b'ABC'.decode('ascii')'ABC'>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')'中文'
len()函數
要計算str包含多少個字元,可以用len()函數:
>>> len('ABC')3>>> len('中文')2len()Function Compute的是str的字元數,如果換成bytes,len()函數就計算位元組數:
>>> len(b'ABC')3>>> len(b'\xe4\xb8\xad\xe6\x96\x87')6>>> len('中文'.encode('utf-8'))6
在操作字串時,,經常遇到str和bytes的互相轉換,為了避免亂碼問題,應當始終堅持使用UTF-8編碼對str和bytes進行轉換。
由於Python原始碼也是一個文字檔,所以當原始碼中包含中文字元時,在儲存原始碼時就需要務必指定儲存為UTF-8編碼。當Python解譯器讀取原始碼時,為了讓它按照UTF-8讀取,我們通常在檔案開頭寫上這兩行:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
(如果原始碼中含有中文:
1.確保文字編輯器使用UTF-8 without BOM;
2.原始碼開頭寫上2行注釋。)
格式化
在Python中,採用格式化的方式和C語言一致,用%實現,例如:
>>> 'Hello, %s' % 'world''Hello, world'>>> 'Hi, %s, you have $%d.' % ('Michael', 1000000)'Hi, Michael, you have $1000000.'有幾個%?預留位置,後面就跟幾個變數或者值,順序一一對應。如果只有一個%?,括弧可以省略。
常見的預留位置:
| %d |
整數 |
| %f |
浮點數 |
| %s |
字串 |
| %x |
十六進位整數 |
其中,格式化整數和浮點數還可以指定是否補0和整數與小數的位元:
>>> print('%2d-%02d' % (3, 1))3-01>>> print('%.2f' % 3.1415926)3.14如果不確定用什麼,%s永遠起作用,它會把任何類型轉換為字串:
>>> 'Age: %s. Gender: %s' % (25, True)'Age: 25. Gender: True'
當字串裡的%是一個一般字元時,這是用%%轉義來表示一個%:
>>> 'growth rate: %d %%' % 7'growth rate: 7 %'
list 和 tuplelist
Python內建的一種資料類型是列表:list。list是一種有序的集合,可以隨時添加和刪除其中的元素。(list=[ , ,])
>>> classmates = ['Michael', 'Bob', 'Tracy']>>> classmates['Michael', 'Bob', 'Tracy']
變數classmates就是一個list。
用len()函數可以擷取list元素的個數:
>>> len(classmates)3
用索引來訪問list中每一個位置的元素,記得索引是從0開始的:
>>> classmates[0]'Michael'>>> classmates[1]'Bob'>>> classmates[2]'Tracy'>>> classmates[3]Traceback (most recent call last): File "<stdin>", line 1, in <module>IndexError: list index out of range
注意:確保索引不越界。
如果要取最後一個元素,出了計算索引位置外,還可以用-1做索引,直接擷取最後一個元素:
>>> classmates[-1]'Tracy'
以此類推,可以擷取倒數第二個、第三個:
>>> classmates[-2]'Bob'>>> classmates[-3]'Michael'>>> classmates[-4]Traceback (most recent call last): File "<stdin>", line 1, in <module>IndexError: list index out of range
同樣不能越界。
list函數
除len()函數擷取list元素個數外,還有以下函數:
.append( )可以往list中追加元素至末尾:
>>> classmates.append('Adam')>>> classmates['Michael', 'Bob', 'Tracy', 'Adam'].insert(n, )可以把元素插入到指定的第n個位置:
>>> classmates.insert(1, 'Jack')>>> classmates['Michael', 'Jack', 'Bob', 'Tracy', 'Adam']
.pop()刪除list末尾的元素:
>>> classmates.pop()'Adam'>>> classmates['Michael', 'Jack', 'Bob', 'Tracy']
.pop(i)刪除指定位置的元素:
>>> classmates.pop(1)'Jack'>>> classmates['Michael', 'Bob', 'Tracy']
把某個元素替換成別的元素,可以直接賦值給隊友的索引位置:
>>> classmates[1] = 'Sarah'>>> classmates['Michael', 'Sarah', 'Tracy']
list裡的元素的資料類型也可以不同:
>>> L = ['Apple', 123, True]
list元素也可以是另一個list:
>>> s = ['python', 'java', ['asp', 'php'], 'scheme']>>> len(s)4
要注意s只有4個元素,其中s[2]又是一個list。
要拿到'php'可以寫s[2][1],因此s可以看成是一個二維數組。累死的還有三維、四維……
如果list中一個元素也沒有,就是一個空的list,長度為0。
tuple
另一種有序列表叫元組:tuple。(tuple=( , , ))。tuple一旦初始化就不能修改:
>>> classmates = ('Michael', 'Bob', 'Tracy')現在classmates這個tuple不能變了,也沒有append(),insert()這樣的方法。其他擷取元素的方法和list一樣,可以正常使用classmates[0],classmates[-1],但不能複製成另外的元素。因為tuple不可變,所以代碼不可變。
tuple陷阱:當定義一個tuple時,在定義的時候,tuple就必須被確定下來,如:
>>> t = (1, 2)>>> t(1, 2)
要定義一個空的tuple,可以寫成():
>>> t = ()>>> t()
但是,定義一個只有一個元素的tuple時,必須要加一個逗號,來消除歧義(因為當t=(1)時,定義的不是tuple,而是1這個數):
>>> t = (1,)>>> t(1,)
Python在顯示只有一個元素的tuple時,也會加一個逗號。
“可變的”tuple:
當tuple內涵list類元素時,list內元素可變:
>>> t = ('a', 'b', ['A', 'B'])>>> t[2][0] = 'X'>>> t[2][1] = 'Y'>>> t('a', 'b', ['X', 'Y'])這是因為,變的是list內元素,而tuple指向的list並沒有變成其他的list。所謂的“不變”是說,tuple每個元素,指向永遠不變。即指向'a',就不能改成指向'b',指向一個list就不能改成指向其他對象,但指向的這個list本身是可以變的。(list內可變,指向的list不可變)
條件判斷
基本語句:
if 條件 : 執行語句elif 條件 : 執行語句else : 執行語句
elif是else if的縮寫。注意不要少寫了冒號。例如:
age = 20if age >= 6: print('teenager')elif age >= 18: print('adult')else: print('kid')
input()
有下面程式:
birth = input('birth: ')if birth < 2000: print('00前')else: print('00後')輸入1982,結果報錯。
這是因為input()返回的資料類型是str,str不能直接和整數比較,必須先把str轉換成整數。int()函數完成了這件事:
s = input('birth: ')birth = int(s)if birth < 2000: print('00前')else: print('00後')再次運行,得到正確結果。但是如果輸入abc,又會錯誤,,因為int()函數發現一個字串不是合法數字時就會報錯。
同樣float()將整數和字串轉換為浮點數。
迴圈
Python的迴圈有兩種,一種是for...in迴圈,依次把list或tuple中的每個元素迭代出來:
names = ['Michael', 'Bob', 'Tracy']for name in names: print(name)
range(n)函數可以產生一個整數序列,再通過list函數就可以產生list。整數範圍為0~n-1。
>>> list(range(5))[0, 1, 2, 3, 4]
利用range,可以計算1~100的和:
sum = 0for x in range(101): sum = sum + xprint(sum)
range還可以指定起始數值:
>>>for num in range(2,6): print(num)2345
另外,range可以指定步長,在第三個數值標明步長:
>>>for num in range(2,10,2) print(num)2468
即在2~9範圍內每次加2。
第二種迴圈是while迴圈,只要條件滿足就一直迴圈,條件不滿足時退出。
sum = 0n = 99while n > 0: sum = sum + n n = n - 2print(sum)
dict和setdict
dict是python裡的dictionary,即是字典的意思,可以存放key和對應的value,便於搜尋。
初始化dict:
>>>d={'a':95,'b':85,'c':5}>>>d['a']95
還可以直接添加:
>>>d['d']=75>>>d['d']75
可以直接修改key對應的value:
>>>d['a']=55>>>d['a']55
如果key不存在,程式就會報錯,要確定key存在不存在,有兩種方法:
第一種是通過in:
>>>'e' in dFalse
第二種是get()函數,如果key不存在返回None,或者自己指定的數值:
>>>d.get('e')>>>d.get('e',0)0要刪除一個key,可以用pop(key),對應的value也會被刪除:
>>>d.pop('a')95>>>d{'b':85,'c':5,'d'75}注意:dict的key必須是不可變的,在Python中,字串、數字都是不可變的,而list可變,所以list不可以作為dict的key:
>>> key = [1, 2, 3]>>> d[key] = 'a list'Traceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: unhashable type: 'list'
set
set和dict一樣也是儲存一組key,但不同的是不儲存value,所以set裡的key值也必須是唯一的。
要建立一個set,需要提供一個list作為輸入集合:
>>> s = set([1, 2, 3])>>> s{1, 2, 3}注意,傳入的[1,2,3]是一個list,而顯示的{1,2,3}則表明set裡有1,2,3這三個元素。
重複元素在set中被自動過濾:
>>> s = set([1, 1, 2, 2, 3, 3])>>> s{1, 2, 3}可以使用add(key)向set中添加元素:
>>> s.add(4)>>> s{1, 2, 3, 4}>>> s.add(4)>>> s{1, 2, 3, 4}使用remove(key)移除元素:
>>> s.remove(4)>>> s{1, 2, 3}
set可以看成是數學上無序和無重複元素的集合,因此可以使用交集、並集等操作(&、|)
>>> s1 = set([1, 2, 3])>>> s2 = set([2, 3, 4])>>> s1 & s2{2, 3}>>> s1 | s2{1, 2, 3, 4}
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。