Python入門筆記

Python入門

希望大家喜歡,點(diǎn)贊哦

Python變量和數(shù)據(jù)類型

數(shù)據(jù)類型

print語句

注釋

Python的注釋以 # 開頭,后面的文字直到行尾都算注釋

# 這一行全部都是注釋...
print 'hello' # 這也是注釋

什么是變量

定義字符串

字符串可以用''或者""括起來表示。

如果字符串本身包含'怎么辦?比如我們要表示字符串 I'm OK ,這時(shí),可以用" "括起來表示:

"I'm OK"
類似的,如果字符串包含",我們就可以用' '括起來表示:

'Learn "Python" in imooc'
如果字符串既包含'又包含"怎么辦?

這個(gè)時(shí)候,就需要對(duì)字符串的某些特殊字符進(jìn)行“轉(zhuǎn)義”,Python字符串用\進(jìn)行轉(zhuǎn)義。

要表示字符串 Bob said "I'm OK".
由于 ' 和 " 會(huì)引起歧義,因此,我們?cè)谒懊娌迦胍粋€(gè)\表示這是一個(gè)普通字符,不代表字符串的起始,因此,這個(gè)字符串又可以表示為

'Bob said "I'm OK".'
注意:轉(zhuǎn)義字符 \ 不計(jì)入字符串的內(nèi)容中。

常用的轉(zhuǎn)義字符還有:

\n 表示換行
\t 表示一個(gè)制表符
\ 表示 \ 字符本身

raw字符串與多行字符串

我們可以在字符串前面加個(gè)前綴 r ,表示這是一個(gè) raw 字符串,里面的字符就不需要轉(zhuǎn)義了。例如:

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

但是r'...'表示法不能表示多行字符串,也不能表示包含'和 "的字符串(為什么?)

如果要表示多行字符串,可以用'''...'''表示:

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

上面這個(gè)字符串的表示方法和下面的是完全一樣的:

'Line 1\nLine 2\nLine 3'

還可以在多行字符串前面添加 r ,把這個(gè)多行字符串也變成一個(gè)raw字符串:

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

Unicode字符串

轉(zhuǎn)義:

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

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

raw+多行:

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

整數(shù)和浮點(diǎn)數(shù)

布爾類型

List和Tuple類型

list

按照索引訪問list

倒序訪問list

添加新元素

第一個(gè)辦法是用 list 的 append() 方法,把新同學(xué)追加到 list 的末尾:

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

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

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

從list刪除元素

  • 最后一個(gè)元素,我們可以用list的pop()方法刪除:
     >>> L = ['Adam', 'Lisa', 'Bart', 'Paul']
    >>> L.pop()
    'Paul'
    >>> print L
    ['Adam', 'Lisa', 'Bart']

pop()方法總是刪掉list的最后一個(gè)元素,并且它還返回這個(gè)元素,所以我們執(zhí)行 L.pop() 后,會(huì)打印出 'Paul'

如果Paul同學(xué)不是排在最后一個(gè)怎么辦?比如Paul同學(xué)排在第三:

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

替換元素

替換時(shí)直接賦值

tuple

tuple是另一種有序的列表,中文翻譯為“ 元組 ”。tuple 和 list 非常類似,但是,tuple一旦創(chuàng)建完畢,就不能修改了。

創(chuàng)建tuple和創(chuàng)建list唯一不同之處是用( )替代了[ ]。

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

創(chuàng)建單元素tuple

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

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

創(chuàng)建包含1個(gè)元素的 tuple 呢?來試試:

>>> t = (1)
>>> print t
1
好像哪里不對(duì)!t 不是 tuple ,而是整數(shù)1。為什么呢?

因?yàn)?)既可以表示tuple,又可以作為括號(hào)表示運(yùn)算時(shí)的優(yōu)先級(jí),結(jié)果 (1) 被Python解釋器計(jì)算出結(jié)果 1,導(dǎo)致我們得到的不是tuple,而是整數(shù) 1。

正是因?yàn)橛?)定義單元素的tuple有歧義,所以 Python 規(guī)定,單元素 tuple 要多加一個(gè)逗號(hào)“,”,這樣就避免了歧義:

>>> t = (1,)
>>> print t
(1,)
Python在打印單元素tuple時(shí),也自動(dòng)添加了一個(gè)“,”,為了更明確地告訴你這是一個(gè)tuple。

“可變的tuple”

前面我們看到了tuple一旦創(chuàng)建就不能修改?,F(xiàn)在,我們來看一個(gè)“可變”的tuple:

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

