2020最新Python入門筆記

 

Python變量和數據類型

數據類型

print語句

註釋

Python的註釋以 # 開頭,後面的文字直到行尾都算註釋css

# 這一行所有都是註釋... print 'hello' # 這也是註釋 

這裏要注意注意:無論你是爲了Python就業仍是興趣愛好,記住:項目開發經驗永遠是核心,若是你沒有2020最新python入門到高級實戰視頻教程,能夠去小編的Python交流.裙 :七衣衣九七七巴而五(數字的諧音)轉換下能夠找到了,裏面不少新python教程項目,還能夠跟老司機交流討教!

什麼是變量

定義字符串

字符串能夠用''或者""括起來表示。python

若是字符串自己包含'怎麼辦?好比咱們要表示字符串 I'm OK ,這時,能夠用" "括起來表示:數組

"I'm OK"
相似的,若是字符串包含",咱們就能夠用' '括起來表示:ruby

'Learn "Python" in imooc'
若是字符串既包含'又包含"怎麼辦?bash

這個時候,就須要對字符串的某些特殊字符進行「轉義」,Python字符串用\進行轉義。網絡

要表示字符串 Bob said "I'm OK".
因爲 ' 和 " 會引發歧義,所以,咱們在它前面插入一個\表示這是一個普通字符,不表明字符串的起始,所以,這個字符串又能夠表示爲數據結構

'Bob said "I'm OK".'
注意:轉義字符 \ 不計入字符串的內容中。app

經常使用的轉義字符還有:函數

\n 表示換行
\t 表示一個製表符
\ 表示 \ 字符自己學習

raw字符串與多行字符串

咱們能夠在字符串前面加個前綴 r ,表示這是一個 raw 字符串,裏面的字符就不須要轉義了。例如:

r'\(~_~)/ \(~_~)/'

可是r'...'表示法不能表示多行字符串,也不能表示包含'和 "的字符串(爲何?)

若是要表示多行字符串,能夠用'''...'''表示:

'''Line 1 Line 2 Line 3''' 

上面這個字符串的表示方法和下面的是徹底同樣的:

'Line 1\nLine 2\nLine 3'

還能夠在多行字符串前面添加 r ,把這個多行字符串也變成一個raw字符串:

r'''Python is created by "Guido".
It is free and easy to learn.
Let's start learn Python in imooc!'''

Unicode字符串

轉義:

u'中文\n日文\n韓文'
多行:

u'''第一行 第二行''' 

raw+多行:

ur'''Python的Unicode字符串支持"中文", "日文", "韓文"等多種語言''' 

整數和浮點數

布爾類型

List和Tuple類型

list

按照索引訪問list

倒序訪問list

添加新元素

第一個辦法是用 list 的 append() 方法,把新同窗追加到 list 的末尾:

>>> L = ['Adam', 'Lisa', 'Bart'] >>> L.append('Paul') >>> print L ['Adam', 'Lisa', 'Bart', 'Paul'] append()老是把新的元素添加到 list 的尾部。 

方法二是用list的 insert()方法,它接受兩個參數,第一個參數是索引號,第二個參數是待添加的新元素:

>>> L = ['Adam', 'Lisa', 'Bart'] >>> L.insert(0, 'Paul') >>> print L ['Paul', 'Adam', 'Lisa', 'Bart'] 

從list刪除元素

  • 最後一個元素,咱們能夠用list的pop()方法刪除:
>>> L = ['Adam', 'Lisa', 'Bart', 'Paul']
    >>> L.pop()
    'Paul'
    >>> print L
    ['Adam', 'Lisa', 'Bart']

pop()方法老是刪掉list的最後一個元素,而且它還返回這個元素,因此咱們執行 L.pop() 後,會打印出 'Paul'

若是Paul同窗不是排在最後一個怎麼辦?好比Paul同窗排在第三:

>>> L = ['Adam', 'Lisa', 'Paul', 'Bart']
要把Paul踢出list,咱們就必須先定位Paul的位置。因爲Paul的索引是2,所以,用 pop(2)把Paul刪掉:

替換元素

替換時直接賦值

tuple

tuple是另外一種有序的列表,中文翻譯爲「 元組 」。tuple 和 list 很是相似,可是,tuple一旦建立完畢,就不能修改了。

建立tuple和建立list惟一不一樣之處是用( )替代了[ ]。

tuple沒有 append()方法,也沒有insert()和pop()方法。

建立單元素tuple

包含 0 個元素的 tuple,也就是空tuple,直接用 ()表示:

>>> t = () >>> print t () 

建立包含1個元素的 tuple 呢?來試試:

