Python數(shù)據(jù)類型、運算符、變量 | 寫給小白的工程師入門

題圖:pexels

從這一節(jié)開始,我們將進入正式的 Python 學(xué)習。絕大多數(shù)網(wǎng)上編程教程都直接從這一節(jié)的內(nèi)容開始,我之所以選擇在前面鋪墊那么久,一是遵循人腦的自然學(xué)習規(guī)律——在猛扎進細節(jié)中前先建立對大畫面的認知理解;二是作為走過這條自學(xué)路的人,我會希望當初的自己也得到過這樣的指點。

在具體內(nèi)容前,重復(fù)兩條很多人都說過的學(xué)習編程最好的方式

  1. 跟著教程或源碼敲代碼,出錯了可以立即得到反饋,甚至應(yīng)該故意實驗一些可能出錯的指令,可以獲得最佳編程學(xué)習效果。學(xué)習時故意出些錯總比未來在一堆代碼里無意中埋下 bug 好久解決不掉要好得多。
  2. 關(guān)鍵概念記英文原版。中文只是翻譯參考。

.

程序是什么

在上一節(jié)《工程師的腦子和普通人不一樣》中,我曾把程序員比做寫菜譜的人,計算機只是個規(guī)規(guī)矩矩炒菜的,一個程序就像一份菜譜,算法其實就是那份菜譜里描述做菜的步驟……還可以再學(xué)一個更專業(yè)抽象的說法:程序即為執(zhí)行一次計算的一系列指令。

Program: <u>a sequence of instructions</u> that specifies how to perform a computation.

這里的指令指的是什么呢?

用任一程序語言寫的任一程序,都完全可以只由以下五種指令組成:

  • 輸入 input
  • 輸出 output
  • 數(shù)學(xué)計算 math
  • 條件控制 conditional execution
  • 重復(fù) repetition

只要掌握這五類指令,就可以寫出任何程序——其實很好理解,雖然菜的品類無數(shù),但并不存在煎炸烤炒燉煮拌不能搞定的菜(有這樣還搞不定的菜嗎?)

.

.

值與類型

Value

即為在編程中所用數(shù)據(jù)的基本單位。主要包括兩大類:數(shù)字 (number)字符串 (string)。

數(shù)字進一步可以分為3種類型(還有一類復(fù)數(shù),但很少用到,此處不提):

  • 整型 (integer),即整數(shù),如 4, 7, 101
  • 浮點型 (floating point),即帶小數(shù)點的數(shù)字,如 2.5, 5.0, 3.14
  • 布爾值 (boolean),說是數(shù)字其實更像邏輯數(shù)據(jù)類型,只包括 True/False 兩個值(書寫固定,開頭大寫);但可以和其他數(shù)字一起進行數(shù)學(xué)運算,此時 True = 1, False = 0.

字符串是一串由引號(單引號或雙引號皆可,但同一對引號需統(tǒng)一單雙)圍起的字符,如 "xiaobai", "666", "小 白" 。注意,a. 當數(shù)字加上引號時就成字符串了,不再具備數(shù)字值的特性了(比如可以進行數(shù)學(xué)運算);b. 引號內(nèi)可加空格可加標點,都可以構(gòu)成字符串的一部分。

.

Type 類型

類型是值的分類 (理解成值的屬性也行)。我們在上面已經(jīng)看到 Python 幾大基本類型的一部分了:整型、浮點型、布爾值與字符串。想要知道某個值或變量(下面會講到)的類型,可以用內(nèi)置 type() 函數(shù)來問 Python:

>>> type(666)
<class 'int'>
>>> type("666")
<class 'str'>
>>> type(3.1415926)
<class 'float'>
>>> type(True)
<class 'bool'>

在后面幾節(jié)我們還會接著學(xué)習列表 (list)、元組 (tuple)、字典 (dictionary)、集合 (set) 等更多類型。

.

.

運算符

Python 中的運算符 (operator) 主要用在數(shù)學(xué)運算上,和通用的算術(shù)運算符號大體相同。被運算符連接的值可稱為運算數(shù) (operand)。

在這兒通過交互模式來看一下用法:

>>> 3 + 5
8
>>> 3.0 + 5     #當一個運算數(shù)為浮點時,結(jié)果也會變成浮點
8.0
>>> 1.0 + True  #還記得剛剛說的布爾值的數(shù)值嗎
2.0
>>> 9 - 2
7
>>> 2.5 * 5     #乘積
12.5
>>> 2**3        #指數(shù)運算
8
>>> 3 / 5       #除法
0.6
>>> 3 // 5      #除法,只計整數(shù)部分
0
>>> 3 % 5       #3除以5所剩余數(shù)
3

.

除了用在數(shù)字上,有兩個運算符還可以用在字符串上:+, *. 猜一猜加號和乘號會在字符串上產(chǎn)生什么效果呢?

>>> 'Sinan' + 'Talk'
'SinanTalk'
>>> 'Hello' * 3
'HelloHelloHello'

通過 + 將多個字符串順序連接起來的操作被稱為字串串接 (string concatenation),非常常用;通過 * 把一個字符串復(fù)制多次的操作倒沒什么專用說法 (可以稱為 string multiplication),用的不多,不過需要注意字符串只能與整型相乘,字符串之間不能相乘。

像這樣,一個運算符可以同時用于一個以上數(shù)據(jù)類型 (type) 的現(xiàn)象被稱為重載 (overloading)。比如, + 可以同時用在數(shù)字和字符串上。并不是所有編程語言都支持運算符的重載。除了運算符,之后我們還會接觸到函數(shù)重載 (function overloading)。

