第二章 學(xué)習(xí)python前必備的基礎(chǔ)知識
大家在上一章中已經(jīng)可以自己敲出一個猜數(shù)字小游戲了,先不要刪掉它爷狈,以后我們慢慢來改進(jìn)它锌云。接下來呢坡椒,我們再繼續(xù)學(xué)習(xí)一些必須要學(xué)的基礎(chǔ)知識就缆。
2.1 變量
說到變量,就是可以改變的量谒亦,它并不是一個值竭宰,而是內(nèi)存中的一個地址。什么意思份招?通俗點(diǎn)講切揭,當(dāng)你定義一個a = 3的時候,系統(tǒng)在內(nèi)存中會給a一個地址锁摔,而這個a就是代表一個門牌號廓旬,然后小3住在里面,當(dāng)你要調(diào)用a的時候谐腰,就相當(dāng)于你喊了一句:小3孕豹,出來玩兒了!當(dāng)你改好了這個房子之后十气,門牌號a是不能改變的励背,但住在里面的小3是可以換人的,所以稱之為變量砸西,而不是恒量叶眉。
看下面的例子:
a = 4
b = 5
print(a)
print(b)
結(jié)果:
結(jié)果顯而易見,a和b分別叫出了小4和小5.那怎么體現(xiàn)它是可以變得呢芹枷?看下面的例子:
a = 4
b = 5
print(a+b)
a = "Li"
b = 'Wang'
print(a)
print(b)
結(jié)果:
結(jié)果很明顯吧衅疙,第一次給a和b分別賦值4和5,然后print了一個a+b鸳慈,結(jié)果是9饱溢,也說明print內(nèi)是可以寫一個運(yùn)算式的;第二次我們給a和b分別賦值了兩個字符串蝶涩,然后打印出來的就是這兩個字符串理朋,從而說明這是個變量而不是常量。你想問既然數(shù)字可以加绿聘,那字符串可以加嗎嗽上?當(dāng)然可以,不信你可以自己運(yùn)行一下下面的代碼:
a = "Li"
b = "Wang"
print(a + b)
運(yùn)行一下熄攘,看一下是什么結(jié)果兽愤,是不是已經(jīng)把兩個字符串拼接起來了?再試試看下面的代碼:
a = 1
b = 2
c = "Li"
d = "Wang"
print(a + b)
print(a + c)
print(c + d)
print("Li" + "Wang")
并從中理解一下,是不是數(shù)字和字符串可以任意的拼接和打忧诚簟逐沙?
又或者是報了些錯誤?嘗試?yán)斫庖幌洛e誤信息洼畅。
2.2 字符串
我們都知道像1吩案,2,3這樣的類型叫做int類型(整型)帝簇,那像a徘郭,b,c這樣的字母及一些特殊字符%丧肴,残揉,@呢,他們被統(tǒng)稱為字符串類型芋浮,也就是str類型抱环,那怎么才能在代碼中知道我輸入的或者賦值的這個變量是什么類型呢,python的BIF*里給了我們一個type()方法來獲得類型名纸巷,等等镇草,BIF是什么,好高級的樣子瘤旨。
BIF 是Built-in Functions陶夜,也就是內(nèi)置函數(shù)的意思,像Python里的很多內(nèi)置函數(shù)都是可以直接調(diào)用的裆站,方便了程序員快速編寫腳本条辟。比如print就是一個內(nèi)置函數(shù),用來打印宏胯。input()也是一個內(nèi)置函數(shù)羽嫡,用來提示用戶輸入。
好肩袍,繼續(xù)來說type()這個BIF的作用杭棵,請看下面的代碼:
a = 2
b = "Li"
print(type(a),type(b))
結(jié)果:
看到?jīng)]有,第一個a的類型顯示的為int氛赐,第二個b的類型顯示為str字符類型
繼續(xù)看下一個代碼:
a = "Li"
print("大家好魂爪,我叫%s" % a)
b = 18
print("我今年%d歲了" % b,"(真年輕,啊哈哈)")
結(jié)果:
這里用了一個奇怪的字符艰管,%s和%d是用來干嘛的滓侍,說明一下,s就是字符串牲芋,d則是整型撩笆,其他的像什么%f捺球,%b什么的大家可以自己查資料,最常用的就是%s和%d夕冲,%f好像也挺常用的氮兵,它代表的浮點(diǎn)數(shù),浮點(diǎn)數(shù)也就是小數(shù)歹鱼。另外記住泣栈,在("大家好,我叫%s" % a)中弥姻,第二個%前面和字符串之間是不能加逗號的秩霍,不然python會認(rèn)為這是兩個單獨(dú)的字符串。
擴(kuò)展一下蚁阳,除了用%號來格式化還有其他的方法嗎?有的鸽照,python還給了我們一個叫format的方法螺捐,代碼如下:
a = "Li"
b = 18
print("大家好,我叫{name},今年{age}歲了".format(name=a, age=b))
結(jié)果:
結(jié)果如出一轍吧矮燎,另外其實(shí)還有一種更簡潔的方式定血,如下:
name = "Li"
age = 18
print(f"大家好,我叫{name},今年{age}歲了")
結(jié)果和上面的是一樣的诞外,大家不妨試一下澜沟。
2.3 原始字符串
下面有一行代碼,大家看看輸出和想象中一樣嗎峡谊?
print("\time \home \name")
輸出的是不是很奇怪茫虽,是不是第一個t沒了,而變成了一個Tab既们,name的n也沒了濒析,變成了換行。沒錯啥纸,在python中号杏,\t 為制表符,\n為換行符斯棒。是不是有點(diǎn)傷腦筋了盾致,那這樣我怎么才能輸出我想要的結(jié)果呢。沒關(guān)系荣暮,python肯定已經(jīng)想到了這樣的問題庭惜,所以我們可以在""前面再加一個""用來轉(zhuǎn)義字符。
print("\\time \home \\name")
這樣的輸出就會變成我們需要的輸出穗酥,那還有沒有更簡單的方式呢蜈块,每個""前面都要加一個""鉴腻,那豈不是很麻煩。答案是有的百揭,這時就需要我們將要打印的字符轉(zhuǎn)換成原始字符串爽哎,怎么轉(zhuǎn)換呢,看代碼:
print(r"\time \home \name")
有沒有看到一個細(xì)微的變化器一,沒錯课锌,我們在引號外加了一個"r",代表我們要將后邊要打印的字符轉(zhuǎn)換成原始字符串,這樣就可以隨心所欲的打印了祈秕。
2.4 長字符串
我說 你是人間的四月天渺贤;
笑響點(diǎn)亮了四面風(fēng);
輕靈在春的光艷中交舞著變请毛。
你是四月早天里的云煙志鞍,
黃昏吹著風(fēng)的軟,
星子在無意中閃方仿,
細(xì)雨點(diǎn)灑在花前固棚。
那輕,那娉婷仙蚜,你是此洲,
鮮妍百花的冠冕你戴著,
你是天真委粉,莊嚴(yán)呜师,
你是夜夜的月圓。
雪化后那片鵝黃贾节,你像汁汗;
新鮮初放芽的綠,你是栗涂;
柔嫩喜悅碰酝,
水光浮動著你夢期待中白蓮。
你是一樹一樹的花開戴差,
是燕在梁間呢喃送爸,
——你是愛,是暖暖释,是希望雁刷,
你是人間的四月天
哇桩砰,好有詩意打却,為啥要用這首當(dāng)代詩開頭呢施掏,因?yàn)檫@整首詩就是我們的長字符串,我們要想把這首詩按照這個排版打印出來亮曹,按照我們學(xué)過的知識橄杨,是不是要這樣打用刂ⅰ:
print("我說 你是人間的四月天;\n 笑響點(diǎn)亮了四面風(fēng)式矫;\n 輕靈在春的光艷中交舞著變乡摹。\n 你是四月早天里的云煙,\n采转。聪廉。。")
是不是要在每個換行之前加一個換行符"\n"故慈,那這工程量可就大了去了板熊,那有沒有什么好方法呢,答案還是有的察绷,我們可以這樣:
a = """
我說 你是人間的四月天干签;
笑響點(diǎn)亮了四面風(fēng);
輕靈在春的光艷中交舞著變拆撼。
你是四月早天里的云煙容劳,
黃昏吹著風(fēng)的軟,
星子在無意中閃情萤,
細(xì)雨點(diǎn)灑在花前。
那輕摹恨,那娉婷筋岛,你是,
鮮妍百花的冠冕你戴著晒哄,
你是天真睁宰,莊嚴(yán),
你是夜夜的月圓寝凌。
雪化后那片鵝黃柒傻,你像;
新鮮初放芽的綠较木,你是红符;
柔嫩喜悅,
水光浮動著你夢期待中白蓮伐债。
你是一樹一樹的花開预侯,
是燕在梁間呢喃,
——你是愛峰锁,是暖萎馅,是希望,
你是人間的四月天
"""
print(a)
前后各三個單引號來表明這是一個長字符串虹蒋,這樣就會原封不動的打印出來了糜芳。
2.5 數(shù)字的運(yùn)算
下面是常用的運(yùn)算及關(guān)系字符:
+ :加法
- :減法
* :乘法
* * :冪運(yùn)算
/ :除法
// :整除
% :余除
< :小于
> :大于
<= :小于等于
>= :大于等于
== :判斷等于
!= :判斷不等于
加法飒货,減法和乘法應(yīng)該不需要再說了,畢竟都是上過學(xué)的人峭竣。
大家先將下面的幾行代碼敲下來塘辅,注意從中觀察"/", "http://", "%"都是除法,但是有什么不同邪驮。
print(3 ** 3)
print(9 / 2)
print(9 // 2)
print(9 % 2)
輸出是不是這樣的:
27
4.5
4
1
現(xiàn)在可以解釋一下了莫辨,我們接觸最多的就是這個"/"最普通的除法,這和我們平時的運(yùn)算是最合乎常理的毅访,9除以2本來就是4.5嘛沮榜,然而這個"http://"呢,被稱為取整喻粹,也就是我們只取除過后的整數(shù)部分蟆融,所以"%"這個取余就是取余數(shù)部分了,像是我們小時候?qū)W過的(9 除以 2 = 4 ······1)
然后大家再敲一下下面的代碼:
print(3 > 5)
print(5 >= 5)
print(6 < 8)
print(4 == 4)
print(4 != 5)
結(jié)果
False
True
True
True
True
怎么我輸入的是數(shù)字守呜,但打印的是一串字符呢型酥,因?yàn)?lt;,>號本來就是關(guān)系判斷符查乒,既然是判斷弥喉,那就有對有錯,F(xiàn)alse和True正好是英文中的對與錯的意思玛迄,“==”就是判斷兩邊數(shù)值是否相等由境,“!=”則判斷兩邊數(shù)值是否不等,接下來就來了解一下python中的布爾類型蓖议。
2.6 布爾類型
其實(shí)在python中布爾類型中的False和True分別被當(dāng)做0和1來對待的虏杰,即假和真。包括下面這樣的計算也是可以的勒虾。
print(True + True)
print(False + True)
結(jié)果
2
1
有沒有發(fā)現(xiàn)纺阔,在Python中True和False確實(shí)是被當(dāng)成了1 和 0.
但如果你真想把這兩個布爾類型放到數(shù)學(xué)計算中去用,那可真是不合邏輯了修然,為啥丟了西瓜撿芝麻笛钝。
2.7優(yōu)先級問題
既然牽扯到了運(yùn)算的問題,那肯定就會有優(yōu)先級的問題愕宋,那么在python中婆翔,數(shù)值運(yùn)算的優(yōu)先級是怎樣的呢?大家在上小學(xué)的時候都背過“先乘除掏婶,后加減”吧啃奴,沒錯,在Python中數(shù)值運(yùn)算也是一樣的雄妥,如果要先進(jìn)行加減運(yùn)算呢最蕾,那就用一個小括號把要先進(jìn)行計算的括起來依溯。
還有其實(shí)像下面的兩個式子是一樣的,不用擔(dān)心
-5 * 7 + 7 * -9
(-5) * 7 + 7 * (-9)
2.8 邏輯操作符
python中的邏輯操作符有:
and
or
not
and也就是并且的意思瘟则,其要求兩邊的式子同時為真則為真黎炉。
or也就是或者的意思,要求兩邊一邊為真則為真醋拧。
not也就是取反的意思慷嗜,not真則為假,not假則為真丹壕。
看下面的代碼
print( True and True)
print(True or False)
print(not True)
結(jié)果
True
True
False
很好理解吧庆械。
其實(shí)在python中還會有這樣的式子
2 < 3 <5
這其實(shí)是被解釋成
2 < 3 and 3 < 5
這個做法在python中是被認(rèn)可的,其他語言幾乎都會報錯菌赖,要記住缭乘。
2.9 數(shù)據(jù)類型及轉(zhuǎn)換
在學(xué)習(xí)python之前,我們可能已經(jīng)聽說過在python中的變量是沒有“類型”的琉用,的確堕绩,變量在python中更像是一張“標(biāo)簽”,想怎么貼就怎么貼邑时,我們可以直接通過“標(biāo)簽”來找到變量在內(nèi)存中的位置奴紧;但也不能說python中絕對沒有“數(shù)據(jù)類型”這一說,很糾結(jié)對不對晶丘?其實(shí)沒必要糾結(jié)黍氮,有沒有“數(shù)據(jù)類型”是理論上的疑問,并不會妨礙我們對python運(yùn)用的掌握铣口,所以我們不妨相信“python是有數(shù)據(jù)類型的”滤钱。
我們已經(jīng)學(xué)習(xí)了字符串類型和布爾類型觉壶,那我們知道數(shù)字的類型都有哪些嗎脑题,我們今天先來了解一下數(shù)字中的整型和浮點(diǎn)型
整型,見字如面铜靶,也就是意味著整型就是整數(shù)的類型叔遂,也就是int型,沒什么可說的了
那么浮點(diǎn)型呢争剿,其實(shí)也就是相當(dāng)于小數(shù)類型已艰,在這里順便引進(jìn)一個科學(xué)計數(shù)法,畢竟小數(shù)點(diǎn)后有很多數(shù)的例子見多了蚕苇。
a = 0.000000009
b = 9e-9
print(type(a),type(b))
print(a == b)
結(jié)果:
<class 'float'> <class 'float'>
True
看到?jīng)]有哩掺,float也就是我們所說的浮點(diǎn)型,并且這里運(yùn)用了一個用“e”表示的科學(xué)計數(shù)法涩笤,如果想要表示很大的數(shù)呢嚼吞,那就把“e”后面的“-”號去掉盒件。是不是方便了很多。
然后再看一下下面的例子了解一下類型轉(zhuǎn)換
a = 4
b = 3.87
c = "Li"
d = "5"
print(type(a),str(a),type(str(a)))
print(type(b),int(b),type(int(b)))
print(type(d),int(d),type(int(d)))
結(jié)果:
<class 'int'> 4 <class 'str'>
<class 'float'> 3 <class 'int'>
<class 'str'> 5 <class 'int'>
從上面我們可以看出將一個浮點(diǎn)數(shù)轉(zhuǎn)換成整數(shù)之后舱禽,它會自動把小數(shù)點(diǎn)后的數(shù)給去掉炒刁;我們也可以把一個數(shù)字轉(zhuǎn)換成字符串,也可以把由數(shù)字組成的字符串轉(zhuǎn)換成int型誊稚,但可以把由多個字符組成的字符串轉(zhuǎn)換成int型嗎翔始,答案是不能,如果強(qiáng)制轉(zhuǎn)換就會報錯里伯。