>>> t = (1) >>> print t 1 好像哪裏不對!t 不是 tuple ,而是整數1。爲何呢? 

由於()既能夠表示tuple,又能夠做爲括號表示運算時的優先級,結果 (1) 被Python解釋器計算出結果 1,致使咱們獲得的不是tuple,而是整數 1。

正是由於用()定義單元素的tuple有歧義,因此 Python 規定,單元素 tuple 要多加一個逗號「,」,這樣就避免了歧義:

>>> t = (1,) >>> print t (1,) Python在打印單元素tuple時,也自動添加了一個「,」,爲了更明確地告訴你這是一個tuple。 

「可變的tuple」

前面咱們看到了tuple一旦建立就不能修改。如今,咱們來看一個「可變」的tuple:

>>> t = ('a', 'b', ['A', 'B']) 

注意到 t 有 3 個元素:'a','b'和一個list:['A', 'B']。list做爲一個總體是tuple的第3個元素。list對象能夠經過 t[2] 拿到:

>>> L = t[2]
而後,咱們把list的兩個元素改一改:

>>> L[0] = 'X' >>> L[1] = 'Y' 

再看看tuple的內容:

>>> print t ('a', 'b', ['X', 'Y']) 

條件判斷和循環

if語句

for循環

L = ['Adam', 'Lisa', 'Bart']
for name in L:
    print name

### while循環

while x < N:
print x
x = x + 1

break與continue

在循環過程當中,能夠用break退出當前循環,還能夠用continue跳事後續循環代碼,繼續下一次循環。

多重循環

Dict和Set類型

什麼是dict

用 dict 表示「名字」-「成績」的查找表以下:

d = {
    'Adam': 95,
    'Lisa': 85,
    'Bart': 59
}

咱們把名字稱爲key,對應的成績稱爲value,dict就是經過 key 來查找 value。

花括號 {} 表示這是一個dict,而後按照 key: value, 寫出來便可。最後一個 key: value 的逗號能夠省略。

訪問dict

d[key] 的形式來查找對應的 value,這和 list 很像,不一樣之處是,list 必須使用索引返回對應的元素,而dict使用key:

注意: 經過 key 訪問 dict 的value,只要 key 存在,dict就返回對應的value。若是key不存在,會直接報錯:KeyError。

要避免 KeyError 發生,有兩個辦法:

  • 一是先判斷一下 key 是否存在,用 in 操做符:
if 'Paul' in d:
    print d['Paul']

若是 'Paul' 不存在,if語句判斷爲False,天然不會執行 print d['Paul'] ,從而避免了錯誤。

  • 二是使用dict自己提供的一個 get 方法,在Key不存在的時候,返回None:
>>> print d.get('Bart') 59 >>> print d.get('Paul') None 

dict的特色

  • 查找速度快,不管dict有10個元素仍是10萬個元素,查找速度都同樣。而list的查找速度隨着元素增長而逐漸降低。

不過dict的查找速度快不是沒有代價的,**dict的缺點是佔用內存大,還會浪費不少內容,list正好相反,佔用內存小,可是查找速度慢。

  • 因爲dict是按 key 查找,因此,在一個dict中,key不能重複。

  • 存儲的key-value序對是沒有順序的!這和list不同:

d = {
    'Adam': 95,
    'Lisa': 85,
    'Bart': 59
}

當咱們試圖打印這個dict時:

>>> print d {'Lisa': 85, 'Adam': 95, 'Bart': 59} 打印的順序不必定是咱們建立時的順序,並且,不一樣的機器打印的順序均可能不一樣,這說明dict內部是無序的,不能用dict存儲有序的集合。 
  • **是做爲 key 的元素必須不可變,Python的基本類型如字符串、整數、浮點數都是不可變的,均可以做爲 key。可是list是可變的,就不能做爲 key。

能夠試試用list做爲key時會報什麼樣的錯誤。

不可變這個限制僅做用於key,value是否可變無所謂:

{
'123': [1, 2, 3], # key 是 str,value是list
123: '123', # key 是 int,value 是 str
('a', 'b'): True # key 是 tuple,而且tuple的每一個元素都是不可變對象,value是 boolean
}
最經常使用的key仍是字符串,由於用起來最方便。

更新dict

要把新同窗'Paul'的成績 72 加進去,用賦值語句:

>>> d['Paul'] = 72

遍歷dict

直接使用for循環能夠遍歷 dict 的 key:

>>> d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 } >>> for key in d: ... print key ... Lisa Adam Bart 

什麼是set

dict的做用是創建一組 key 和一組 value 的映射關係,dict的key是不能重複的。

