指令和程式
計算機的硬體系統通常由五大部件構成,包括:運算器、控制器、儲存器、輸入裝置和輸出裝置。其中,運算器和控制器放在一起就是我們通常所說的中央處理器,它的功能是執行各種運算和控制指令以及處理計算機軟體中的資料。我們通常所說的程式實際上就是指令的集合,我們程式就是將一系列的指令按照某種方式組織到一起,然後通過這些指令去控制計算機做我們想讓它做的事情。今天我們使用的計算機雖然器件做工越來越精密,處理能力越來越強大,但究其本質來說仍然屬於“馮·諾依曼結構”的計算機。“馮·諾依曼結構”有兩個關鍵點,一是指出要將儲存裝置與中央處理器分開,二是提出了將資料以二進位制方式編碼。二進位制是一種“逢二進一”的計數法,跟我們人類使用的“逢十進一”的計數法沒有實質性的區別,人類因為有十根手指所以使用了十進位制(因為在數數時十根手指用完之後就只能進位了,當然凡事都有例外,瑪雅人可能是因為長年光著腳的原因把腳趾頭也算上了,於是他們使用了二十進位制的計數法,在這種計數法的指導下瑪雅人的歷法就與我們平常使用的歷法不一樣,而按照瑪雅人的歷法,2012年是上一個所謂的“太陽紀”的最後一年,而2013年則是新的“太陽紀”的開始,後來這件事情被以訛傳訛的方式誤傳為”2012年是瑪雅人預言的世界末日“這種荒誕的說法,今天我們可以大膽的猜測,瑪雅文明之所以發展緩慢估計也與使用了二十進位制有關)。對於計算機來說,二進位制在物理器件上來說是最容易實現的(高電壓表示1,低電壓表示0),於是在“馮·諾依曼結構”的計算機都使用了二進位制。雖然我們並不需要每個程式設計師都能夠使用二進位制的思維方式來工作,但是瞭解二進位制以及它與我們生活中的十進位制之間的轉換關係,以及二進位制與八進位制和十六進位制的轉換關係還是有必要的。如果你對這一點不熟悉,可以自行使用維基百科或者百度百科科普一下。
變數和型別
在程式設計中,變數是一種儲存資料的載體。計算機中的變數是實際存在的資料或者說是儲存器中儲存資料的一塊記憶體空間,變數的值可以被讀取和修改,這是所有計算和控制的基礎。計算機能處理的資料有很多中型別,除了數值之外還可以處理文字、圖形、音訊、視訊等各種各樣的資料,那麼不同的資料就需要定義不同的儲存型別。Python中的資料型別很多,而且也允許我們自定義新的資料型別(這一點在後面會講到),我們先介紹幾種常用的資料型別。
- 整型:Python中可以處理任意大小的整數(Python 2.x中有int和long兩種型別的整數,但這種區分對Python來說意義不大,因此在Python 3.x中整數只有int這一種了),而且支援二進位制(如
0b100
,換算成十進位制是4)、八進位制(如0o100
,換算成十進位制是64)、十進位制(100
)和十六進位制(0x100
,換算成十進位制是256)的表示法。 - 浮點型:浮點數也就是小數,之所以稱為浮點數,是因為按照科學記數法表示時,一個浮點數的小數點位置是可變的,浮點數除了數學寫法(如
123.456
)之外還支援科學計數法(如1.23456e2
)。 - 字串型:字串是以單引號或雙引號括起來的任意文字,比如
'hello'
和"hello"
,字串還有原始字串表示法、位元組字串表示法、Unicode字串表示法,而且可以書寫成多行的形式(用三個單引號或三個雙引號開頭,三個單引號或三個雙引號結尾)。 - 布林型:布林值只有
True
、False
兩種值,要麼是True
,要麼是False
,在Python中,可以直接用True
、False
表示布林值(請注意大小寫),也可以通過布林運算計算出來(例如3 < 5
會產生布林值True
,而2 == 1
會產生布林值False
)。 - 複數型:形如
3+5j
,跟數學上的複數表示一樣,唯一不同的是虛部的i
換成了j
。
變數命名
對於每個變數我們需要給它取一個名字,就如同我們每個人都有屬於自己的響亮的名字一樣。在Python中,變數命名需要遵循以下這些必須遵守硬性規則和強烈建議遵守的非硬性規則。
- 硬性規則:
- 變數名由字母(廣義的Unicode字元,不包括特殊字元)、數字和下劃線構成,數字不能開頭。
- 大小寫敏感(大寫的
a
和小寫的A
是兩個不同的變數)。 - 不要跟關鍵字(有特殊含義的單詞,後面會講到)和系統保留字(如函式、模組等的名字)衝突。
- PEP 8要求:
- 用小寫字母拼寫,多個單詞用下劃線連線。
- 受保護的例項屬性用單個下劃線開頭(後面會講到)。
- 私有的例項屬性用兩個下劃線開頭(後面會講到)。
當然,作為一個專業的程式設計師,給變數(事實上應該是所有的識別符號)命名時做到見名知意也是非常重要的。
變數的使用
下面通過幾個例子來說明變數的型別和變數使用。
"""
使用變數儲存資料並進行算術運算
Version: 0.1
Author: 駱昊
"""
a = 321
b = 123
print(a + b)
print(a - b)
print(a * b)
print(a / b)
print(a // b)
print(a % b)
print(a ** b)
複製程式碼
"""
使用input函式輸入
使用int()進行型別轉換
用佔位符格式化輸出的字串
Version: 0.1
Author: 駱昊
"""
a = int(input('a = '))
b = int(input('b = '))
print('%d + %d = %d' % (a, b, a + b))
print('%d - %d = %d' % (a, b, a - b))
print('%d * %d = %d' % (a, b, a * b))
print('%d / %d = %f' % (a, b, a / b))
print('%d // %d = %d' % (a, b, a // b))
print('%d %% %d = %d' % (a, b, a % b))
print('%d ** %d = %d' % (a, b, a ** b))複製程式碼
"""
使用type()檢查變數的型別
Version: 0.1
Author: 駱昊
Date: 2018-02-27
"""
a = 100
b = 12.345
c = 1 + 5j
d = 'hello, world'
e = True
print(type(a))
print(type(b))
print(type(c))
print(type(d))
print(type(e))複製程式碼
在對變數型別進行轉換時可以使用Python的內建函式(準確的說下面列出的並不是真正意義上的函式,而是後面我們要講到的建立物件的構造方法)。
- int():將一個數值或字串轉換成整數,可以指定進位制。
- float():將一個字串轉換成浮點數。
- str():將指定的物件轉換成字串形式,可以指定編碼。
- chr():將整數轉換成該編碼對應的字串(一個字元)。
- ord():將字串(一個字元)轉換成對應的編碼(整數)。
運算子
Python支援多種運算子,下表大致按照優先順序從高到低的順序列出了所有的運算子,我們會陸續使用到它們。
**說明:**在實際開發中,如果搞不清楚優先順序可以使用括號來確保運算的執行順序。
下面的例子演示了運算子的使用。
"""
運算子的使用
Version: 0.1
Author: 駱昊
"""
a = 5
b = 10
c = 3
d = 4
e = 5
a += b
a -= c
a *= d
a /= e
print("a = ", a)
flag1 = 3 > 2
flag2 = 2 < 1
flag3 = flag1 and flag2
flag4 = flag1 or flag2
flag5 = not flag1
print("flag1 = ", flag1)
print("flag2 = ", flag2)
print("flag3 = ", flag3)
print("flag4 = ", flag4)
print("flag5 = ", flag5)
print(flag1 is True)
print(flag2 is not False)
複製程式碼
練習
練習1:華氏溫度轉攝氏溫度。
"""
將華氏溫度轉換為攝氏溫度
F = 1.8C + 32
Version: 0.1
Author: 駱昊
"""
f = float(input('請輸入華氏溫度: '))
c = (f - 32) / 1.8
print('%.1f華氏度 = %.1f攝氏度' % (f, c))
複製程式碼
練習2:輸入圓的半徑計算計算周長和麵積。
"""
輸入半徑計算圓的周長和麵積
Version: 0.1
Author: 駱昊
"""
import math
radius = float(input('請輸入圓的半徑: '))
perimeter = 2 * math.pi * radius
area = math.pi * radius * radius
print('周長: %.2f' % perimeter)
print('面積: %.2f' % area)
複製程式碼
練習3:輸入年份判斷是不是閏年。
"""
輸入年份 如果是閏年輸出True 否則輸出False
Version: 0.1
Author: 駱昊
"""
year = int(input('請輸入年份: '))
# 如果程式碼太長寫成一行不便於閱讀 可以使用\或()折行
is_leap = (year % 4 == 0 and year % 100 != 0 or
year % 400 == 0)
print(is_leap)複製程式碼