python學(xué)習(xí)

使用的教材:廖雪峰教材?

另外附一個(gè)廖雪峰筆記,感覺(jué)寫的比我簡(jiǎn)練,可以用來(lái)查詢具體用法:廖雪峰筆記?

更多的可以查詢:官方文檔?

一、python基礎(chǔ)

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

2.字符串:

如果字符串內(nèi)部既包含'又包含"怎么辦?可以用轉(zhuǎn)義字符\來(lái)標(biāo)識(shí)。

轉(zhuǎn)義字符\可以轉(zhuǎn)義很多字符,比如\n表示換行,\t表示制表符,字符\本身也要轉(zhuǎn)義,所以\\表示的字符就是\。

為了簡(jiǎn)化,Python還允許用r''表示''內(nèi)部的字符串默認(rèn)不轉(zhuǎn)義。

如果字符串內(nèi)部有很多換行,用\n寫在一行里不好閱讀,為了簡(jiǎn)化,Python允許用'''...'''的格式表示多行內(nèi)容,可以自己試試:

print('''line1

line2

line3''')

3.布林值:

and運(yùn)算是與運(yùn)算,只有所有都為True,and運(yùn)算結(jié)果才是True。

or運(yùn)算是或運(yùn)算,只要其中有一個(gè)為True,or運(yùn)算結(jié)果就是True

not運(yùn)算是非運(yùn)算,它是一個(gè)單目運(yùn)算符,把True變成False,F(xiàn)alse變成True

4.空值

是Python里一個(gè)特殊的值,用None表示。None不能理解為0,因?yàn)?是有意義的,而None是一個(gè)特殊的空值。

5.變量

變量在程序中就是用一個(gè)變量名表示了,變量名必須是大小寫英文、數(shù)字和_的組合,且不能用數(shù)字開頭。python中是區(qū)分大小寫的。

6.常量

在Python中,通常用全部大寫的變量名表示常量。

整數(shù)和浮點(diǎn)數(shù)在計(jì)算機(jī)內(nèi)部存儲(chǔ)的方式是不同的,整數(shù)運(yùn)算永遠(yuǎn)是精確的(除法難道也是精確的?是的!),而浮點(diǎn)數(shù)運(yùn)算則可能會(huì)有四舍五入的誤差。

還有一種除法是//,稱為地板除,兩個(gè)整數(shù)的除法仍然是整數(shù)

用%取余數(shù)。

(二)字符串和編碼

1.編碼:

要注意區(qū)分'ABC'和b'ABC',前者是str,后者雖然內(nèi)容顯示得和前者一樣,但bytes的每個(gè)字符都只占用一個(gè)字節(jié)。

以Unicode表示的str通過(guò)encode()方法可以編碼為指定的bytes。

>>> 'ABC'.encode('ascii')

b'ABC'

>>> '中文'.encode('utf-8')

b'\xe4\xb8\xad\xe6\x96\x87'

>>> '中文'.encode('ascii')

Traceback (most recent call last):

File "", line 1, in

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

純英文的str可以用ASCII編碼為bytes,內(nèi)容是一樣的,純英文既可以用ascii也可以用utf-8.

含有中文的str可以用UTF-8編碼為bytes。含有中文的str無(wú)法用ASCII編碼,因?yàn)橹形木幋a的范圍超過(guò)了ASCII編碼的范圍,Python會(huì)報(bào)錯(cuò)。

反過(guò)來(lái),如果我們從網(wǎng)絡(luò)或磁盤上讀取了字節(jié)流,那么讀到的數(shù)據(jù)就是bytes。要把bytes變?yōu)閟tr,就需要用decode( )方法。

>>> b'ABC'.decode('ascii')

'ABC'

>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')

'中文'

2.計(jì)數(shù):

len()函數(shù)計(jì)算的是str的字符數(shù),如果換成bytes,len()函數(shù)就計(jì)算字節(jié)數(shù)。

3.開始寫代碼的時(shí)候要輸入這兩行。

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

在編輯器里面的encoding里面選中encoding in UTF-8 without BOM

4.格式化字符

我們經(jīng)常會(huì)輸出類似'親愛(ài)的xxx你好!你xx月的話費(fèi)是xx,余額是xx'之類的字符串,而xxx的內(nèi)容都是根據(jù)變量變化的,所以,需要一種簡(jiǎn)便的格式化字符串的方式。

%d整數(shù)

%f浮點(diǎn)數(shù)

