常量和表達式
我們可以把 Python 當成一個計算器, 來進行一些算術運算.
注意:
print 是一個 Python 內置的 函數, 這個稍后詳細介紹.
可以使用 + - * / ( ) 等運算符進行算術運算. 先算乘除, 后算加減.
運算符和數字之間, 可以沒有空格, 也可以有多個空格. 但是一般習慣上寫一個空格(比較美觀).
形如 1 + 2 - 3 這樣是算式, 在編程語言中稱為 表達式,
算式的運算結果, 稱為 表達式的返回值
其中 1 , 2 , 3 這種稱為 字面值常量, + - * / 這種稱為 運算符 或者 操作符.
舉例:
print((67.5 + 89.0 + 12.9 + 32.2) / 4)
運算結果(返回值):50.400000000000006
變量和類型
變量是什么
有的時候, 我們需要進行的計算可能更復雜一些, 需要把一些計算的中間結果保存起來. 這個時候就需要用到 變量.
示例
給定四個分數, 67.5, 89.0, 12.9, 32.2 , 編寫代碼, 求這四個分數的方差.
PS: 方差的計算過程: 取每一項, 減去平均值, 計算平方, 再求和, 最后除以 (項數 - 1)
注意:
avg, total, result 均為變量.
在 Python 中表示乘方運算. 2 即為求平方
就像計算器中的 M 鍵功能類似, 通過變量就可以保存計算過程中的中間結果.
= 表示"賦值運算符" 不是數學上"比較相等”
變量可以視為是一塊能夠容納數據的空間. 這個空間往往對應到 “內存” 這樣的硬件設備上.
PS: 我們可以把內存想像成是一個宿舍樓, 這個宿舍樓上有很多的房間. 每個房間都可以存放數據. 衡量內存的一個重要指標就是內存空間的大小, 比如我的電腦內存是 16GB. 這個數字越大, 意味著內存的存儲空間就越大, 能夠存放的數據(變量) 就越多。
變量的語法
(1) 定義變量
a = 10
創建變量的語句非常簡單, 其中a 為變量名.
當我們創建很多個變量的時候, 就可以用名字來進行區分.
= 為賦值運算符, 表示把 = 右側的數據放到 = 左側的空間中.
注意: 變量的名字要遵守一定規則.
硬性規則(務必遵守)
1.變量名由數字字母下劃線構成.
2.數字不能開頭. 1a(不合法)
3.變量名不能和 “關鍵字” 重復.
4.變量名大小寫敏感. num 和 Num 是兩個不同的變量名.
5.不能包含特殊符號 a*a(不合法)
軟性規則(建議遵守)
變量名使用有描述性的單詞來表示, 盡量表達出變量的作用. (count 計數 personInfo 個人信息)
一個變量名可以由多個單詞構成, 長一點沒關系, 但是含義要清晰.
當變量名包含多個單詞的時候, 建議使用 “駝峰命名法”. 形如 totalCount , personInfo 這種, 除
了首個單詞外, 剩余單詞首字母大寫.
數學上, 變量通常使用 x, y, z 這種簡單的英文字母或者拉丁字母表示. 但是在編程中不建議這樣使用.
原因是編程中,一個程序里通常會同時創建出很多個變量.
如果只是使用單個字母表示, 在變量多了 的時候, 就很難記住哪個變量是干啥的,從而給維護程序帶來了一定的困難.
因此我們更建議使用帶 有明確描述性的名字, 來表示變量的用途
(2) 使用變量
變量的類型
變量里面存儲的不僅僅是數字, 還可以存儲其它種類的數據. 為了區分不同種類的數據, 我們引入了 “類型” 這樣的概念.
(5) 其他
除了上述類型之外, Python 中還有 list, tuple, dict, 自定義類型 等等. 后續再介紹…
為什么要有這么多類型?
(1) 類型決定了數據在內存中占據多大空間.
int 默認是4個字節.動態擴容.
float 固定8個字節.
bool 一個字節就足夠了.
str 變長的
(2) 類型其實約定了能對這個變量做什么樣的操作.
例如:
int / float 類型的變量, 可以進行 + - * / 等操作
而 str 類型的變量, 只能進行 + (并且行為是字符串拼接),不能進行 - * / , 但是還能使用 len 等其他操作.
總結: 類型系統其實是在對變量進行 “歸類”. 相同類型的變量(數據) 往往具有類似的特性和使用規則.
動態類型
在程序執行過程中, a 的類型剛開始是 int, 后面變成了 str.
C++/Java 這樣的語言則不允許這樣的操作. 一個變量定義后類型就是固定的了. 這種特性則稱為 “靜態類型”.
動態類型特性是一把雙刃劍.
對于中小型程序, 可以大大的解少代碼量(比如寫一段代碼就可以同時支持多種類型).
對于大型程序, 則提高了模塊之間的交互成本. (程序猿 A 提供的代碼難以被 B 理解).
因此很多公司,在創業之初,喜歡使用Python來開發(產品規模小,也就是一兩個程序猿,很快就能開發完成)
但是當項目達到一定的規模之后 動態類型的劣勢就逐漸體現了
很多公司就會針對之前Python寫的代碼使用其他語言進行重構
注釋
注釋是什么
注釋是一種特殊的代碼, 它不會影響到程序的執行, 但是能夠起到解釋說明的作用, 能夠幫助程序猿理解程序代碼的執行邏輯.
#開頭的注釋,一般是寫在需要注釋代碼的上方.
也有少數情況下是寫在代碼的右側的.
很少會寫在代碼的下方(更不會寫到代碼的左側 會將整行代碼注釋掉)
# 計算 4 個數字 67.5, 89.0, 12.9, 32.2 的方差
avg = (67.5 + 89.0 + 12.9 + 32.2) / 4
total = (67.5 - avg) ** 2 + (89.0 - avg) ** 2 + (12.9 - avg) ** 2 + (32.2 - avg)
** 2
result = total / 3
print(result)
形如上述代碼, 如果沒有注釋, 直接閱讀, 是不容易 get 到代碼的含義是計算方差.
但是通過加了一行注釋解釋一下, 就讓人一目了然了.
PS: 代碼的第一目標是容易理解, 第二目標才是執行正確.
寫注釋不光是為了方便別人來理解, 也是方便三個月之后的自己理解.
一個反例: 早些年醫生的手寫處方
注釋的語法
Python 中有兩種風格的注釋.
(1) 注釋行
使用 # 開頭的行都是注釋.
# 這是一行注釋.
(2) 文檔字符串
使用三引號引起來的稱為 “文檔字符串”, 也可以視為是一種注釋.
可以包含多行內容,
一般放在 文件/函數/類 的開頭.
“”" 或者 ‘’’ 均可 (等價).
"""
這是文檔字符串
這是文檔字符串
"""
注釋的規范
如何進行批量化注釋 按住 Ctrl + / 鍵
輸入輸出
和用戶交互
程序需要和用戶進行交互.
用戶把信息傳遞給程序的過程, 稱為 “輸入”.
程序把結果展示給用戶的過程, 稱為 “輸出”.
輸入輸出的最基本的方法就是控制臺. 用戶通過控制臺輸入一些字符串, 程序再通過控制臺打印出一些字符串.
舉例:
PyCharm 運行程序, 下方彈出的窗口就可以視為是控制臺
windows 自帶的 cmd 程序, 也可以視為是控制臺
通過控制臺輸出
Python 使用 print 函數輸出到控制臺.
不僅能輸出一個字符串, 還可以輸出一個其他類型的變量
更多的時候, 我們希望能夠輸出的內容是混合了字符串和變量的
# 在Java中不同變量類型可以進行相加
a = 10
b = "hello"
print(a+b)
# Java采用了字符串拼接,允許字符串和其他類型的值進行拼接
# c printf,使用%d,%s這樣的占位符
# C++采用了std:cout,使用<<移位符
但是在之前的學習過程中,我們了解到python無法進行字符串+整數的拼接,那python中是如何處理的呢?
運算符
算術運算符
像 + - * / %(求余數) ** // 這種進行算術運算的運算符, 稱為 算術運算符
先算乘方,然后是乘除,最后算加減.
如果運算過程中想修改默認的運算順序,就需要加上()
- 除法的第一個問題:
** 乘方運算
既能夠支持整數次方,也支持小數次方.(開方運算)
關系運算符
像 < <= > >= == != 這一系列的運算符稱為 關系運算符, 它們是在比較操作數之間的關系.
其中
<= 是 "小于等于">= 是 "大于等于"
== 是 "等于"
!= 是 "不等于"
(1) 如果關系符合, 則表達式返回 True. 如果關系不符合, 則表達式返回 False(返回值的類型為布爾類型)
(2) 關系運算符不光針對整數/浮點數進行比較, 還能針對字符串進行比較.
注意:
直接使用 == 或者 != 即可對字符串內容判定相等. (這一點和 C / Java 不同).
字符串比較大小的規則是 “字典序”
關于字典序:
想象一個英文詞典, 上面的單詞都是按照字母順序排列. 如果首個字母相同, 就比較第二個字母. ( 就比如著名單詞 abandon).
我們認為一個單詞在詞典上越靠前, 就越小. 越靠后, 就越大.
針對中文進行字符串大小比較是沒有意義的. 至少按照默認的字典序來說,是沒意義的!
在計算機里,表示中文,其實是用多個字節構成的一個比較大的數字來進行比較 比如:手機通訊錄
(3) 對于浮點數來說, 不要使用 == 判定相等.
**注意: 浮點數在計算機中的表示并不是精確的! 在計算過程中, 就容易出現非常小的誤差.**像這樣的誤差在進行算術運算時是相當致命的
正確的比較方式: 不再嚴格比較相等了, 而是判定差值小于允許的誤差范圍.
a = 0.1 + 0.2
b = 0.3
print(-0.000001 < (a - b) < 0.000001)
實際工程實踐中, 誤差在所難免, 只要保證誤差在合理范圍內即可
邏輯運算符
像 and or not 這一系列的運算符稱為 邏輯運算符.
and 并且. 兩側操作數均為 True, 最終結果為 True. 否則為 False. (一假則假)
or 或者. 兩側操作數均為 False, 最終結果為 False. 否則為 True. (一真則真)
not 邏輯取反. 操作數本身為 True, 則返回 False. 本身為 False, 則返回 True.
- 比如C++或者Java里,使用&&表示邏輯與并且 ||表示邏輯或或者!表示邏輯非 邏輯取反.
一種特殊寫法:a < b and b < c 這個操作等價于 a < b < c . 這個設定和大部分編程語言都不相同.
賦值運算符
(1) = 的使用
= 表示賦值. 這個我們已經用過很多次了. 注意和 == 區分.
= 除了基本的用法之外, 還可以同時針對多個變量進行賦值.
鏈式賦值
a = b = 10
多元賦值
a, b = 10, 20
代碼實例: 交換兩個變量
# 基礎寫法
a = 10
b = 20
tmp = a
a = b
b = tmp
# 在C語言/C++/Java中都是采用這種基礎寫法
# 基于多元賦值
a = 10
b = 20
a, b = b, a
# 多元賦值的用處 基于
(2) 復合賦值運算符
Python 還有一些 復合賦值運算符. 例如 += -= *= /= %=
其中 a += 1 等價于 a = a + 1 . 其他復合賦值運算符也是同理.
a = 10
a = a + 1
print(a)
b = 10
b += 1
print(b)
注意: 像 C++ / Java 中, 存在 ++ – 這樣的自增/自減運算符. Python 中則不支持這種運算.
如果需要使用, 則直接使用 += 1 或者 -= 1 ++ – 最大的問題就是容易分不清前置和后置的區別.
這一點 Python 語法在設計的時候就進行了規避, 避免出現這種不直觀, 并且容易混淆的語法.
其他
除了上述之外, Python 中還有一些運算符, 比如 身份運算符 (is, is not), 成員運算符 (in, not in), 位運算符
( & | ~ ^ << >>) 等.
自測練習
(1) [多選] 以下關于變量之間加法運算的說法, 正確的是:
A. Python 中的字符串之間夠能相加.
B. Python 中的字符串可以和整數相加.
C. Python 中的整數可以和浮點數相加.
D. Python 中的整數可以和布爾值相加.
【答案】ACD
A選項,字符串拼接
B選項,字符串和整數相加報錯
C選項,動態類型變量變為浮點型
D選項,如果把布爾類型的值和整數進行算術運算,此時就會把 True當做1,把 False當做0,但是這樣的操作,是沒有意義的!!!
C/C++也是有類似的行為.但是 Java這里的做法是更合理的!! 如果出現整數和布爾混合運算,直接編譯報錯!!
(2) [單選] 以下 Python 代碼, 合法的是
A. int a = 10
B. a = 10;
C. a = true
D. a = ‘aaa’ + 10
【答案】B