注意到 t 有 3 個(gè)元素:'a','b'和一個(gè)list:['A', 'B']。list作為一個(gè)整體是tuple的第3個(gè)元素。list對(duì)象可以通過 t[2] 拿到:

>>> L = t[2]
然后,我們把list的兩個(gè)元素改一改:

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

再看看tuple的內(nèi)容:

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

條件判斷和循環(huán)

if語句

for循環(huán)

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

### while循環(huán)

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

break與continue

在循環(huán)過程中,可以用break退出當(dāng)前循環(huán),還可以用continue跳過后續(xù)循環(huán)代碼,繼續(xù)下一次循環(huán)。

多重循環(huán)

Dict和Set類型

什么是dict

用 dict 表示“名字”-“成績(jī)”的查找表如下:

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

我們把名字稱為key,對(duì)應(yīng)的成績(jī)稱為value,dict就是通過 key 來查找 value。

花括號(hào) {} 表示這是一個(gè)dict,然后按照 key: value, 寫出來即可。最后一個(gè) key: value 的逗號(hào)可以省略。

訪問dict

d[key] 的形式來查找對(duì)應(yīng)的 value,這和 list 很像,不同之處是,list 必須使用索引返回對(duì)應(yīng)的元素,而dict使用key:

注意: 通過 key 訪問 dict 的value,只要 key 存在,dict就返回對(duì)應(yīng)的value。如果key不存在,會(huì)直接報(bào)錯(cuò):KeyError。

要避免 KeyError 發(fā)生,有兩個(gè)辦法:

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

如果 'Paul' 不存在,if語句判斷為False,自然不會(huì)執(zhí)行 print d['Paul'] ,從而避免了錯(cuò)誤。

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

dict的特點(diǎn)

  • 查找速度快,無論dict有10個(gè)元素還是10萬個(gè)元素,查找速度都一樣。而list的查找速度隨著元素增加而逐漸下降。

不過dict的查找速度快不是沒有代價(jià)的,**dict的缺點(diǎn)是占用內(nèi)存大,還會(huì)浪費(fèi)很多內(nèi)容,list正好相反,占用內(nèi)存小,但是查找速度慢。

  • 由于dict是按 key 查找,所以,在一個(gè)dict中,key不能重復(fù)。

  • 存儲(chǔ)的key-value序?qū)κ菦]有順序的!這和list不一樣:

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

當(dāng)我們?cè)噲D打印這個(gè)dict時(shí):

>>> print d
{'Lisa': 85, 'Adam': 95, 'Bart': 59}
打印的順序不一定是我們創(chuàng)建時(shí)的順序,而且,不同的機(jī)器打印的順序都可能不同,這說明dict內(nèi)部是無序的,不能用dict存儲(chǔ)有序的集合。
  • **是作為 key 的元素必須不可變,Python的基本類型如字符串、整數(shù)、浮點(diǎn)數(shù)都是不可變的,都可以作為 key。但是list是可變的,就不能作為 key。

可以試試用list作為key時(shí)會(huì)報(bào)什么樣的錯(cuò)誤。

不可變這個(gè)限制僅作用于key,value是否可變無所謂:

{
'123': [1, 2, 3], # key 是 str,value是list
123: '123', # key 是 int,value 是 str
('a', 'b'): True # key 是 tuple,并且tuple的每個(gè)元素都是不可變對(duì)象,value是 boolean
}
最常用的key還是字符串,因?yàn)橛闷饋碜罘奖恪?/p>

更新dict

要把新同學(xué)'Paul'的成績(jī) 72 加進(jìn)去,用賦值語句:

>>> d['Paul'] = 72

遍歷dict

直接使用for循環(huán)可以遍歷 dict 的 key:

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

什么是set

dict的作用是建立一組 key 和一組 value 的映射關(guān)系,dict的key是不能重復(fù)的。

有的時(shí)候,我們只想要 dict 的 key,不關(guān)心 key 對(duì)應(yīng)的 value,目的就是保證這個(gè)集合的元素不會(huì)重復(fù),這時(shí),set就派上用場(chǎng)了。

set 持有一系列元素,這一點(diǎn)和 list 很像,但是set的元素沒有重復(fù),而且是無序的,這點(diǎn)和 dict 的 key很像。

所以set可以作為dict的key

訪問set

訪問 set中的某個(gè)元素實(shí)際上就是判斷一個(gè)元素是否在set中。

例如,存儲(chǔ)了班里同學(xué)名字的set:

