語言元素
指令和程序
計算機的硬件系統通常由五大部件構成,包括:運算器、控制器、存儲器、輸入設備和輸出設備。
其中,運算器和控制器放在一起就是我們通常所說的中央處理器,它的功能是執行各種運算和控制指令以及處理計算機軟件中的數據。
我們通常所說的程序實際上就是指令的集合,我們程序就是將一系列的指令按照某種方式組織到一起,然後通過這些指令去控制計算機做我們想讓它做的事情。
今天我們大多數時候使用的計算機,雖然它們的元器件做工越來越精密,處理能力越來越強大,但究其本質來說仍然屬於“馮·諾依曼結構”的計算機。
“馮·諾依曼結構”有兩個關鍵點,一是指出要將存儲設備與中央處理器分開,二是提出了將數據以二進制方式編碼。
二進制是一種“逢二進一”的計數法,跟我們人類使用的“逢十進一”的計數法沒有實質性的區別,人類因為有十根手指所以使用了十進制(因為在數數時十根手指用完之後就只能進位了,當然凡事都有例外,瑪雅人可能是因為長年光著腳的原因把腳趾頭也算上了,於是他們使用了二十進制的計數法,在這種計數法的指導下瑪雅人的歷法就與我們平常使用的歷法不一樣,而按照瑪雅人的歷法,2012年是上一個所謂的“太陽紀”的最後一年,而2013年則是新的“太陽紀”的開始,後來這件事情被以訛傳訛的方式誤傳為”2012年是瑪雅人預言的世界末日“這種荒誕的說法,今天我們可以大膽的猜測,瑪雅文明之所以發展緩慢估計也與使用了二十進制有關)。
對於計算機來說,二進制在物理器件上來說是最容易實現的(高電壓表示1,低電壓表示0),於是在“馮·諾依曼結構”的計算機都使用了二進制。
雖然我們並不需要每個程序員都能夠使用二進制的思維方式來工作,但是瞭解二進制以及它與我們生活中的十進制之間的轉換關係,以及二進制與八進制和十六進制的轉換關係還是有必要的。如果你對這一點不熟悉,可以自行使用維基百科或者百度百科科普一下。
提示:近期關於量子計算機的研究已經被推到了風口浪尖,量子計算機基於量子力學進行運算,使用量子瞬移的方式來傳遞信息。2018年6月,Intel宣佈開發出新款量子芯片並通過了在接近絕對零度環境下的測試;2019年1月,IBM向全世界發佈了首款商業化量子計算機。
變量和類型
在程序設計中,變量是一種存儲數據的載體。計算機中的變量是實際存在的數據或者說是存儲器中存儲數據的一塊內存空間,變量的值可以被讀取和修改,這是所有計算和控制的基礎。
計算機能處理的數據有很多種類型,除了數值之外還可以處理文本、圖形、音頻、視頻等各種各樣的數據,那麼不同的數據就需要定義不同的存儲類型。
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變量命名
對於每個變量我們需要給它取一個名字,就如同我們每個人都有屬於自己的響亮的名字一樣。在Python中,變量命名需要遵循以下這些必須遵守硬性規則和強烈建議遵守的非硬性規則。
硬性規則:變量名由字母(廣義的Unicode字符,不包括特殊字符)、數字和下劃線構成,數字不能開頭。大小寫敏感(大寫的a和小寫的A是兩個不同的變量)。不要跟關鍵字(有特殊含義的單詞,後面會講到)和系統保留字(如函數、模塊等的名字)衝突。PEP 8要求:用小寫字母拼寫,多個單詞用下劃線連接。受保護的實例屬性用單個下劃線開頭(後面會講到)。私有的實例屬性用兩個下劃線開頭(後面會講到)。當然,作為一個專業的程序員,給變量(事實上應該是所有的標識符)命名時做到見名知意也是非常重要的。
變量的使用
下面通過幾個例子來說明變量的類型和變量使用。
<code>
""" 使用變量保存數據並進行算術運算 """
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) /<code>在Python中可以使用type函數對變量的類型進行檢查。
程序設計中函數的概念跟數學上函數的概念是一致的,數學上的函數相信大家並不陌生,它包括了函數名、自變量和因變量。
如果暫時不理解這個概念也不要緊,我們會在後續的章節中專門講解函數的定義和使用。
<code>
""" 使用type()檢查變量的類型 """
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)) /<code>可以使用Python中內置的函數對變量類型進行轉換。
int():將一個數值或字符串轉換成整數,可以指定進制。float():將一個字符串轉換成浮點數。str():將指定的對象轉換成字符串形式,可以指定編碼。chr():將整數轉換成該編碼對應的字符串(一個字符)。ord():將字符串(一個字符)轉換成對應的編碼(整數)。下面的代碼通過鍵盤輸入兩個整數來實現對兩個整數的算術運算。
<code>
""" 使用input()函數獲取鍵盤輸入(字符串) 使用int()函數將輸入的字符串轉換成整數 使用print()函數輸出帶佔位符的字符串 """
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)) /<code>說明:上面的print函數中輸出的字符串使用了佔位符語法,其中%d是整數的佔位符,%f是小數的佔位符,%%表示百分號(因為百分號代表了佔位符,所以帶佔位符的字符串中要表示百分號必須寫成%%),字符串之後的%後面跟的變量值會替換掉佔位符然後輸出到終端中,運行上面的程序,看看程序執行結果就明白啦。
運算符
Python支持多種運算符,下表大致按照優先級從高到低的順序列出了所有的運算符,運算符的優先級指的是多個運算符同時出現時,先做什麼運算然後再做什麼運算。
除了我們之前已經用過的賦值運算符和算術運算符,我們稍後會陸續講到其他運算符的使用。
說明: 在實際開發中,如果搞不清楚運算符的優先級,可以使用括號來確保運算的執行順序。
下面的例子演示了賦值運算符和複合賦值運算符的使用。
<code>
""" 賦值運算符和複合賦值運算符 """
a =10
b =3
a += b a *= a +2
print(a) /<code>下面的例子演示了比較運算符(關係運算符)、邏輯運算符和身份運算符的使用。
<code>
""" 比較、邏輯和算身份運算符的使用 """
flag0 =1
==1
flag1 =3
>2
flag2 =2
1
flag3 = flag1and
flag2 flag4 = flag1or
flag2 flag5 =not
(1
!=2
) print('flag0 ='
, flag0) print('flag1 ='
, flag1) print('flag2 ='
, flag2) print('flag3 ='
, flag3) print('flag4 ='
, flag4) print('flag5 ='
, flag5) print(flag1is
True
) print(flag2is
not
False
) /<code>練習
練習1:華氏溫度轉換為攝氏溫度。
提示:華氏溫度到攝氏溫度的轉換公式為:$C=(F - 32) \div 1.8$。
參考答案:
<code>
""" 將華氏溫度轉換為攝氏溫度 """
'請輸入華氏溫度: '
)) c = (f -32
) /1.8
print('%.1f華氏度 = %.1f攝氏度'
% (f, c)) /<code>練習2:輸入圓的半徑計算計算周長和麵積。
參考答案:
<code>
""" 輸入半徑計算圓的周長和麵積 """
import
math radius = float(input('請輸入圓的半徑: '
)) perimeter =2
* math.pi * radius area = math.pi * radius * radius print('周長: %.2f'
% perimeter) print('面積: %.2f'
% area) /<code>練習3:輸入年份判斷是不是閏年。
參考答案:
<code>
""" 輸入年份 如果是閏年輸出True 否則輸出False """
year = int(input('請輸入年份: '
)) is_leap = (year %4
==0
and
100
!=0
)or
\ year %400
==0
print(is_leap)/<code>