學(xué)了吳恩達(dá)老師的視頻饼灿,發(fā)現(xiàn)自己的代碼真的很不ok啊5勖馈0怼!!1蛹伞N韫俊!所以覺得把python基礎(chǔ)教程這本書仔仔細(xì)細(xì)看完皆疹,然后開始記錄下一本書J栝稀!略就!下面都是我自己記錄的啊 (只對我認(rèn)為的重點(diǎn)進(jìn)行記錄)捎迫,可能會(huì)有雷同!1砝巍窄绒!但是都是一本書啊4扌恕U玫肌!D詹肌!搁宾!有問題提出來罢酃!盖腿!讓我們蕩起雙槳爽待,讓我們推開波浪,一起進(jìn)步哈哈哈哈哈哈哈哈哈哈
1.1 交互式解釋器
這一小節(jié)講得好簡單的翩腐,講了一些重點(diǎn):
在python總不需要每行末尾都加上分號(hào)
遇到不懂的問題鸟款,可以輸入命令help()
1.2 算法
這一本書中把算法講得很通熟易懂。
算法只不過是流程或菜譜的時(shí)髦說法茂卦,請看下面的菜譜:
雞蛋火腿腸:先取一些火腿腸何什。再加些火腿腸和雞蛋。
如果喜歡吃辣等龙,加些辣味火腿腸处渣。
煮熟為止。記得每隔10分鐘檢查一次蛛砰。
是不是講得很通俗易懂罐栈。這個(gè)菜譜的結(jié)構(gòu)很有啟發(fā)性。它由一系列必須按順序執(zhí)行的操作說明組成泥畅,其中有些可直接完成(取些火腿腸)荠诬,有些需要特別注意(如果喜歡吃辣),還有一些需要重復(fù)多次(每隔10分鐘檢查一次)。
菜譜和算法都由原料(對象)和操作說明(語句)組成柑贞。在這個(gè)示例中方椎,火腿腸和雞蛋是原料,而操作說明包括添加火腿腸凌外、烹飪指定的時(shí)間等辩尊。下面來介紹一些簡單的python原料。
1.3 數(shù)和表達(dá)式
一些很簡單的操作這里就跳過了康辑。
>>> 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中,對于整除運(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)該大概懂了吧0住9狻!梨熙!然后求余的時(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)#取絕對值
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)我們在math模塊中導(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本身提供了對復(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ī)的部分功能驾孔。對于Python當(dāng)前不支持,但未來將成為標(biāo)準(zhǔn)組成部分的功能惯疙,你可從這個(gè)模塊進(jìn)行導(dǎo)入翠勉。
Python提供了future模塊,把下一個(gè)新版本的特性導(dǎo)入到當(dāng)前版本霉颠,于是我們就可以在當(dāng)前版本中測試一些新版本的特性对碌。這個(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ú)特的語法可用于表示包含換行符或反斜杠的字符串(長字符串和原始字符串)说墨。對于包含特殊符號(hào)的字符串骏全,Python 2還提供了一種專用的表示語法,結(jié)果為Unicode字符串尼斧。這種語法現(xiàn)在依然管用姜贡,但是多余,因?yàn)樵赑ython 3中棺棵,所有的字符串都是Unicode字符串鲁豪。Python 3還引入了一種新語法,用于表示大致相當(dāng)于老式字符串的字節(jié)對象律秃。你將看到爬橡,在處理Unicode編碼方面,這種對象依然扮演著重要的角色棒动。
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"""。請注意粱锐,這讓解釋器能夠識(shí)別表示字符串開始和結(jié)束位置的引號(hào)疙挺,因此字符串本身可包含單引號(hào)和雙引號(hào),無需使用反斜杠進(jìn)行轉(zhuǎn)義怜浅。
注意:只要在行尾加上反斜杠铐然,反斜杠和換行符將被轉(zhuǎn)義,即被忽略恶座。
>>> print \
... (2+2)
4
2搀暑、原始字符串
原始字符串不以特殊方式處理反斜杠,因此在有些情況下很有用②跨琳。在常規(guī)字符串中自点,反斜杠扮演著特殊角色:它對字符進(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é)果,不是嗎挡育?那該怎么辦呢巴碗?可對反斜杠本身進(jìn)行轉(zhuǎn)義。
>>> print('C:\\nowhere')
C:\nowhere
在這樣的情況下即寒,原始字符串可派上用場橡淆,因?yàn)樗鼈兏静粫?huì)對反斜杠做特殊處理,而是讓字符串包含的每個(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è)字符不能是反斜杠瓷胧,除非你對其進(jìn)行轉(zhuǎn)義(但進(jìn)行轉(zhuǎn)義時(shí),用于轉(zhuǎn)義的反斜杠也將是字符串的一部分)棚愤。根據(jù)前一個(gè)示例搓萧,這一點(diǎn)應(yīng)該是顯而易見的。如果最后一個(gè)字符(位于結(jié)束引號(hào)前面的那個(gè)字符)為反斜杠宛畦,且未對其進(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è)簡單的示例:
>>> print(r'C:\Program Files\foo\bar' '\\')
C:\Program Files\foo\bar\
請注意读规,指定原始字符串時(shí)抓督,可使用單引號(hào)或雙引號(hào)將其括起,還可使用三引號(hào)將其括起束亏。
小結(jié)
算法:算法猶如菜譜铃在,告訴你如何完成特定的任務(wù)。從本質(zhì)上說,編寫計(jì)算機(jī)程序就是使用計(jì)算機(jī)能夠理解的語言(如Python)描述一種算法定铜。這種對機(jī)器友好的描述被稱為程序阳液,主要由表達(dá)式和語句組成。
表達(dá)式:表達(dá)式為程序的一部分揣炕,結(jié)果為一個(gè)值帘皿。例如,2 + 2就是一個(gè)表達(dá)式畸陡,結(jié)果為4鹰溜。簡單表達(dá)式是使用運(yùn)算符(如+或%)和函數(shù)(如pow)將字面值(如2或"Hello")組合起來得到的。通過組合簡單的表達(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程序欲侮。
字符串:字符串非常簡單。它們其實(shí)就是一段文本肋联,其中的字符是用Unicode碼點(diǎn)表示的威蕉。然而,對于字符串橄仍,需要學(xué)習(xí)的知識(shí)有很多韧涨。本章介紹了很多表示字符串的方式牍戚,第3章將介紹眾多字符串用法。
函數(shù)總結(jié)
在上表中虑粥,方括號(hào)內(nèi)的參數(shù)是可選的