%s字符串

%x十六進(jìn)制整數(shù)

>>> 'Hello, %s' % 'world'

'Hello, world'

>>> 'Hi, %s, you have $%d.' % ('Michael', 1000000)

'Hi, Michael, you have $1000000.'

如果你不太確定應(yīng)該用什么,%s永遠(yuǎn)起作用,它會(huì)把任何數(shù)據(jù)類型轉(zhuǎn)換為字符串。

有些時(shí)候,字符串里面的%是一個(gè)普通字符怎么辦?這個(gè)時(shí)候就需要轉(zhuǎn)義,用%%來(lái)表示一個(gè)%

作業(yè):

小明的成績(jī)從去年的72分提升到了今年的85分,請(qǐng)計(jì)算小明成績(jī)提升的百分點(diǎn),并用字符串格式化顯示出'xx.x%',只保留小數(shù)點(diǎn)后1位:

# -*- coding: utf-8 -*-

s1 = 72

s2 = 85

print('%.1f %%'% r)

r = (s2 - s1)/s2*100

(1f代表保留小數(shù)點(diǎn)后面1位)


(三)使用list和tupe

(1)list

Python內(nèi)置的一種數(shù)據(jù)類型是列表:list。list是一種有序的集合,可以隨時(shí)添加和刪除其中的元素。

比如,列出班里所有同學(xué)的名字,就可以用一個(gè)list表示:

>>>classmates = ['Michael','Bob','Tracy']

>>>classmates

['Michael','Bob','Tracy']

可以用len(classmates)

索引來(lái)訪問(wèn)list中每一個(gè)位置的元素,記得索引是從0開始的。

>>> classmates[0]

'Michael'

當(dāng)索引超出了范圍時(shí),Python會(huì)報(bào)一個(gè)IndexError錯(cuò)誤,所以,要確保索引不要越界,記得最后一個(gè)元素的索引是len(classmates) - 1。

如果要取最后一個(gè)元素,除了計(jì)算索引位置外,還可以用-1做索引,直接獲取最后一個(gè)元素:

>>> classmates[-1]

'Tracy'

>>> classmates[-2]

'Bob'

ist是一個(gè)可變的有序表,所以,可以往list中追加元素到末尾:

>>> classmates.append('Adam')

>>> classmates

['Michael', 'Bob', 'Tracy', 'Adam']

也可以把元素插入到指定的位置,比如索引號(hào)為1的位置:

>>> classmates.insert(1, 'Jack')

>>> classmates

['Michael', 'Jack', 'Bob', 'Tracy', 'Adam']

刪除list末尾的元素,用pop()方法:

>>> classmates.pop()

'Adam'

>>> classmates

['Michael', 'Jack', 'Bob', 'Tracy']

刪除指定位置的元素,用pop(i)方法,其中i是索引位置。

>>> classmates.pop(1)

'Jack'

要把某個(gè)元素替換成別的元素,可以直接賦值給對(duì)應(yīng)的索引位置

>>> classmates[1] = 'Sarah'

list里面的元素的數(shù)據(jù)類型也可以不同,list元素也可以是另一個(gè)list。

(二)tuple

tuple和list非常類似,但是tuple一旦初始化就不能修改。

不可變的tuple有什么意義?因?yàn)閠uple不可變,所以代碼更安全。如果可能,能用tuple代替list就盡量用tuple。

如果要定義一個(gè)空的tuple,可以寫成():

>>>t = ()

要定義一個(gè)只有1個(gè)元素的tuple,如果你這么定義:

>>> t = (1)

>>> t

1

Python規(guī)定,這種情況下,按小括號(hào)進(jìn)行計(jì)算,計(jì)算結(jié)果自然是1。

所以,只有1個(gè)元素的tuple定義時(shí)必須加一個(gè)逗號(hào),,來(lái)消除歧義:

>>> t = (1,)

>>> t

(1,)

最后來(lái)看一個(gè)“可變的”tuple:

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

>>> t[2][0] = 'X'

>>> t[2][1] = 'Y'

>>> t

('a', 'b', ['X', 'Y'])

解釋:表面上看,tuple的元素確實(shí)變了,但其實(shí)變的不是tuple的元素,而是list的元素。

(四)條件判斷

if <條件判斷1>:

<執(zhí)行1>

elif <條件判斷2>:

<執(zhí)行2>

elif <條件判斷3>:

<執(zhí)行3>

else:

<執(zhí)行4>

