變量的定義
上次我們簡單說明了變量的含義,還提到了x與'x'不同之處,帶引號的是字符串,不帶引號的是一個你自己定義的標識符,表示一個對象的名稱。這里,x是一個“變量”名。
變量可以存儲各種各樣的東西,可以存儲字符串,也可以存儲數(shù)字等很多種類的對象,編程語言最強大的功能之一是操縱變量的能力。
我們現(xiàn)在打開Python交互環(huán)境,嘗試用print函數(shù)輸出一個變量:
$ python
Python 3.7.1 (default, Nov 6 2018, 18:45:35)
[Clang 10.0.0 (clang-1000.11.45.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> print(x)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
>>>
顯然,這里出問題了。在輸出的最后一行Python解釋器給出了提示:NameError: name 'x' is not defined 。這里是說出現(xiàn)了一個名稱錯誤,x沒有被定義。這是因為你想用x作為你自己定義的一個變量名,可是你又沒告訴python這個x是個什么東西,解釋器迷惑不解。
在python中“變量”需要被定義,也就是definde后才能使用,定義后解釋器才會根據(jù)變量的類型在內(nèi)存中開辟一塊合適大小的地方來存放它,你提供的變量名就成為這塊地方的一個標識符,拿出這個名字就代表你要使用這塊內(nèi)存了。根據(jù)不同的值類型需要不同的內(nèi)存大小,所以變量需要區(qū)分類型才能精確的分配內(nèi)存。
說到這里你可能覺得在python里定義一個變量是一個很麻煩的事情,其實非常簡單,我們在第一節(jié)課就說過python是一種動態(tài)類型的語言,所謂動態(tài)類型就是:你不需要用一句話來告訴解釋器你要用的這個變量是什么類型,確定一個變量的類型是在第一次給它賦值的時候。這樣就簡單很多啦,下面我們來試試利用上次我們說到的賦值操作符=來給變量一個值,然后看看它們被定義成了什么類型:
>>> message = 'hello world!'
>>> x = 256
>>> pi = 3.1415926
我們可以用內(nèi)置函數(shù)type()來觀察一下這些變量被定義成了什么類型:
>>> type(message)
<class 'str'>
>>> type(x)
<class 'int'>
>>> type(pi)
<class 'float'>
根據(jù)輸出的內(nèi)容我們知道這三個類型分別是:
- message:str,字符串類型
- x:int,整數(shù)類型
- pi:float,浮點數(shù)類型
細心的朋友肯定發(fā)現(xiàn)了在type輸出信息里都有個單詞class(類的意思),這里表示它輸出的這些str,int,float都是一個類對象,舉個對照現(xiàn)實中例子就很容易理解了,我們所說的人類就是一個現(xiàn)實世界的“類”,你,我,他,我們每個人都是人類的一個個“實例”對象,我們共有人類的一些基本特性,雙足行走,雜食性,胎生等等。同樣在python世界也有很多“類”,這里message就是str類的一個實例。這種特性就是我們說過的,python是一門面向?qū)ο?/code>的編程語言,其實在python中所有的東西都是對象,都有他們自己的類。關(guān)于面向?qū)ο蟮脑掝}在后面章節(jié)還會詳細敘述,這里只要了解一下概念即可。
變量的名稱
變量的命名比較自由,但也是需要遵循一些規(guī)則的:
- 不能使用保留字,在python3.7中一共有35個
| 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|
| 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 | yiel |
- 只能由字母、下劃線和數(shù)字組成,而不能使用空格、連字符、標點符號、引號或其他字符
- 不能以數(shù)字開頭
- 變量名區(qū)分大小寫
>>> 7day = 'week'
File "<stdin>", line 1
7day = 'week'
^
SyntaxError: invalid syntax
>>> mail@ = '123@qq.com'
File "<stdin>", line 1
mail@ = '123@qq.com'
^
SyntaxError: invalid syntax
>>> class = 'human'
File "<stdin>", line 1
class = 'human'
^
SyntaxError: invalid syntax
思考下上面定義變量時為什么出現(xiàn)各種錯誤。
獲得用戶輸入的變量
我們之前獲得的變量都是在程序中直接賦值的:pi = 3.14,如果我們需要在程序運行的時候動態(tài)的獲得用戶輸入的變量怎么辦呢,我們可以使用input()函數(shù),這個函數(shù)既可以把括號中的參數(shù)作為顯示提示,還可以讓程序暫停,等待獲得用戶的輸入來給變量賦值。
還記得我們第一次計算圓形面積的程序嗎?我們來改造一下用來獲取用戶輸入。在文本編輯器里編輯area.py:
r = input('請輸入半徑長度:')
pi = 3.14
area = pi * r**2
print('面積為{}'.format(area))
這里的半徑r不再是一個固定值,而是一個函數(shù)input()處理后的結(jié)果,這里的結(jié)果就是用戶在命令行輸入的數(shù)字,在提示文字后輸入然后按回車后r就得到了輸入的值。我們來運行一下。
$ python area.py
請輸入半徑長度:10
Traceback (most recent call last):
File "area.py", line 3, in <module>
area = pi * r**2
TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'
這里在輸入半徑10后按回車,出現(xiàn)了一個初學(xué)者常見的一種錯誤:類型錯誤,提示是說字符串類型不支持次方運算的操作。這是因為input函數(shù)把用戶輸入的值都作為字符串來賦值給變量,變量就被定義成了字符串類型,而字符串不能做次方運算,也不可以和數(shù)字類型一起做任何數(shù)學(xué)運算。這就是我們曾經(jīng)提到的,python是一種強類型語言。
顯然這里需要先把輸入的字符串轉(zhuǎn)成數(shù)字,然后再參與運算。我們需要再增加一步操作,利用int()函數(shù)強制轉(zhuǎn)換類型。int函數(shù)把括號中的字符串轉(zhuǎn)換為整型數(shù)字。
注意
int函數(shù)的參數(shù)需要是可以轉(zhuǎn)為整數(shù)型的字符串才能正常工作,如果是'123 321'或是'hello‘這種給int函數(shù)處理就會引起一個值錯誤。
繼續(xù)修改我們的程序:
str_r = input('請輸入半徑長度:')
int_r = int(str_r)
pi = 3.14
area = pi * int_r**2
print('面積為{}'.format(area))
命令行執(zhí)行:
$ python area.py
請輸入半徑長度:10
面積為314.0
練習(xí)
編寫一個程序,提示用戶輸入攝氏溫度,將溫度轉(zhuǎn)換為華氏溫度,然后打印出轉(zhuǎn)換后的溫度。攝氏度轉(zhuǎn)華氏度的公式是oF = ℃ × 1.8 + 32。下一次課將會給出一個參考答案。
本系列尚未完成,將持續(xù)更新,請關(guān)注我的簡書號。
最新STEM知識分享請關(guān)注STEM實驗室 :www.steamlab.club