`>>> s = set(['Adam', 'Lisa', 'Bart', 'Paul'])
我們可以用 **in **操作符判斷:

Bart是該班的同學(xué)嗎?

>>> 'Bart' in s
True

set的特點(diǎn)

  • set的內(nèi)部結(jié)構(gòu)和dict很像,唯一區(qū)別是不存儲(chǔ)value,因此,判斷一個(gè)元素是否在set中速度很快。

  • set存儲(chǔ)的元素和dict的key類似,必須是不變對(duì)象,因此,任何可變對(duì)象是不能放入set中的。

  • set存儲(chǔ)的元素也是沒有順序的。

遍歷set

由于 set 也是一個(gè)集合,所以,遍歷 set 和遍歷 list 類似,都可以通過 for 循環(huán)實(shí)現(xiàn)。

直接使用 for 循環(huán)可以遍歷 set 的元素:

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

更新set

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

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

如果添加的元素已經(jīng)存在于set中,add()不會(huì)報(bào)錯(cuò),但是不會(huì)加進(jìn)去了:

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

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

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

如果刪除的元素不存在set中,remove()會(huì)報(bào)錯(cuò):

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

所以用add()可以直接添加,而remove()前需要判斷。

函數(shù)

什么是函數(shù)

調(diào)用函數(shù)

編寫函數(shù)

返回多值

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

Python的函數(shù)返回多值其實(shí)就是返回一個(gè)tuple,但寫起來更方便。

遞歸函數(shù)

漢諾塔

定義默認(rèn)參數(shù)

定義可變參數(shù)

如果想讓一個(gè)函數(shù)能接受任意個(gè)參數(shù),我們就可以定義一個(gè)可變參數(shù):

def fn(*args):
    print args

可變參數(shù)也不是很神秘,Python解釋器會(huì)把傳入的一組參數(shù)組裝成一個(gè)tuple傳遞給可變參數(shù),因此,在函數(shù)內(nèi)部,直接把變量 args 看成一個(gè) tuple 就好了。

切片

對(duì)list進(jìn)行切片

取前N個(gè)元素,也就是索引為0-(N-1)的元素,可以用循環(huán):

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

對(duì)這種經(jīng)常取指定索引范圍的操作,用循環(huán)十分繁瑣,因此,Python提供了切片(Slice)操作符,能大大簡(jiǎn)化這種操作。

對(duì)應(yīng)上面的問題,取前3個(gè)元素,用一行代碼就可以完成切片:

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

只用一個(gè) : ,表示從頭到尾:

>>> L[:]
['Adam', 'Lisa', 'Bart', 'Paul']
因此,L[:]實(shí)際上復(fù)制出了一個(gè)新list。

切片操作還可以指定第三個(gè)參數(shù):

>>> L[::2]
['Adam', 'Bart']
第三個(gè)參數(shù)表示每N個(gè)取一個(gè),上面的 L[::2] 會(huì)每?jī)蓚€(gè)元素取出一個(gè)來,也就是隔一個(gè)取一個(gè)。

把list換成tuple,切片操作完全相同,只是切片的結(jié)果也變成了tuple。

倒序切片

對(duì)字符串切片

字符串 'xxx'和 Unicode字符串 u'xxx'也可以看成是一種list,每個(gè)元素就是一個(gè)字符。因此,字符串也可以用切片操作,只是操作結(jié)果仍是字符串

迭代

什么是迭代

在Python中,如果給定一個(gè)list或tuple,我們可以通過for循環(huán)來遍歷這個(gè)list或tuple,這種遍歷我們成為迭代(Iteration)。

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

因?yàn)?Python 的 for循環(huán)不僅可以用在list或tuple上,還可以作用在其他任何可迭代對(duì)象上。

因此,迭代操作就是對(duì)于一個(gè)集合,無論該集合是有序還是無序,我們用 for 循環(huán)總是可以依次取出集合的每一個(gè)元素。

注意: 集合是指包含一組元素的數(shù)據(jù)結(jié)構(gòu),我們已經(jīng)介紹的包括:

  1. 有序集合:list,tuple,str和unicode;
  2. 無序集合:set
  3. 無序集合并且具有 key-value 對(duì):dict
    而迭代是一個(gè)動(dòng)詞,它指的是一種操作,在Python中,就是 for 循環(huán)。

索引迭代

**Python中,迭代永遠(yuǎn)是取出元素本身,而非元素的索引。

對(duì)于有序集合,元素確實(shí)是有索引的。有的時(shí)候,我們確實(shí)想在 for 循環(huán)中拿到索引,怎么辦?

方法是使用 enumerate() 函數(shù):

>>> 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 對(duì)象有一個(gè) values() 方法,這個(gè)方法把dict轉(zhuǎn)換成一個(gè)包含所有value的list,這樣,我們迭代的就是 dict的每一個(gè) value:

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

如果仔細(xì)閱讀Python的文檔,還可以發(fā)現(xiàn),dict除了values()方法外,還有一個(gè) itervalues() 方法,用 itervalues() 方法替代 values() 方法,迭代效果完全一樣:

*那這兩個(gè)方法有何不同之處呢?

  1. values() 方法實(shí)際上把一個(gè) dict 轉(zhuǎn)換成了包含 value 的list。

  2. 但是 itervalues() 方法不會(huì)轉(zhuǎn)換,它會(huì)在迭代過程中依次從 dict 中取出 value,所以 itervalues() 方法比 values() 方法節(jié)省了生成 list 所需的內(nèi)存。

  3. 打印 itervalues() 發(fā)現(xiàn)它返回一個(gè) <dictionary-valueiterator> 對(duì)象,這說明在Python中,for 循環(huán)可作用的迭代對(duì)象遠(yuǎn)不止 list,tuple,str,unicode,dict等,任何可迭代對(duì)象都可以作用于for循環(huán),而內(nèi)部如何迭代我們通常并不用關(guān)心。

迭代dict的key和value

items() 方法把dict對(duì)象轉(zhuǎn)換成了包含tuple的list,我們對(duì)這個(gè)list進(jìn)行迭代,可以同時(shí)獲得key和value:

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

和 values() 有一個(gè) itervalues() 類似, items() 也有一個(gè)對(duì)應(yīng)的 iteritems(),iteritems() 不把dict轉(zhuǎn)換成list,而是在迭代過程中不斷給出 tuple,所以, iteritems() 不占用額外的內(nèi)存。

列表生成式

生成列表

要生成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]怎么做?方法一是循環(huán):

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

但是循環(huán)太繁瑣,而列表生成式則可以用一行語句代替循環(huán)生成上面的list:

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

這種寫法就是Python特有的列表生成式。利用列表生成式,可以以非常簡(jiǎn)潔的代碼生成 list。

復(fù)雜表達(dá)式

假設(shè)有如下的dict:

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

完全可以通過一個(gè)復(fù)雜的列表生成式把它變成一個(gè) 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()方法可以把一個(gè) list 拼接成一個(gè)字符串

條件過濾

列表生成式的 for 循環(huán)后面還可以加上 if 判斷。例如:

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

有了 if 條件,只有 if 判斷為 True 的時(shí)候,才把循環(huán)的當(dāng)前元素添加到列表中。

多層表達(dá)式

for循環(huán)可以嵌套,因此,在列表生成式中,也可以用多層 for 循環(huán)來生成列表。

對(duì)于字符串 'ABC' 和 '123',可以使用兩層循環(huán),生成全排列:

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

翻譯成循環(huán)代碼就像下面這樣:

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

希望大家喜歡,點(diǎn)贊哦

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、python 變量和數(shù)據(jù)類型 1.整數(shù) Python可以處理任意大小的整數(shù),當(dāng)然包括負(fù)整數(shù),在Python程序...
    績(jī)重KF閱讀 2,032評(píng)論 0 1
  • 最近在慕課網(wǎng)學(xué)習(xí)廖雪峰老師的Python進(jìn)階課程,做筆記總結(jié)一下重點(diǎn)。 基本變量及其類型 變量 在Python中,...
    victorsungo閱讀 1,970評(píng)論 0 5
  • 注:資料來源于慕課網(wǎng)Python入門轉(zhuǎn)載請(qǐng)附上原文地址:http://m.itdecent.cn/p/8d85...
    黑丫山上小旋風(fēng)閱讀 1,088評(píng)論 0 10
  • 注:資料來源于慕課網(wǎng)Python入門轉(zhuǎn)載請(qǐng)附上原文地址:http://m.itdecent.cn/p/5406...
    黑丫山上小旋風(fēng)閱讀 855評(píng)論 0 2
  • 各位尊敬的法官:我首先介紹一下我自己,本人,余振新,男,42歲,戶籍,安徽省蕪湖,現(xiàn)居住旌德縣廟首鎮(zhèn)廟首社區(qū)豐溪前...
    余寧莫閱讀 1,708評(píng)論 0 0

友情鏈接更多精彩內(nèi)容