elif=else if

很重要的是:

if語(yǔ)句執(zhí)行有個(gè)特點(diǎn),它是從上往下判斷,如果在某個(gè)判斷上是True,把該判斷對(duì)應(yīng)的語(yǔ)句執(zhí)行后,就忽略掉剩下的elif和else

if判斷條件還可以簡(jiǎn)寫,比如寫

if x:

print('True')

只要x是非零數(shù)值、非空字符串、非空l(shuí)ist等,就判斷為True,否則為False。


注:

【1】善用input函數(shù),讀取用戶輸入的數(shù)字要把數(shù)字從str()變成int()

很多同學(xué)會(huì)用input()讀取用戶的輸入,這樣可以自己輸入,程序運(yùn)行得更有意思

birth = input('birth: ')

if birth < 2000:

print('00前')

else:

print('00后')

但是輸入以后會(huì)報(bào)錯(cuò)。這是因?yàn)閕nput返回的是str(), str不能直接和整數(shù)比較,必須先把str轉(zhuǎn)換成整數(shù)。Python提供了int()函數(shù)來(lái)完成這件事情。因此代碼要改成:

s = input('birth: ')

birth = int(s)

if birth < 2000:

print('00前')

else:

print('00后'

很重要:print('%.1f %%'% r)

(五)循環(huán)

1.? 一種是for...in循環(huán),依次把list或tuple中的每個(gè)元素迭代出來(lái),看例子

names = ['Michael', 'Bob', 'Tracy']

for name in names:

print(name)

range(101)就可以生成0-100的整數(shù)序列

2.第二種循環(huán)是while循環(huán),只要條件滿足,就不斷循環(huán),條件不滿足時(shí)退出循環(huán)。比如我們要計(jì)算100以內(nèi)所有奇數(shù)之和,可以用while循環(huán)實(shí)現(xiàn)。

sum = 0

n = 99

while n > 0:

sum = sum + n

n = n - 2

print(sum)

(六)使用dict和set

1.dict

dict全稱dictionary,在其他語(yǔ)言中也稱為map,使用鍵-值(key-value)存儲(chǔ),具有極快的查找速度。

>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}

>>> d['Michael']

95

>>> d['Adam'] = 67

>>> d['Adam']

67

由于一個(gè)key只能對(duì)應(yīng)一個(gè)value,所以,多次對(duì)一個(gè)key放入value,后面的值會(huì)把前面的值沖掉。

如果key不存在,dict就會(huì)報(bào)錯(cuò)。字母是key,數(shù)字是value.

要避免key不存在的錯(cuò)誤,有兩種辦法,一是通過(guò)in判斷key是否存在:

>>> 'Thomas' in d

False

要?jiǎng)h除一個(gè)key,用pop(key)方法,對(duì)應(yīng)的value也會(huì)從dict中刪除:

>>> d.pop('Bob')

75

dict是用空間來(lái)?yè)Q取時(shí)間的一種方法。

很重要:

需要牢記的第一條就是dict的key必須是不可變對(duì)象。

這是因?yàn)閐ict根據(jù)key來(lái)計(jì)算value的存儲(chǔ)位置,如果每次計(jì)算相同的key得出的結(jié)果不同,那dict內(nèi)部就完全混亂了。這個(gè)通過(guò)key計(jì)算位置的算法稱為哈希算法(Hash)。(因此list是可變的,就不能作為key。)

2.set

set和dict類似,也是一組key的集合,但不存儲(chǔ)value。key不能重復(fù)。如果重復(fù)了就會(huì)被自動(dòng)過(guò)濾掉。因此說(shuō)明顯示的順序不表示set是有序的。

創(chuàng)建一個(gè)set:

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

>>> s

{1, 2, 3}

通過(guò)add(key)方法可以添加元素到set中

>>> s.add(4)

>>> s

{1, 2, 3, 4}

通過(guò)remove(key)方法可以刪除元素

>>> s.remove(4)

>>> s

{1, 2, 3}

兩個(gè)set可以做數(shù)學(xué)意義上的交集、并集等操作:

>>> s1 & s2

{2, 3}

>>> s1 | s2

{1, 2, 3, 4}

set和dict的唯一區(qū)別僅在于沒(méi)有存儲(chǔ)對(duì)應(yīng)的value,但是,set的原理和dict一樣,所以,同樣不可以放入可變對(duì)象,因?yàn)闊o(wú)法判斷兩個(gè)可變對(duì)象是否相等,也就無(wú)法保證set內(nèi)部“不會(huì)有重復(fù)元素”。把list放入set,會(huì)報(bào)錯(cuò)。