.

至于有多個運算符同時存在時該遵從什么運算順序的問題,和數(shù)學(xué)計算相同。不確定的時候就用括號明確優(yōu)先級即可。

.

.

變量

光有值還不夠用,我們還需要變量 (variable)。變量自身不能單獨存在。變量用來存儲、命名值,是其代表的一個值的名字。當我們給變量賦值時,會用到賦值語句 (assignment statement):

# 賦值語句用'='進行賦值,此處'='與算術(shù)中相等的概念不同,含義上更像'<-'右指箭頭
a = 5
b = 2.0
c = 'Python'
d = True
# 這個賦值語句能更清楚看到賦值'='并非算術(shù)中的等號,而是'<-'右指箭頭,將'='右邊的值賦給'='左邊的變量
a = a + 5
print(a)  # 輸出結(jié)果:10

關(guān)于 Python 中變量與值的關(guān)系,我沒見過比 David Goodger 講得更好的了,此處就借用下他的例子和插圖吧。

Python 中的變量就像是其綁定的值的姓名標簽。如,當給變量 a 賦值 1 時,a = 1,1 這個整數(shù)就綁了 a 的標簽, 并且 1 會在內(nèi)存里占一個位置:

當你重新給 a 賦新值 2 時,a = 2,就等于把這個標簽移到 2 身上了,2 此時也會在內(nèi)存里占一個位置:

?

此時你無法再通過 a 來找到 1 了。如果 1 沒有綁定任何其他標簽(變量)的話,那 1 就不會再在內(nèi)存里占位置了。

如果你創(chuàng)建一個新變量 b,并用 a 來給 b 賦值,其實等同于在 2 身上綁了兩個姓名標簽,通過 a 或 b 都可以找到 2:

并不是所有編程語言里的變量都是值的“姓名標簽”。

.

變量的命名

Python 變量命名的規(guī)則不復(fù)雜,可以是:

  1. 字母組合,如 a, foo, val, counter
  2. 字母與數(shù)字組合,如 dict1, list2
  3. 可以加下劃線,如 is_even, max_val2
  4. 但不能以數(shù)字開頭
  5. 習慣性以小寫字母命名
  6. 不可以用 Python 保留字/關(guān)鍵字 (keywords) 來命名變量

Python 保留字/關(guān)鍵字都有哪些呢?可以在交互模式下輸入:

# to see the Python keyword list
>>> import keyword
>>> keyword.kwlist
['False', 'None', 'True', 'and', 'as', 'assert', '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']

當你在文本編輯器或 IDE 中編程時,Python 保留字會自動呈現(xiàn)不同的顏色,所以一開始也不用背保留字列表。每個保留字都非常常用,之后很快會在實踐中熟悉。

.

雖然變量命名并不復(fù)雜,但這不僅關(guān)系到 style,還關(guān)系到代碼的易讀性,因此最好起個易懂易記易區(qū)分并符合邏輯的名字,比如,我給字符串 "SinanTalk" 起名的話,明顯 blog_namefoo 要合理得多。

.

.

表達式與語句

Python 表達式 (expression) 是值、變量與運算符的組合。一個值或變量本身也可以構(gòu)成一個表達式。

Expressions: a combination of values, variables and operators.

剛開始接觸 Python 編程的新手可能都遇到過這個困惑,為什么有些代碼可以在交互式編程 (interactive programming) 模式下直接返回結(jié)果,但腳本式編程 (script programming) 時就不會返回結(jié)果呢?這其實是 Python 表達式在解釋器 (interpreter) 中的不同行為。當你在解釋器的提示符 (prompt) ——就是尖箭頭 >>> ——處輸入一個表達式時,解釋器會在回車后求得表達式的值并返回,如:

>>> 1
1
>>> 5 + 2
7
>>> a = 3.14
>>> a
3.14
>>> a + 10
13.14

在腳本模式下運行,雖然解釋器也會對表達式求值 (evaluate),但并不會返回結(jié)果。

在上面幾個簡單例子中,唯一沒有即時返回結(jié)果的就是 a = 3.14,因為這并非表達式,而是一個 Python 語句。

.

Python 語句 (statement) 是一組有效力的代碼塊。

Statement: a unit of code that has an effect.

目前為止我們已經(jīng)遇到過的語句有:

  • 賦值語句 (assignment statement):創(chuàng)建新變量并賦予一個值。
  • 輸出語句 (print statement):輸出一個值。

解釋器不會對語句求值,而是直接執(zhí)行 (executes) 一個指令。

今后我們還會接觸更多 Python 語句。

.

.

第4節(jié) 作業(yè)

  • 閱讀 Think Python (2nd edition) 第1&2章,并完成文后練習。

    Think Python: How to Think Like a Computer Scientist 是小白學(xué)習 Python 的最佳入門書(不是我評價的,而是很多大佬推薦),第2版面向 Python3。英文原版并不難懂。需要 Think Python 原版教材的讀者可以加本文作者個人微信,取書暗號“小白”。

.

第4節(jié) 小結(jié)

我們在這一節(jié)進入 Python 編程知識的正題,先介紹了一些基本的編程概念:值與類型、運算符、變量、表達式與語句。雖然已經(jīng)能寫簡單的賦值語句和輸出語句,進行數(shù)學(xué)運算了,但還不會用 Python 來表達更復(fù)雜的程序邏輯,下節(jié)課我們將開始學(xué)習條件控制和更多編程基礎(chǔ)概念。
.


謝謝你的閱讀!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容