浮点数赋值给整数_初学者专题:变量和赋值
作者:老齊
對于初學Python者,除了看書(《跟老齊學Python:輕松入門》或者《Python大學實用教程》,均為電子工業(yè)出版社出版)、或者看視頻(網(wǎng)易云課堂、CSDN上均有老齊的視頻課程),還要進行專題性總結。比如本文,就是要幫助學習者,對變量和賦值這兩個非常基本、幾乎無處不在的內(nèi)容作為一個專題進行總結。
對象
Python語言既能夠實現(xiàn)面向過程,也能夠實現(xiàn)面向對象編程。而面向對象,是當前軟件開發(fā)的主流編程思想。在我的兩本書中,我都強調(diào)了面向對象——不要認為這種編程思想不適用于初學者,更不要認為它有多難。
并且,Python語言中已經(jīng)有這樣一個明確的概念:萬物皆對象,不論是數(shù)字、整數(shù)、函數(shù)、類,等等,都是對象。
Python語言中的對象,可以理解為語言中的“實際物體”,它一經(jīng)創(chuàng)建,存儲器中就開辟出一個空間保存它,因而也就有了一個內(nèi)存地址。
比如:
>>> id(3.14)4312572400
這里返回的十進制數(shù)字,就代表了存儲器為浮點數(shù)對象3.14分配的內(nèi)存地址。
另外,Python中的任何對象都有類型。在Python中,類型就是類。在Python創(chuàng)立之初,這兩個沒有統(tǒng)一,后來將“類”和“類型”統(tǒng)一了起來,這樣我們就可以把每一個具體的數(shù)據(jù),看成是某個“類”的實例,而那個“類”就是這個實例的“類型”。
比如:
>>> type(3.14)返回值顯示,3.14是float類的實例,也就是float類型。
下面自定義一個類,然后創(chuàng)建實例,再看看那個實例的類型:
>>> class Book:... book = "跟老齊學Python:輕松入門"
...
>>> my_book = Book()
>>> type(my_book)
除了返回的類的具體內(nèi)容不同之外,Book()(注意,這是對象,my_book引用了這個對象,所以,也可以說是my_book,對此的詳細說明請閱讀本文后續(xù)內(nèi)容)和3.14都是所對應類的實例——返回值格式相同,因此它們也都是所對應類的那種“類型”。
變量
在Python中使用變量,非常方便,可以用“召之即來揮之即去”形容,也就是不需要“創(chuàng)建”變量,用的時候信手拈來。
>>> int aFile "", line 1
int a
^
SyntaxError: invalid syntax
在有些語言里面,比如Java,要使用某個變量,必須先創(chuàng)建它。但是,如果把這個習慣搬到Python中,就如同上面操作那樣,會報錯。另外,還要注意,Python中的變量不是對象,它不能單獨存在。
>>> aTraceback (most recent call last):
File "", line 1, in
NameError: name 'a' is not defined
上面的演示,就是想用一個變量a,但是,只是把它單獨放在那里,就如同在數(shù)學上,“假設變量a”,這樣做是不行的。在Python中,變量必須和某個對象關聯(lián)起來。
>>> a = 2>>> id(a)
4308314816
>>> id(2)
4308314816
在上面的示例中,a=2就是將變量a與對象2關聯(lián)了起來。注意,這里的變量a不是像容器那樣,將對象2放入其中,而是如同標簽那樣,貼到了對象2上,于是乎通過這個標簽就可以找到那個對象。
id(a)并不是返回變量a的內(nèi)存地址——它不是對象,而是返回了它所引用的對象2的內(nèi)存地址。再參考后面的id(2),可以看到兩者內(nèi)存地址一樣,也就是說證明了a這個變量引用的對象就是2。
但是,如果在交互模式中,做下面的操作,就令人匪夷所思了。
>>> a = 1.23>>> id(1.23)
4312572400
>>> id(a)
4311689008
按照前面的說法,這個怎么解釋?!
再解釋這個之前,先來看下面的操作。
創(chuàng)建一個文件,比如命名為idvalue.py,然后在文件中寫入如下代碼:
#coding:utf-8a = 1.23
id_value1 = id(a)
id_value2 = id(1.23)
print(f"id(a): {id_value1}")
print(f"id(1.23): {id_value2}")
if id_value1 == id_value2:
print("id() 返回值相同")
這段程序,跟前面交互模式里面的一樣。但是,請注意接下來的事情。保存文件之后,執(zhí)行它。
% python3 idvalue.pyid(a): 4327795888
id(1.23): 4327795888
id() 返回值相同
看執(zhí)行結果。這里得到的a和1.23的內(nèi)存地址居然是一樣的。
神奇嗎?
要解釋這種神奇,話就有點長了,要從交互模式的特點開始說起。交互模式,是我們學習和做簡單練習的好地方,但是,它有一個缺點,“記憶力太差”,每一行執(zhí)行完畢,就會將該行“忘記”,下一行又從頭開始。當執(zhí)行了a = 1.23之后,本來內(nèi)存中已經(jīng)創(chuàng)建了1.23這個對象,但是,當再次執(zhí)行id(1.23)時,因為兩個不完全一樣,交互模式的解析器忘記了前面的1.23,于是乎又在存儲器中重新創(chuàng)建了id(1.23)中的1.23對象。
可為什么a = 2不如此呢?因為Python還有一個習慣,把-256~256這些整數(shù),在內(nèi)存中有“常住戶口”。
>>> b = 256>>> id(b)
4308322944
>>> id(256)
4308322944
>>>
>>> c = 257
>>> id(c)
4312572688
>>> id(257)
4312572624
但是,如果在一個程序文件里,Python解析器的“記憶力”就正常了,不會重復創(chuàng)建同樣的對象——當然,如拷貝等有意為之的除外。
至此,我們已經(jīng)明確,Python中的變量和對象之間是引用關系,正式因為這種引用關系,讓Python中實現(xiàn)某些操作就非常容易了。
>>> first = 1>>> second = 2
>>> first, second = second, first
>>> first
2
>>> second
1
在這個示例中,變量first引用了1,second引用了2,如果想把這兩個變量引用的對象對調(diào)一下,在Python里面使用first, second = second, first。這是多么簡單、優(yōu)雅、直接呀。如果在Java里面,就麻煩了——學過C/C++/Java等語言的同學,試一試吧。
由此,我們可以放膽說:Python簡單、優(yōu)雅。
還是因為“引用”,一個對象可以被多個變量引用,就相當于一個物體上可以貼多個標簽那樣。
>>> a = b = 3.14>>> a
3.14
>>> b
3.14
“變量引用對象”這個思想,還可以擴展到函數(shù)的參數(shù)。有的人習慣把函數(shù)的參數(shù)弄很多名稱,比如形參、實參等,并且進行區(qū)分。在Python語言中,它們本質上都是變量,只不過是在函數(shù)作用于里面使用的變量。當定義函數(shù)的時候,雖然那個變量也沒有引用對象,但因為是定義函數(shù),這個函數(shù)并沒有執(zhí)行,所以,一個沒有引用對象的變量是許可存在的。
>>> book = ['python',]>>> def my_book(b):
... b.append("feature engineering")
... return b
...
>>> my_book(book)
['python', 'feature engineering']
>>> book
['python', 'feature engineering']
上面代碼中,第1行創(chuàng)建了一個列表。第2行開始,創(chuàng)建了一個函數(shù),參數(shù)是b——這時候稱為“形參”,即形式上的參數(shù)。其實,因為這個函數(shù)并沒有調(diào)用,所以,那個變量b可以認為是占位符,可以單獨存在,不需要引用任何對象。
后面,調(diào)用這個函數(shù)my_book(book)。這里我們通常形象而簡要地說:“將boo傳給函數(shù)”。這句話其實不是很嚴謹,但它因為形象簡短,所以被廣為使用。如果嚴謹?shù)卣f——未免啰嗦了,調(diào)用這個函數(shù)后,發(fā)生的是:b引用了變量book所引用的對象['python',]。
從后面的執(zhí)行結果中可以看出,因為函數(shù)內(nèi)和函數(shù)外,不同變量引用的對象都是同一個,所以,會發(fā)生同樣的變化。
對于變量,最后要強調(diào)的就是命名習慣:
- 非數(shù)字開頭
- 字母都小寫
- 用有意的單詞或者單詞組合,多個單詞之間用_連接
- 避免使用與下列項目沖突的單詞:內(nèi)置類型、內(nèi)置函數(shù)、關鍵詞
以下是列出Python關鍵詞的方法:
>>> import keyword>>> keyword.kwlist
['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
或者:
>>> help("keywords")Here is a list of the Python keywords. Enter any keyword to get more help.
False class from or
None continue global pass
True def if raise
and del import return
as elif in try
assert else is while
async except lambda with
await finally nonlocal yield
break for not
有一種常見情況,如下所示:
>>> list = [1,2,3]>>> list("laoqi")
Traceback (most recent call last):
File "", line 1, in
TypeError: 'list' object is not callable
這就是因為本來的內(nèi)置對象類型list,或者內(nèi)置函數(shù)的名稱,已經(jīng)被>>> list = [1,2,3]占用了,后面再使用list,指的就是這個列表。所以,第二行的操作中會報錯。
賦值
在理解變量和對象關系的基礎上,理解“賦值”或“賦值語句”就簡單多了,從本質上講,賦值就是變量與某對象建立引用關系,只不過,這里不是如前面所說的某個直接的對象,這里的對象可能是經(jīng)過計算之后得到的,所以,先要知道“表達式”。
所謂表達式,就是對象間用操作符連接,組成一個有意義的式子。
>>> 1 + 23
>>> "python" + "lang"
'pythonlang'
以上演示的都是表達式,一般而言,表達式要返回一個對象。如果將這個對象再被變量引用,就成為了“賦值”。
>>> py = "python" + "lang">>> py
'pythonlang'
當然,前面出現(xiàn)的諸如a = 2也都是賦值語句。
在賦值語句中,=的作用于數(shù)學中的等號有很大區(qū)別,它表示將變量與對象之間建立引用關系。
>>> n = 1>>> n = n + 1
>>> n
2
對于表達式n = n + 1,這里的=如果是數(shù)學中的意義,那么就會出現(xiàn)0=1。
對于n = n + 1這種操作,還可以寫成:
>>> n += 1>>> n
3
這種寫法稱為自增,同樣,減、乘、除也都有類似的操作。
對于賦值,必須要說明的是Python3.8中新增的功能:海象運算符。
>>> n = len('python')>>> if n < 10:
... print(f"the word length is: {n}")
...
the word length is: 6
在第二行開始的條件語句中,要使用n,必須要要在前面通過賦值語句獲得。Python3.8的海象賦值運算符,把上面的賦值那一行和第二行融合起來,讓代碼更簡潔。
>>> if (i := len('python')) < 10:... print(f"the word length is: {n}")
...
the word length is: 6
關于海象運算符,本微信公眾號有專門文章闡述,請參閱:《Python3.8新語法:海象運算符》
最后,要強調(diào)的是,Python中函數(shù)、類也都是對象,它們同樣能夠用于賦值語句。
>>> lam = lambda x: x+3>>> lam(4)
7
>>> q = lam
>>> q(4)
7
第一行創(chuàng)建了一個lambda函數(shù),這個函數(shù)對象用變量lam引用,也是賦值。注意第三行,只有名稱才引用對象,如果是lam(),是試圖要執(zhí)行l(wèi)am引用的對象,所以,q = lam才是賦值,或者說變量q也引用了這個lambda函數(shù)。
本文對變量和賦值做了專題總結,供初學者復習,以便加深對相關知識的理解。
專注于軟件和AI的公眾號
老齊教室
覺得好看,就點這里???
總結
以上是生活随笔為你收集整理的浮点数赋值给整数_初学者专题:变量和赋值的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 4999元旗舰用塑料后盖时代终结!曝三星
- 下一篇: 薇娅被罚后 李佳琦美one公司回应