算術(shù)運(yùn)算符
算術(shù)運(yùn)算
- + 加
- - 減
- * 乘
- / 除
- % 取模(相除后的余數(shù))
- ** 取冪(注意 ^ 并不執(zhí)行該運(yùn)算,你可能在其他語(yǔ)言中見過(guò)這種情形)
- // 相除后向下取整到最接近的整數(shù)
備注: 可以使用 科學(xué)記數(shù)法來(lái)定義很大的數(shù)字暴区。4.445e8
等于 4.445 * 10 ** 8
剪菱,也就是 444500000.0
萍倡。
?
變量I
mv_population = 74728
mv_population
是變量膝昆,負(fù)責(zé)存儲(chǔ) 74728
的值以清。該表達(dá)式將右側(cè)的項(xiàng)目賦值給左側(cè)的名稱泡躯,實(shí)際上和數(shù)學(xué)等式有所不同贮竟,因?yàn)?code>74728 不存儲(chǔ) mv_population
的值。
在任何情況下较剃,無(wú)論左側(cè)項(xiàng)是什么咕别,在賦值后,都是右側(cè)值的變量名稱写穴。一旦將變量值賦值給變量名稱惰拱,你便可以通過(guò)該名稱訪問(wèn)這個(gè)值。
更改變量
更改變量會(huì)如何影響到用該變量定義的另一個(gè)變量啊送?我們來(lái)看一個(gè)示例偿短。
這是關(guān)于山景城人口和人口密度的原始數(shù)據(jù)。
>>> mv_population = 74728
>>> mv_area = 11.995
>>> mv_density = mv_population/mv_area
現(xiàn)在我們重新定義 mv_population
變量:
(注意:后續(xù)代碼跟在上面三行代碼后面删掀,而非重新開始)
>>> mv_population = 75000
??思考一下上方的代碼翔冀,下面的表達(dá)式輸出會(huì)是什么?
>>> print(int(mv_density))
?
??正確答案是 int(mv_density)
的值沒(méi)有變化披泪。它依然是 6229纤子。
因?yàn)楫?dāng)變量被賦值時(shí),賦給了右側(cè)的表達(dá)式的值,而不是表達(dá)式本身控硼。在下面的行中:
>>> mv_density = mv_population/mv_area
Python 實(shí)際上計(jì)算了右側(cè)表達(dá)式 mv_population/mv_area
的結(jié)果泽论,然后將變量 mv_density
賦為該表達(dá)式的值。它立即忘記該公式卡乾,僅將結(jié)果保存到變量中翼悴。
考慮到 mv_population 的變化,為了更新 mv_density 的值幔妨。我們需要再次運(yùn)行下面這行:
>>> mv_density = mv_population/mv_area
>>> print(int(mv_density))
6252
?
變量II
以下兩個(gè)表達(dá)式在賦值方面是對(duì)等的:
x = 3
y = 4
z = 5
以及
x, y, z = 3, 4, 5
但是鹦赎,在大多數(shù)情況下,上面的表達(dá)式并不是很好的賦值方式误堡,因?yàn)樽兞棵Q應(yīng)該要能夠描述所存儲(chǔ)的值古话。
除了要設(shè)定具有描述性的變量名稱之外,在 Python 中命名變量時(shí)锁施,還需要注意以下幾個(gè)事項(xiàng):
1
. 只能在變量名稱中使用常規(guī)字母陪踩、數(shù)字和下劃線。不能包含空格悉抵,并且需要以字母或下劃線開頭肩狂。
2
. 不能使用保留字或內(nèi)置標(biāo)識(shí)符,它們?cè)?Python 中具有重要含義姥饰,你將在整個(gè)這門課程中學(xué)到這些知識(shí)傻谁。python 保留字列表請(qǐng)參閱此處。創(chuàng)建對(duì)值清晰描述的名稱可以幫助你避免使用這些保留字媳否。下面是這些保留字的簡(jiǎn)要表格栅螟。
3
. 在 python 中荆秦,變量名稱的命名方式是全部使用小寫字母篱竭,并用下劃線區(qū)分單詞。
正確
my_height = 58
my_lat = 40
my_long = 105
錯(cuò)誤
my height = 58
MYLONG = 40
MyLat = 105
雖然最后兩個(gè)在 python 中可以運(yùn)行步绸,但是它們并不是在 python 中命名變量的推薦方式掺逼。我們命名變量的方式稱之為snake case,因?yàn)槲覀冇?strong>下劃線連接單詞瓤介。
?
賦值運(yùn)算符
還可以按照類似的方式使用 *=
吕喘,但是與下方所示的運(yùn)算符相比不太常見。
?
?
整數(shù)和浮點(diǎn)數(shù)
數(shù)字值可以用到兩種 python 數(shù)據(jù)類型:
- int - 表示整數(shù)值
- float - 表示小數(shù)或浮點(diǎn)數(shù)值
通過(guò)以下語(yǔ)法創(chuàng)建具有某個(gè)數(shù)據(jù)類型的值:
x = int(4.7) # x is now an integer 4
y = float(4) # y is now a float of 4.0
使用函數(shù) type
檢查數(shù)據(jù)類型:
>>> print(type(x))
int
>>> print(type(y))
float
因?yàn)?0.1 的浮點(diǎn)數(shù)(或近似值)實(shí)際上比 0.1 稍微大些刑桑,當(dāng)我們將好幾個(gè)這樣的值相加時(shí)氯质,可以看出在數(shù)學(xué)上正確的答案與 Python 生成的答案之間有區(qū)別。
>>> print(.1 + .1 + .1 == .3)
False
?
PEP8 指南
- 示例1:
正確
print(4 + 5)
錯(cuò)誤
print( 4 + 5)
?
- 示例2:
正確
print(3 * 7)
錯(cuò)誤
print( 3 * 7 )
?
- 示例3:
正確
print(3*7 - 1)
錯(cuò)誤
print(3 * 7 - 1)
如何遵守標(biāo)準(zhǔn)樣式指南使代碼更容易閱讀祠斧,并且在團(tuán)隊(duì)內(nèi)的不同開發(fā)者之間保持一致闻察。要了解所有的最佳做法,請(qǐng)參閱 PEP8 指南
異常
異常是代碼運(yùn)行時(shí)發(fā)生的問(wèn)題,而語(yǔ)法錯(cuò)誤是 Python 在運(yùn)行代碼之前檢查代碼時(shí)發(fā)現(xiàn)的問(wèn)題辕漂。要了解詳情呢灶,請(qǐng)參閱關(guān)于錯(cuò)誤和異常的 Python 教程頁(yè)面。
布爾型運(yùn)算符钉嘹、比較運(yùn)算符和邏輯運(yùn)算符
布爾數(shù)據(jù)類型存儲(chǔ)的是值 True
或 False
鸯乃,通常分別表示為 1
或0
。
通常有 6 個(gè)比較運(yùn)算符會(huì)獲得布爾值:
比較運(yùn)算符
符號(hào)使用情況 | 布爾型 | 運(yùn)算符 |
---|---|---|
5 < 3 | False | 小于 |
5 > 3 | True | 大于 |
3 <= 3 | True | 小于或等于 |
3 >= 5 | False | 大于或等于 |
3 == 5 | False | 等于 |
3 != 5 | True | 不等于 |
邏輯運(yùn)算符
邏輯使用情況 | 布爾型 | 運(yùn)算符 |
---|---|---|
5 < 3 and 5 == 5 |
False |
and - 檢查提供的所有語(yǔ)句是否都為 True |
5 < 3 or 5 == 5 |
True |
or - 檢查是否至少有一個(gè)語(yǔ)句為 True |
not 5 < 3 |
True |
not - 翻轉(zhuǎn)布爾值 |
?
?
字符串
定義字符串
在 python 中跋涣,字符串的變量類型顯示為str
缨睡。使用雙引號(hào)"
或單引號(hào)'
定義字符串。如果你要?jiǎng)?chuàng)建的字符串包含其中一種引號(hào)陈辱,你需要確保代碼不會(huì)出錯(cuò)宏蛉。
>>> my_string = 'this is a string!'
>>> my_string2 = "this is also a string!!!"
你還可以在字符串中使用 \
,以包含其中一種引號(hào):
>>> this_string = 'Simon\'s skateboard is in the garage.'
>>> print(this_string)
Simon's skateboard is in the garage.
如果不使用 \
性置,注意我們遇到了以下錯(cuò)誤:
>>> this_string = 'Simon's skateboard is in the garage.'
File "<ipython-input-20-e80562c2a290>", line 1
this_string = 'Simon's skateboard is in the garage.'
^
SyntaxError: invalid syntax
字符串連接
>>> first_word = 'Hello'
>>> second_word = 'There'
>>> print(first_word + second_word)
HelloThere
>>> print(first_word + ' ' + second_word)
Hello There
>>> print(first_word * 5)
HelloHelloHelloHelloHello
?
類型和類型轉(zhuǎn)換
四種數(shù)據(jù)類型:
1.
整型
2.
浮點(diǎn)型
3.
布爾型
4.
字符串
>>> print(type(4))
int
>>> print(type(3.7))
float
>>> print(type('this'))
str
>>> print(type(True))
bool
可以更改變量類型以執(zhí)行各種不同的操作拾并。例如
# ex1
In [1]: "0" + "5"
Out[1]: '05'
# ex2
In [2]: 0 + 5
Out[2]: 5
# ex3
In [3]: "0" + 5
----> "0" + 5
TypeError: must be str, not int
因此要讓ex3正確執(zhí)行, 需要將字符0
轉(zhuǎn)換為整型
#ex3
In [3]: int("0") + 5
Out[3]: 5
同理, 對(duì)于數(shù)字也可以通過(guò)str()
進(jìn)行轉(zhuǎn)換, 來(lái)執(zhí)行字符串操作.
?
字符串方法
方法就像某些已經(jīng)見過(guò)的函數(shù):
1.len
("this")
2.type
(12)
3.print
("Hello world")
上述三項(xiàng)都是函數(shù)。注意鹏浅,它們使用了小括號(hào)并接受一個(gè)參數(shù)嗅义。
type
和print
函數(shù)可以接收字符串、浮點(diǎn)型隐砸、整型和很多其他數(shù)據(jù)類型的參數(shù)之碗,函數(shù) len
也可以接受多種不同數(shù)據(jù)類型的參數(shù)
下圖顯示了任何字符串都可以使用的方法。
每個(gè)方法都接受字符串本身作為該方法的第一個(gè)參數(shù)季希。但是褪那,它們還可以接收其他參數(shù)。
>>> my_string = 'rick sanchez'
>>> my_string.islower()
True
>>> my_string.count('a')
1
>>> my_string.find('a')
6
>>> my_string.split()
['rick', 'sanchez']
其他方法
string.replace('old_char','new_char')`
string.capitalize() #一句話中第一個(gè)字母大寫
要詳細(xì)了解字符串和字符串方法式塌,請(qǐng)參閱字符串方法文檔博敬。
?
?
列表
創(chuàng)建列表
使用方括號(hào)創(chuàng)建列表。列表可以包含任何數(shù)據(jù)類型并且可以混合到一起峰尝。
lst_of_random_things = [1, 3.4, 'a string', True]
這是一個(gè)包含 4 個(gè)元素的類別偏窝。
?
獲取元素
在 python 中,所有有序容器(例如列表)的起始索引都是 0武学。因此祭往,要從上述列表中獲取第一個(gè)值,我們可以編寫以下代碼:
>>> lst_of_random_things[0]
1
似乎你可以使用以下代碼獲取最后一個(gè)元素火窒,但實(shí)際上不可行:
>>> lst_of_random_things[len(lst_of_random_things)]
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-34-f88b03e5c60e> in <module>()
----> 1 list[len(list)]
IndexError: list index out of range
但是硼补,你可以通過(guò)使索引減一獲取最后一個(gè)元素。因此,你可以執(zhí)行以下操作:
>>> lst_of_random_things[len(lst_of_random_things) - 1]
True
此外,你可以使用負(fù)數(shù)從列表的末尾開始編制索引提佣,其中 -1 表示最后一個(gè)元素裙椭,-2 表示倒數(shù)第二個(gè)元素踪古,等等指郁。
>>> lst_of_random_things[-1]
True
>>> lst_of_random_things[-2]
a string
?
列表切片
使用切片功能從列表中提取多個(gè)值丈屹。在使用切片功能時(shí)罗售,務(wù)必注意乱豆,下限索引包含在內(nèi)奖恰,上限索引排除在外。
因此:
>>> lst_of_random_things = [1, 3.4, 'a string', True]
>>> lst_of_random_things[1:2]
[3.4]
僅返回列表中的 3.4宛裕。
注意瑟啃,這與單個(gè)元素索引依然不同,因?yàn)槟阃ㄟ^(guò)這種索引獲得了一個(gè)列表揩尸。冒號(hào)表示從冒號(hào)左側(cè)的起始值開始蛹屿,到右側(cè)的元素(不含)結(jié)束。
如果你要從列表的開頭開始岩榆,也可以省略起始值错负。
>>> lst_of_random_things[:2]
[1, 3.4]
或者你要返回到列表結(jié)尾的所有值,可以忽略最后一個(gè)元素勇边。
>>> lst_of_random_things[1:]
[3.4, 'a string', True]
這種索引和字符串索引完全一樣犹撒,返回的值將是字符串。
?
成員運(yùn)算符
可以使用 in 和 not in 返回一個(gè)布爾值粒褒,表示某個(gè)元素是否存在于列表中识颊,或者某個(gè)字符串是否為另一個(gè)字符串的子字符串。
>>> 'this' in 'this is a string'
True
>>> 'in' in 'this is a string'
True
>>> 'isa' in 'this is a string'
False
>>> 5 not in [1, 2, 3, 4, 6]
True
>>> 5 in [1, 2, 3, 4, 6]
False
?
可變性和順序
可變性是指對(duì)象創(chuàng)建完畢后奕坟,是否可以更改該對(duì)象祥款。如果對(duì)象(例如列表或字符串)可以更改,則是可變的月杉。但是刃跛,如果無(wú)法更改對(duì)象以創(chuàng)建全新的對(duì)象(例如字符串),則該對(duì)象是不可變的沙合。
>>> my_lst = [1, 2, 3, 4, 5]
>>> my_lst[0] = 'one'
>>> print(my_lst)
['one', 2, 3, 4, 5]
正如上述代碼所顯示的奠伪,你可以將上述列表中的 1 替換為 'one。這是因?yàn)椋?strong>列表是可變的首懈。
但是,以下代碼不可行:
>>> greeting = "Hello there"
>>> greeting[0] = 'M'
這是因?yàn)椋?strong>字符串是不可變的谨敛。意味著如果要更改該字符串究履,你需要?jiǎng)?chuàng)建一個(gè)全新的字符串。
對(duì)于你要使用的每種數(shù)據(jù)類型脸狸,你都需要注意兩個(gè)事項(xiàng):
- 可變嗎最仑?
- 有序嗎藐俺?
字符串和列表都是有序的。
?
列表方法
-
len()
返回列表中的元素?cái)?shù)量泥彤。 -
max()
返回列表中的最大元素欲芹。最大元素的判斷依據(jù)是列表中的對(duì)象類型。
數(shù)字列表中的最大元素是最大的數(shù)字吟吝。
字符串列表中的最大元素是按照字母順序排序時(shí)排在最后一位的元素菱父。
因?yàn)?max() 函數(shù)的定義依據(jù)是大于比較運(yùn)算符。如果列表包含不同的無(wú)法比較類型的元素剑逃,則 max() 的結(jié)果是 undefined浙宜。 -
min()
返回列表中的最小元素。它是 max() 函數(shù)的對(duì)立面蛹磺,返回列表中的最小元素粟瞬。 -
sorted()
返回一個(gè)從最小到最大排序的列表副本,并使原始列表保持不變萤捆。
join 方法
Join 是一個(gè)字符串方法裙品,將字符串列表作為參數(shù),并返回一個(gè)由列表元素組成并由分隔符字符串分隔的字符串俗或。
new_str = "\n".join(["fore", "aft", "starboard", "port"])
print(new_str)
輸出:
fore
aft
starboard
port
在此示例中清酥,我們使用字符串 "\n"
作為分隔符,以便每個(gè)元素之間都有一個(gè)換行符蕴侣。我們還可以在 .join 中使用其他字符串作為分隔符焰轻。以下代碼使用的是連字符。
name = "-".join(["García", "O'Kelly"])
print(name)
輸出:
García-O'Kelly
請(qǐng)務(wù)必注意昆雀,用英文逗號(hào) (,) 將要連接的列表中的每項(xiàng)分隔開來(lái)辱志。忘記分隔的話,不會(huì)觸發(fā)錯(cuò)誤狞膘,但是會(huì)產(chǎn)生意外的結(jié)果揩懒。
append 方法
實(shí)用方法 append
會(huì)將元素添加到列表末尾。
letters = ['a', 'b', 'c', 'd']
letters.append('z')
print(letters)
輸出:
['a', 'b', 'c', 'd', 'z']
?
元組
元組是另一個(gè)實(shí)用容器挽封。它是一種不可變有序元素?cái)?shù)據(jù)類型已球。通常用來(lái)存儲(chǔ)相關(guān)的信息。
定義元組
location = (13.4125, 103.866667)
length, width, height = 52, 40, 100
在定義元組時(shí)辅愿,小括號(hào)是可選的智亮,如果小括號(hào)并沒(méi)有對(duì)解釋代碼有影響,程序員經(jīng)常會(huì)忽略小括號(hào)点待。
元組索引
元組和列表相似阔蛉,它們都存儲(chǔ)一個(gè)有序的對(duì)象集合,并且可以通過(guò)索引訪問(wèn)這些對(duì)象癞埠。但是與列表不同的是状原,元組不可變聋呢,你無(wú)法向元組中添加項(xiàng)目或從中刪除項(xiàng)目,或者直接對(duì)元組排序颠区。
元組解包
dimensions = 52, 40, 100
length, width, height = dimensions
print("The dimensions are {} x {} x {}".format(length, width, height))
在第二行削锰,我們根據(jù)元組 dimensions 的內(nèi)容為三個(gè)變量賦了值。這叫做元組解包毕莱。你可以通過(guò)元組解包將元組中的信息賦值給多個(gè)變量器贩,而不用逐個(gè)訪問(wèn)這些信息,并創(chuàng)建多個(gè)賦值語(yǔ)句央串。
如果我們不需要直接使用 dimensions磨澡,可以將這兩行代碼簡(jiǎn)寫為一行,一次性為三個(gè)變量賦值质和!
length, width, height = 52, 40, 100
print("The dimensions are {} x {} x {}".format(length, width, height))
可變性&有序性總結(jié)
?
集合
集合是一個(gè)包含唯一元素的可變無(wú)序集合數(shù)據(jù)類型稳摄。集合的一個(gè)用途是快速刪除列表中的重復(fù)項(xiàng)。
?
定義集合
#method 1
numbers = [1, 2, 6, 3, 1, 1, 6]
unique_nums = set(numbers)
#method 2
fruit = {"apple", "banana", "orange", "grapefruit"}
?
集合方法
集合和列表一樣支持in
運(yùn)算符饲宿。和列表相似厦酬,你可以使用 add
方法將元素添加到集合中,并使用 pop
方法刪除元素瘫想。但是仗阅,當(dāng)你從集合中拿出元素時(shí),會(huì)隨機(jī)刪除一個(gè)元素国夜。注意和列表不同减噪,集合是無(wú)序的,因此沒(méi)有“最后一個(gè)元素”车吹。
fruit = {"apple", "banana", "orange", "grapefruit"} # define a set
print("watermelon" in fruit) # check for element
fruit.add("watermelon") # add an element
print(fruit)
print(fruit.pop()) # remove a random element
print(fruit)\
輸出結(jié)果為:
False
{'grapefruit', 'orange', 'watermelon', 'banana', 'apple'}
grapefruit
{'orange', 'watermelon', 'banana', 'apple'}
可以對(duì)集合執(zhí)行的其他操作包括可以對(duì)數(shù)學(xué)集合執(zhí)行的操作筹裕。可以對(duì)集合輕松地執(zhí)行 union窄驹、intersection 和 difference 等方法朝卒,并且與其他容器相比,速度快了很多乐埠。
?
字典
字典是可變數(shù)據(jù)類型抗斤,其中存儲(chǔ)的是唯一鍵到值的映射。下面是存儲(chǔ)元素和相應(yīng)原子序數(shù)的字典丈咐。
elements = {"hydrogen": 1, "helium": 2, "carbon": 6}
?
創(chuàng)建字典
字典的鍵可以是任何不可變類型瑞眼,例如整數(shù)或元組,而不僅僅是字符串扯罐。甚至每個(gè)鍵都不一定要是相同的類型负拟!
?
查詢字典
- 使用方括號(hào)并在括號(hào)里放入鍵,查詢字典中的值或向字典中插入新值歹河。
print(elements["helium"]) # print the value mapped to "helium"
elements["lithium"] = 3 # insert "lithium" with a value of 3 into the dictionary
可以像檢查某個(gè)值是否在列表或集合中一樣掩浙,使用關(guān)鍵字
in
檢查值是否在字典中。get
會(huì)在字典中查詢值秸歧,但是和方括號(hào)不同厨姚,如果沒(méi)有找到鍵,get
會(huì)返回None
(或者你所選的默認(rèn)值)键菱。
print("carbon" in elements)
print(elements.get("dilithium"))
輸出結(jié)果為:
True
None
Carbon 位于該字典中谬墙,因此輸出 True。Dilithium 不在字典中经备,因此 get 返回 None拭抬,然后系統(tǒng)輸出 None。如果你預(yù)計(jì)查詢有時(shí)候會(huì)失敗侵蒙,get 可能比普通的方括號(hào)查詢更合適造虎,因?yàn)殄e(cuò)誤可能會(huì)使程序崩潰。
?
插入新值
使用方括號(hào)并在括號(hào)里放入鍵, 對(duì)其進(jìn)行賦值.
week = {}
week['Monday'] = 1
刪除值
del(week['Monday'] )
?
恒等運(yùn)算符
關(guān)鍵字 | 運(yùn)算符 |
---|---|
is | 檢查兩邊是否恒等 |
is not | 檢查兩邊是否不恒等 |
你可以使用運(yùn)算符 is 檢查某個(gè)鍵是否返回了 None纷闺∷阍洌或者使用 is not 檢查是否沒(méi)有返回 None。
n = elements.get("dilithium")
print(n is None)
print(n is not None)
會(huì)輸出:
True
False
思考: 以下代碼的輸出是什么犁功?
a = [1, 2, 3]
b = a
c = [1, 2, 3]
print(a == b)
print(a is b)
print(a == c)
print(a is c)
結(jié)果應(yīng)該為:
True
True
True
False
解析: 列表 a 和列表 b 是對(duì)等和相同的氓轰。列表 c 等同于 a(因此等同于 b),因?yàn)樗鼈兙哂邢嗤膬?nèi)容浸卦。但是 a 和 c(同樣 b 也是)指向兩個(gè)不同的對(duì)象署鸡,即它們不是相同的對(duì)象。這就是檢查是否相等與恒等的區(qū)別限嫌。
復(fù)合數(shù)據(jù)結(jié)構(gòu)
我們可以在其他容器中包含容器靴庆,以創(chuàng)建復(fù)合數(shù)據(jù)結(jié)構(gòu)。例如萤皂,下面的字典將鍵映射到也是字典的值撒穷!
elements = {"hydrogen": {"number": 1,
"weight": 1.00794,
"symbol": "H"},
"helium": {"number": 2,
"weight": 4.002602,
"symbol": "He"}}
我們可以如下所示地訪問(wèn)這個(gè)嵌套字典中的元素。
helium = elements["helium"] # get the helium dictionary
hydrogen_weight = elements["hydrogen"]["weight"] # get hydrogen's weight
練習(xí)