有的時候,咱們只想要 dict 的 key,不關心 key 對應的 value,目的就是保證這個集合的元素不會重複,這時,set就派上用場了。

set 持有一系列元素,這一點和 list 很像,可是set的元素沒有重複,並且是無序的,這點和 dict 的 key很像。

因此set能夠做爲dict的key

訪問set

訪問 set中的某個元素實際上就是判斷一個元素是否在set中。

例如,存儲了班裏同窗名字的set:

`>>> s = set(['Adam', 'Lisa', 'Bart', 'Paul'])
咱們能夠用 **in **操做符判斷:

Bart是該班的同窗嗎?

>>> 'Bart' in s True 

set的特色

  • set的內部結構和dict很像,惟一區別是不存儲value,所以,判斷一個元素是否在set中速度很快。

  • set存儲的元素和dict的key相似,必須是不變對象,所以,任何可變對象是不能放入set中的。

  • set存儲的元素也是沒有順序的。

遍歷set

因爲 set 也是一個集合,因此,遍歷 set 和遍歷 list 相似,均可以經過 for 循環實現。

直接使用 for 循環能夠遍歷 set 的元素:

>>> s = set(['Adam', 'Lisa', 'Bart']) >>> for name in s: ... print name ... Lisa Adam Bart 

更新set

添加元素時,用set的add()方法:

>>> s = set([1, 2, 3]) >>> s.add(4) >>> print s set([1, 2, 3, 4]) 

若是添加的元素已經存在於set中,add()不會報錯,可是不會加進去了:

>>> s = set([1, 2, 3]) >>> s.add(3) >>> print s set([1, 2, 3]) 

刪除set中的元素時,用set的remove()方法:

>>> s = set([1, 2, 3, 4]) >>> s.remove(4) >>> print s set([1, 2, 3]) 

若是刪除的元素不存在set中,remove()會報錯:

>>> s = set([1, 2, 3]) >>> s.remove(4) Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 4 

因此用add()能夠直接添加,而remove()前須要判斷。

函數

什麼是函數

調用函數

編寫函數

返回多值

>>> r = move(100, 100, 60, math.pi / 6) >>> print r (151.96152422706632, 70.0) 

Python的函數返回多值其實就是返回一個tuple,但寫起來更方便。

遞歸函數

漢諾塔

定義默認參數

定義可變參數

若是想讓一個函數能接受任意個參數,咱們就能夠定義一個可變參數:

def fn(*args): print args 

可變參數也不是很神祕,Python解釋器會把傳入的一組參數組裝成一個tuple傳遞給可變參數,所以,在函數內部,直接把變量 args 當作一個 tuple 就行了。

切片

對list進行切片

取前N個元素,也就是索引爲0-(N-1)的元素,能夠用循環:

>>> r = [] >>> n = 3 >>> for i in range(n): ... r.append(L[i]) ... >>> r ['Adam', 'Lisa', 'Bart'] 

對這種常常取指定索引範圍的操做,用循環十分繁瑣,所以,Python提供了切片(Slice)操做符,能大大簡化這種操做。

對應上面的問題,取前3個元素,用一行代碼就能夠完成切片:

>>> L[0:3] ['Adam', 'Lisa', 'Bart'] L[0:3]表示,從索引0開始取,直到索引3爲止,但不包括索引3。即索引0,1,2,正好是3個元素 

只用一個 : ,表示從頭至尾:

>>> L[:] ['Adam', 'Lisa', 'Bart', 'Paul'] 所以,L[:]實際上覆製出了一個新list。 

切片操做還能夠指定第三個參數:

>>> L[::2] ['Adam', 'Bart'] 第三個參數表示每N個取一個,上面的 L[::2] 會每兩個元素取出一個來,也就是隔一個取一個。 

把list換成tuple,切片操做徹底相同,只是切片的結果也變成了tuple。

倒序切片

對字符串切片

字符串 'xxx'和 Unicode字符串 u'xxx'也能夠當作是一種list,每一個元素就是一個字符。所以,字符串也能夠用切片操做,只是操做結果還是字符串

迭代

什麼是迭代

在Python中,若是給定一個list或tuple,咱們能夠經過for循環來遍歷這個list或tuple,這種遍歷咱們成爲迭代(Iteration)。

在Python中,迭代是經過 for ... in 來完成的

由於 Python 的 for循環不只能夠用在list或tuple上,還能夠做用在其餘任何可迭代對象上。

所以,迭代操做就是對於一個集合,不管該集合是有序仍是無序,咱們用 for 循環老是能夠依次取出集合的每個元素。

注意: 集合是指包含一組元素的數據結構,咱們已經介紹的包括:

  1. 有序集合:list,tuple,str和unicode;
  2. 無序集合:set
  3. 無序集合而且具備 key-value 對:dict
    而迭代是一個動詞,它指的是一種操做,在Python中,就是 for 循環。

索引迭代

**Python中,迭代永遠是取出元素自己,而非元素的索引。

對於有序集合,元素確實是有索引的。有的時候,咱們確實想在 for 循環中拿到索引,怎麼辦?

方法是使用 enumerate() 函數:

>>> L = ['Adam', 'Lisa', 'Bart', 'Paul'] >>> for index, name in enumerate(L): ... print index, '-', name ... 0 - Adam 1 - Lisa 2 - Bart 3 - Paul 

迭代dict的value

dict 對象有一個 values() 方法,這個方法把dict轉換成一個包含全部value的list,這樣,咱們迭代的就是 dict的每個 value:

d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }
print d.values()
# [85, 95, 59]
for v in d.values():
    print v
# 85
# 95
# 59

若是仔細閱讀Python的文檔,還能夠發現,dict除了values()方法外,還有一個 itervalues() 方法,用 itervalues() 方法替代 values() 方法,迭代效果徹底同樣:

*那這兩個方法有何不一樣之處呢?

  1. values() 方法實際上把一個 dict 轉換成了包含 value 的list。

  2. 可是 itervalues() 方法不會轉換,它會在迭代過程當中依次從 dict 中取出 value,因此 itervalues() 方法比 values() 方法節省了生成 list 所需的內存。

  3. 打印 itervalues() 發現它返回一個 <dictionary-valueiterator> 對象,這說明在Python中,for 循環可做用的迭代對象遠不止 list,tuple,str,unicode,dict等,任何可迭代對象均可以做用於for循環,而內部如何迭代咱們一般並不用關心。

迭代dict的key和value

items() 方法把dict對象轉換成了包含tuple的list,咱們對這個list進行迭代,能夠同時得到key和value:

>>> for key, value in d.items(): ... print key, ':', value ... Lisa : 85 Adam : 95 Bart : 59 

和 values() 有一個 itervalues() 相似, items() 也有一個對應的 iteritems(),iteritems() 不把dict轉換成list,而是在迭代過程當中不斷給出 tuple,因此, iteritems() 不佔用額外的內存。

列表生成式

生成列表

要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],咱們能夠用range(1, 11):

>>> range(1, 11) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 

但若是要生成[1x1, 2x2, 3x3, ..., 10x10]怎麼作?方法一是循環:

>>> L = [] >>> for x in range(1, 11): ... L.append(x * x) ... >>> L [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] 

可是循環太繁瑣,而列表生成式則能夠用一行語句代替循環生成上面的list:

>>> [x * x for x in range(1, 11)] [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] 

這種寫法就是Python特有的列表生成式。利用列表生成式,能夠以很是簡潔的代碼生成 list。

複雜表達式

假設有以下的dict:

d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }

徹底能夠經過一個複雜的列表生成式把它變成一個 HTML 表格:

tds = ['<tr><td>%s</td><td>%s</td></tr>' % (name, score) for name, score in d.iteritems()] print '<table>' print '<tr><th>Name</th><th>Score</th><tr>' print '\n'.join(tds) print '</table>' 

字符串的join()方法能夠把一個 list 拼接成一個字符串

條件過濾

列表生成式的 for 循環後面還能夠加上 if 判斷。例如:

>>> [x * x for x in range(1, 11) if x % 2 == 0] [4, 16, 36, 64, 100] 

有了 if 條件,只有 if 判斷爲 True 的時候,才把循環的當前元素添加到列表中。

多層表達式

for循環能夠嵌套,所以,在列表生成式中,也能夠用多層 for 循環來生成列表。

對於字符串 'ABC' 和 '123',可使用兩層循環,生成全排列:

>>> [m + n for m in 'ABC' for n in '123'] ['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3'] 

翻譯成循環代碼就像下面這樣:

L = [] for m in 'ABC': for n in '123': L.append(m + n) 

最後注意:無論你是爲了Python就業仍是興趣愛好,記住:項目開發經驗永遠是核心,若是你沒有2020最新python入門到高級實戰視頻教程,能夠去小編的Python交流.裙 :七衣衣九七七巴而五(數字的諧音)轉換下能夠找到了,裏面不少新python教程項目,還能夠跟老司機交流討教!本文的文字及圖片來源於網絡加上本身的想法,僅供學習、交流使用,不具備任何商業用途,版權歸原做者全部,若有問題請及時聯繫咱們以做處理。

相關文章
相關標籤/搜索