注:

str是不變對(duì)象,而list是可變對(duì)象

所以,對(duì)于不變對(duì)象來(lái)說(shuō),調(diào)用對(duì)象自身的任意方法,也不會(huì)改變?cè)搶?duì)象自身的內(nèi)容。相反,這些方法會(huì)創(chuàng)建新的對(duì)象并返回,這樣,就保證了不可變對(duì)象本身永遠(yuǎn)是不可變的。


二.函數(shù)

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

max函數(shù)max()可以接收任意多個(gè)參數(shù),并返回最大的那個(gè):

>>> max(1, 2)

2

>>> max(2, 3, 1, -5)

3

二、定義函數(shù)

函數(shù)體內(nèi)部的語(yǔ)句在執(zhí)行時(shí),一旦執(zhí)行到return時(shí),函數(shù)就執(zhí)行完畢,并將結(jié)果返回。因此,函數(shù)內(nèi)部通過(guò)條件判斷和循環(huán)可以實(shí)現(xiàn)非常復(fù)雜的邏輯。

def my_abs(x):

if x >= 0:

return x

else:

return -x

請(qǐng)注意,函數(shù)體內(nèi)部的語(yǔ)句在執(zhí)行時(shí),一旦執(zhí)行到return時(shí),函數(shù)就執(zhí)行完畢,并將結(jié)果返回。因此,函數(shù)內(nèi)部通過(guò)條件判斷和循環(huán)可以實(shí)現(xiàn)非常復(fù)雜的邏輯。

如果沒(méi)有return語(yǔ)句,函數(shù)執(zhí)行完畢后也會(huì)返回結(jié)果,只是結(jié)果為None。

return None可以簡(jiǎn)寫為return。

如果想定義一個(gè)什么事也不做的空函數(shù),可以用pass語(yǔ)句:

def nop():

pass

pass可以用來(lái)作為占位符,比如現(xiàn)在還沒(méi)想好怎么寫函數(shù)的代碼,就可以先放一個(gè)pass,讓代碼能運(yùn)行起來(lái)?;蛘呖桃饴赃^(guò),否則會(huì)有語(yǔ)法錯(cuò)誤。


注意:

1.當(dāng)傳入了不恰當(dāng)?shù)膮?shù)時(shí),內(nèi)置函數(shù)abs會(huì)檢查出參數(shù)錯(cuò)誤,而我們定義的my_abs沒(méi)有參數(shù)檢查,會(huì)導(dǎo)致if語(yǔ)句出錯(cuò),出錯(cuò)信息和abs不一樣。所以,這個(gè)函數(shù)定義不夠完善。

因此如果自己寫的函數(shù)要能夠檢查參數(shù)錯(cuò)誤的話,就要用函數(shù)isinstance()實(shí)現(xiàn):

def my_abs(x):

if not isinstance(x, (int, float)):

raise TypeError('bad operand type')

if x >= 0:

return x

else:

return -x


返回多個(gè)值:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 最近在慕課網(wǎng)學(xué)習(xí)廖雪峰老師的Python進(jìn)階課程,做筆記總結(jié)一下重點(diǎn)。 基本變量及其類型 變量 在Python中,...
    victorsungo閱讀 1,746評(píng)論 0 5
  • Python 是一種相當(dāng)高級(jí)的語(yǔ)言,通過(guò) Python 解釋器把符合語(yǔ)法的程序代碼轉(zhuǎn)換成 CPU 能夠執(zhí)行的機(jī)器碼...
    Python程序媛閱讀 1,951評(píng)論 0 3
  • 教程總綱:http://www.runoob.com/python/python-tutorial.html 進(jìn)階...
    健康哥哥閱讀 2,077評(píng)論 1 3
  • Python 基礎(chǔ) 此學(xué)習(xí)筆記參照廖雪峰老師的網(wǎng)上Python教程,參考鏈接:http://www.liaoxue...
    斷尾壁虎V閱讀 1,623評(píng)論 0 1
  • 孩子,你睡得正熟,聽著你輕輕的呼吸聲,,你的小臉頰尤其的可愛(ài)。我撫摸著你的臉頰,此時(shí)的我,我才能感覺(jué)到自己...
    初心_f755閱讀 210評(píng)論 0 0