學(xué)了吳恩達(dá)老師的視頻,發(fā)現(xiàn)自己的代碼真的很不ok?。。。。。。?!所以覺得把python基礎(chǔ)教程這本書仔仔細(xì)細(xì)看完,然后開始記錄下一本書?。?!下面都是我自己記錄的啊 (只對(duì)我認(rèn)為的重點(diǎn)進(jìn)行記錄),可能會(huì)有雷同?。?!但是都是一本書啊!?。。。?!有問題提出來?。?!讓我們蕩起雙槳,讓我們推開波浪,一起進(jìn)步哈哈哈哈哈哈哈哈哈哈
1.1 交互式解釋器
這一小節(jié)講得好簡(jiǎn)單的,講了一些重點(diǎn):
在python總不需要每行末尾都加上分號(hào)
遇到不懂的問題,可以輸入命令help()
1.2 算法
這一本書中把算法講得很通熟易懂。
算法只不過是流程或菜譜的時(shí)髦說法,請(qǐng)看下面的菜譜:
雞蛋火腿腸:先取一些火腿腸。再加些火腿腸和雞蛋。
如果喜歡吃辣,加些辣味火腿腸。
煮熟為止。記得每隔10分鐘檢查一次。
是不是講得很通俗易懂。這個(gè)菜譜的結(jié)構(gòu)很有啟發(fā)性。它由一系列必須按順序執(zhí)行的操作說明組成,其中有些可直接完成(取些火腿腸),有些需要特別注意(如果喜歡吃辣),還有一些需要重復(fù)多次(每隔10分鐘檢查一次)。
菜譜和算法都由原料(對(duì)象)和操作說明(語句)組成。在這個(gè)示例中,火腿腸和雞蛋是原料,而操作說明包括添加火腿腸、烹飪指定的時(shí)間等。下面來介紹一些簡(jiǎn)單的python原料。
1.3 數(shù)和表達(dá)式
一些很簡(jiǎn)單的操作這里就跳過了。
>>> 2+2
4
>>> 646+38373
39019
>>> 1/2
0.5
>>> 1/1
1.0
從上面的代碼結(jié)果,你會(huì)發(fā)現(xiàn)同樣是整數(shù)的運(yùn)算,除法運(yùn)算的結(jié)果會(huì)有小數(shù)點(diǎn),即浮點(diǎn)數(shù)(float或floating-point number)
如果你想丟棄小數(shù)部分,即執(zhí)行整數(shù)運(yùn)算,可使用雙斜杠。
>>> 1//2
0
>>> 1//1
1
>>> 5.0//2.4
2.0
看到最后一個(gè)結(jié)果為2.0,因?yàn)槟爿斎氲?,就是小?shù)點(diǎn)后一位,即使你是這樣輸入,雖然結(jié)果也會(huì)是小數(shù)點(diǎn)的后一位,但是也會(huì)被丟棄小數(shù)部分,所以5.0//2.4會(huì)是2.0。
求余與取整
>>> 1%2
1
上面代碼中的%是求余(求模)運(yùn)算符。x%y的結(jié)果為x除以y的余數(shù)。換而言之,結(jié)果為執(zhí)行整除時(shí)余下的部分,即x%y等價(jià)于x-((x//y*y)??聪旅娴睦訒?huì)更好理解。
>>> 10//3
3
>>> 10%3
1
>>> 9//3
3
>>> 9%3
0
>>> 2.75%0.5
0.25
從最后一個(gè)示例可知,求余運(yùn)算符也可用于浮點(diǎn)數(shù)。這種運(yùn)算符甚至可用于負(fù)數(shù),但可能不那么好理解。
我們先來理解整除,整除理解通透后,求余可以通過x-((x//y*y)這個(gè)公式來計(jì)算,就好理解很多啦。
>>> 10//3
3
>>> 10//-3
-4
>>> -10//3
-4
>>> -10//-3
3
先看第一條公式,10//3(10整除3),正常來說10/3=3.33....,但是既然用了//那么結(jié)果就會(huì)丟棄小數(shù)部分,在python中,對(duì)于整除運(yùn)算,python是取向下圓整的結(jié)果(取比原數(shù)據(jù)小的那個(gè)整數(shù)),所以3.33向下圓整就是3,10//3的結(jié)果就是3。
再看第二條10//-3,正常來說10//-3=-3.33....,然后向下取整,取比-3.333...小的整數(shù),就是-4啦
講到這里取整應(yīng)該大概懂了吧?。。?!然后求余的時(shí)候就代入x-((x//y*y)這個(gè)公式來計(jì)算。
求冪
其實(shí)求冪很好懂啦,在下面我放幾個(gè)例子就能懂啦
>>> 2**3
8
>>> -3**2
-9
>>> (-3)**2
9
1.4 變量
變量表示(或指向)特定值的名稱。例如,你可能想使用名稱x來表示3,為此執(zhí)行如下代碼:
>>> x=3
這稱為賦值(assignment),我們將值3賦給了變量x。換而言之,就是將變量x與值(或?qū)ο螅?關(guān)聯(lián)起來。給變量賦值后,就可在表達(dá)式中使用它。
不同于其他一些語言,使用python變量前必須給它賦值,因?yàn)閜ython變量沒有默認(rèn)值。
注意:在python中,名稱(標(biāo)識(shí)符)只能由字母、數(shù)字和下劃線(_)構(gòu)成,且不能以數(shù)字大頭。
1.6 獲取用戶輸入
下面介紹一個(gè)有用的函數(shù)input
>>> input("The meaning of life :")#在鍵盤中輸入45,然后按回車
The meaning of life :45
'45'
本小節(jié)提前講了if語句。
通過使用if語句,可在給定條件滿足時(shí)執(zhí)行特定的操作(另一條語句)。一種條件是使用相等運(yùn)算符(==)表示的相等性檢查。相等運(yùn)算符就是兩個(gè)等號(hào)(一個(gè)等號(hào)用于賦值)
>>> if 1==2 : print('One equals two')
...
>>> if 1==1 : print('One equals one')#相等才會(huì)有結(jié)果輸出
...
One equals one
看到上面的代碼我們可以知道,當(dāng)條件不滿足時(shí),什么都不做,當(dāng)條件滿足時(shí),就會(huì)執(zhí)行冒號(hào)后面的語句(即代碼中的print語句)。需要注意的另一點(diǎn)是,在交互式解釋器中輸入if語句后,需要按兩次回車鍵才能執(zhí)行。
1.7 函數(shù)
在python中提供了很多函數(shù),可以用來完成很多神奇的任務(wù)。實(shí)際上,你也可以自己編寫函數(shù)(這個(gè)后面會(huì)詳細(xì)說)。
>>> pow(2,3)
8
我們通常將pow等標(biāo)準(zhǔn)函數(shù)稱為內(nèi)置函數(shù),這種使用函數(shù)的行為稱為調(diào)用函數(shù):你向它提供實(shí)參(這里是2和3),而它返回一個(gè)值。實(shí)際上,我們可以結(jié)合使用函數(shù)調(diào)用和元素符來編寫更復(fù)雜的表達(dá)式。
>>> 10+pow(2,3*4)/3
1375.3333333333333
有很多內(nèi)置函數(shù)可用于編寫數(shù)值表達(dá)式。
>>> abs(-20)#取絕對(duì)值
20
>>> 2//3#結(jié)果向下圓整
0
>>> round(2/3)#四舍五入
1
這里我們需要注意一點(diǎn),在python中,整數(shù)總是向下圓整的,但是round函數(shù)是四舍五入函數(shù),就和我們平時(shí)的四舍五入一樣,round(3.6)=4。完成向下圓整這個(gè)任務(wù)有其他函數(shù),例如floor可以完成,但是你要導(dǎo)入模塊,下面會(huì)講到。
1.8 模塊
我們可以將模塊視為擴(kuò)展,通過將其導(dǎo)入可以擴(kuò)展python功能,要導(dǎo)入模塊,可使用特殊命令import。前一小節(jié)體積的函數(shù)floor就包含在模塊math中。
>>> floor(2/3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'floor' is not defined
>>> import math
>>> math.floor(3.6)
3
>>> round(3.6)
4
>>> int(3.6)
3
>>> float(3)
3.0
當(dāng)我們直接使用floor函數(shù)時(shí),會(huì)報(bào)錯(cuò),因?yàn)槲覀儧]有導(dǎo)入模塊,當(dāng)我們導(dǎo)入模塊后,就可以使用floor函數(shù)了,從上面代碼上也可以看出floor函數(shù)和round函數(shù)的區(qū)別。當(dāng)然int也是取整數(shù)的作用。但是int只是用于轉(zhuǎn)換類型,把3.6轉(zhuǎn)換成整數(shù)3,類似的還有str、float等。int、str、float并不是函數(shù),而是類(后面會(huì)詳細(xì)介紹)。
模塊math還包含其他幾個(gè)很有用的函數(shù)。例如,ceil與floor相反,返回大于或等于給定數(shù)的最小整數(shù)。
>>> math.ceil(32.3)#返回大于或等于給定數(shù)的最小整數(shù)
33
>>> math.ceil(32)
32
>>> math.floor(32.3)#向下圓整
32
如果確定不會(huì)從不同模塊導(dǎo)入多個(gè)同名函數(shù),你可能不想每次調(diào)用函數(shù)時(shí)都指定模塊名。在這種情況下,可使用命令import的如下變種:
>>> from math import floor
通過from module import function,可在調(diào)用函數(shù)時(shí)不指定模塊前綴。
注意:事實(shí)上,可以使用變量來引用函數(shù)和模塊。執(zhí)行賦值語句foo=math.sqrt后,就可使用foo來計(jì)算平方根。
>>> import math as ma#使用變量ma來引用模塊math
>>> ma.floor(3.6)
3
>>> foo=ma.floor#使用變量foo來引用函數(shù)floor
>>> foo(3.6)
3
1.8.1 cmath和復(fù)數(shù)
>>> from math import sqrt
>>> sqrt(-1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: math domain error
當(dāng)我們?cè)趍ath模塊中導(dǎo)入sqrt并使用時(shí),當(dāng)輸入的數(shù)字是負(fù)數(shù)時(shí),會(huì)出現(xiàn)以上報(bào)錯(cuò)。
如果我們堅(jiān)持將值域限定為實(shí)數(shù),并使用其近似的浮點(diǎn)數(shù)實(shí)現(xiàn),就無法計(jì)算負(fù)數(shù)的平方根。負(fù)數(shù)的平方根為虛數(shù),而由實(shí)部和虛部組成的數(shù)為復(fù)數(shù)。Python標(biāo)準(zhǔn)庫提供了一個(gè)專門用于處理復(fù)數(shù)的模塊cmath。
>>> import cmath
>>> cmath.sqrt(-1)
1j
注意到這里沒有使用from ... import ...。如果使用了這種import命令,將無法使用常規(guī)函數(shù)sqrt。類似這樣的名稱沖突很隱蔽,因此除非必須使用from版的import命令,否則應(yīng)堅(jiān)持使用常規(guī)版import命令。
1j是個(gè)虛數(shù),虛數(shù)都以j(或J)結(jié)尾。復(fù)數(shù)算術(shù)運(yùn)算都基于如下定義:-1的平方根為1j。虛數(shù)同樣也可以計(jì)算。
>>> (1+3j)*(9+4j)
(-3+31j)
python本身提供了對(duì)復(fù)數(shù)的支持,但是python沒有專門表示虛數(shù)的類型,而將虛數(shù)視為實(shí)部為零的復(fù)數(shù)。
1.8.2 回到未來
據(jù)說Python之父Guido van Rossum有一臺(tái)時(shí)光機(jī),因?yàn)檫@樣的情況出現(xiàn)了多次:大家要求Python提供某項(xiàng)功能時(shí),卻發(fā)現(xiàn)這項(xiàng)功能早已實(shí)現(xiàn)。當(dāng)然,并非什么人都能進(jìn)入這臺(tái)時(shí)光機(jī),不過Guido很體貼,通過神奇模塊future讓Python具備了時(shí)光機(jī)的部分功能。對(duì)于Python當(dāng)前不支持,但未來將成為標(biāo)準(zhǔn)組成部分的功能,你可從這個(gè)模塊進(jìn)行導(dǎo)入。
Python提供了future模塊,把下一個(gè)新版本的特性導(dǎo)入到當(dāng)前版本,于是我們就可以在當(dāng)前版本中測(cè)試一些新版本的特性。這個(gè)后面也會(huì)慢慢用到。
1.9 執(zhí)行程序
當(dāng)你在cmd或者linux上運(yùn)行python.py文件時(shí),你只需要輸入:
python python.py
1.10 字符串
1.10.1 單引號(hào)字符串與雙引號(hào)
在python中使用單引號(hào)和雙引號(hào)是沒有任何差別的。但是當(dāng)你在語句中有單引號(hào)時(shí),你應(yīng)該在引號(hào)前加上\
>>> 'let's go'
File "<stdin>", line 1
'let's go'
^
SyntaxError: invalid syntax
>>> 'let\' go'
"let' go"
1.10.2 拼接字符串
直接看例子!
>>> "hello,""world"
'hello,world'
>>> x='hello,'
>>> y='world'
>>> x y
File "<stdin>", line 1
x y
^
SyntaxError: invalid syntax
>>> x + y
'hello,world'
1.10.3 字符串表示str和repr
Python打印所有的字符串時(shí),都用引號(hào)將其括起。你可能通過前面的示例發(fā)現(xiàn)了這一點(diǎn)。這是因?yàn)镻ython打印值時(shí),保留其在代碼中的樣子,而不是你希望用戶看到的樣子。但如果你使用print,結(jié)果將不同。
>>> "hello,world!"
'hello,world!'
>>> print("hello,world!")
hello,world!
如果再加上表示換行符的編碼\n,差別將更明顯。
>>> "hello,\nworld!"
'hello,\nworld!'
>>> print("hello,\nworld!")
hello,
world!
通過兩種不同的機(jī)制將值轉(zhuǎn)換成了字符串。你可通過使用函數(shù)str和repr①直接使用這兩種機(jī)制。使用str能以合理的方式將值轉(zhuǎn)換為用戶能夠看懂的字符串。例如,盡可能將特殊字符編碼轉(zhuǎn)換為相應(yīng)的字符。然而,使用repr時(shí),通常會(huì)獲得值的合法Python表達(dá)式表示。
>>> print(repr("hello,\nworld!"))
'hello,\nworld!'
>>> print(str("hello,\nworld!"))
hello,
world!
1.10.4 長字符串、原始字符串和字節(jié)
有一些獨(dú)特而有用的字符串表示方式。例如,有一種獨(dú)特的語法可用于表示包含換行符或反斜杠的字符串(長字符串和原始字符串)。對(duì)于包含特殊符號(hào)的字符串,Python 2還提供了一種專用的表示語法,結(jié)果為Unicode字符串。這種語法現(xiàn)在依然管用,但是多余,因?yàn)樵赑ython 3中,所有的字符串都是Unicode字符串。Python 3還引入了一種新語法,用于表示大致相當(dāng)于老式字符串的字節(jié)對(duì)象。你將看到,在處理Unicode編碼方面,這種對(duì)象依然扮演著重要的角色。
1、長字符串
要表示很長的字符串(跨越多行的字符串),可使用三引號(hào)(而不是普通引號(hào))。
>>> print('''This is a very long string. It continues here.
... And it's not over yet. "Hello, world!"
... Still here.''')
This is a very long string. It continues here.
And it's not over yet. "Hello, world!"
Still here.
還可使用三個(gè)雙引號(hào),如"""like this"""。請(qǐng)注意,這讓解釋器能夠識(shí)別表示字符串開始和結(jié)束位置的引號(hào),因此字符串本身可包含單引號(hào)和雙引號(hào),無需使用反斜杠進(jìn)行轉(zhuǎn)義。
注意:只要在行尾加上反斜杠,反斜杠和換行符將被轉(zhuǎn)義,即被忽略。
>>> print \
... (2+2)
4
2、原始字符串
原始字符串不以特殊方式處理反斜杠,因此在有些情況下很有用②。在常規(guī)字符串中,反斜杠扮演著特殊角色:它對(duì)字符進(jìn)行轉(zhuǎn)義,讓你能夠在字符串中包含原本無法包含的字符。例如,
>>> print('hello,\nworld1!')
hello,
world1!
\n表示換行符。
但在有些情況下,并非你想要的結(jié)果。如果你要在字符串中包含\n呢?例如,
你可能要在字符串中包含DOS路徑C:\nowhere。
>>> path = 'C:\nowhere'
>>> path
'C:\nowhere'
這好像沒問題,但如果將其打印出來,就會(huì)出現(xiàn)問題。
>>> print(path)
C:
owhere
這并非你想要的結(jié)果,不是嗎?那該怎么辦呢?可對(duì)反斜杠本身進(jìn)行轉(zhuǎn)義。
>>> print('C:\\nowhere')
C:\nowhere
在這樣的情況下,原始字符串可派上用場(chǎng),因?yàn)樗鼈兏静粫?huì)對(duì)反斜杠做特殊處理,而是讓字符串包含的每個(gè)字符都保持原樣。
還有一種方法就是用前綴r表示。
>>> print(r'C:\nowhere')
C:\nowhere
看起來可在原始字符串中包含任何字符,這大致是正確的。一個(gè)例外是,引號(hào)需要像通常那樣進(jìn)行轉(zhuǎn)義,但這意味著用于執(zhí)行轉(zhuǎn)義的反斜杠也將包含在最終的字符串中。
>>> print(r'Let\'s go!')
Let\'s go!
另外,原始字符串不能以單個(gè)反斜杠結(jié)尾。換而言之,原始字符串的最后一個(gè)字符不能是反斜杠,除非你對(duì)其進(jìn)行轉(zhuǎn)義(但進(jìn)行轉(zhuǎn)義時(shí),用于轉(zhuǎn)義的反斜杠也將是字符串的一部分)。根據(jù)前一個(gè)示例,這一點(diǎn)應(yīng)該是顯而易見的。如果最后一個(gè)字符(位于結(jié)束引號(hào)前面的那個(gè)字符)為反斜杠,且未對(duì)其進(jìn)行轉(zhuǎn)義,Python將無法判斷字符串是否到此結(jié)束。
>>> print(r'Let\'s go!\')
File "<stdin>", line 1
print(r'Let\'s go!\')
^
SyntaxError: EOL while scanning string literal
這合乎情理,但如果要指定以反斜杠結(jié)尾的原始字符串(如以反斜杠結(jié)尾的DOS路徑),該如何辦呢?本節(jié)介紹了大量技巧,應(yīng)該能夠幫助你解決這個(gè)問題,但基本技巧是將反斜杠單獨(dú)作為一個(gè)字符串,下面是一個(gè)簡(jiǎn)單的示例:
>>> print(r'C:\Program Files\foo\bar' '\\')
C:\Program Files\foo\bar\
請(qǐng)注意,指定原始字符串時(shí),可使用單引號(hào)或雙引號(hào)將其括起,還可使用三引號(hào)將其括起。
小結(jié)
算法:算法猶如菜譜,告訴你如何完成特定的任務(wù)。從本質(zhì)上說,編寫計(jì)算機(jī)程序就是使用計(jì)算機(jī)能夠理解的語言(如Python)描述一種算法。這種對(duì)機(jī)器友好的描述被稱為程序,主要由表達(dá)式和語句組成。
表達(dá)式:表達(dá)式為程序的一部分,結(jié)果為一個(gè)值。例如,2 + 2就是一個(gè)表達(dá)式,結(jié)果為4。簡(jiǎn)單表達(dá)式是使用運(yùn)算符(如+或%)和函數(shù)(如pow)將字面值(如2或"Hello")組合起來得到的。通過組合簡(jiǎn)單的表達(dá)式,可創(chuàng)建復(fù)雜的表達(dá)式,如(2 + 2) *(3 - 1)。表達(dá)式還可能包含變量。
變量:變量是表示值的名稱。通過賦值,可將新值賦給變量,如x = 2。賦值是一種語句。
語句:語句是讓計(jì)算機(jī)執(zhí)行特定操作的指示。這種操作可能是修改變量(通過賦值)、將信息打印到屏幕上(如print("Hello, world!"))、導(dǎo)入模塊或執(zhí)行眾多其他任務(wù)。
函數(shù):Python函數(shù)類似于數(shù)學(xué)函數(shù),它們可能接受參數(shù),并返回結(jié)果(在第6章學(xué)習(xí)編寫自定義函數(shù)時(shí),你將發(fā)現(xiàn)函數(shù)實(shí)際上可以在返回前做很多事情)。
模塊:模塊是擴(kuò)展,可通過導(dǎo)入它們來擴(kuò)展Python的功能。例如,模塊math包含多個(gè)很有用的函數(shù)。
程序:你通過練習(xí)學(xué)習(xí)了如何編寫、保存和運(yùn)行Python程序。
字符串:字符串非常簡(jiǎn)單。它們其實(shí)就是一段文本,其中的字符是用Unicode碼點(diǎn)表示的。然而,對(duì)于字符串,需要學(xué)習(xí)的知識(shí)有很多。本章介紹了很多表示字符串的方式,第3章將介紹眾多字符串用法。
函數(shù)總結(jié)


在上表中,方括號(hào)內(nèi)的參數(shù)是可選的