我要翻譯《Think Python》- 004 第二章 變量, 表達式和語句

 

PDF源文件地址 :  http://www.greenteapress.com/thinkpython/thinkpython.pdfpython

[自述:這一章內容很少,可是因爲時間關係,翻譯完成這一章也花了我一週的時間,跟我預想的進度相比已經落後了,得加油了,要否則翻譯完整本書就要到猴年馬月了。目前離翻譯完成還有17章!!!]程序員

第二章

變量, 表達式和語句


2.1 值和類型

  值是程序工做的基本要素,如字符串「Hello,World!」或數字一、2等等。
  這些值屬於不一樣類型:2是一個整數,而「Hello,World!」是字符串,之因此這麼命名,是由於它包含了一「串」字符。固然你和解釋器均可以識別字符串,那是由於它是用一對引號括起來的。另外你若是不肯定值的類型,解釋器的type函數能夠告訴你。
  毫無疑問,字符串屬於str類型,整數是int類型。
  >>> type('Hello, World!')
  <type 'str'>
  >>> type(17)
  <type 'int'>編程

  須要注意的是,有小數點的數字稱之爲float型,即「浮點」格式表示的數字。編程語言

  >>> type(3.2)
  <type 'float'>函數

  那如何區分‘17’和‘3.2’這樣的值呢?它們看起來像數字,可是它們像字符串同樣被引號括起來了。
  >>> type('17')
  <type 'str'>
  >>> type('3.2')
  <type 'str'>
  所以,它們是字符串。
  當你輸入一個大整數,你可能會用千分號隔開來表示數字1,000,000,這在Python裏面是非法的,可是在實際應用中倒是合法的。
  >>> 1,000,000
  (1, 0, 0)
  這固然不是咱們所指望的結果!Python把千分號隔開的整數1,000,000解釋爲一個整數序列。這是本書的第一個語義錯誤的例子:代碼運行沒有產生錯誤,但結果倒是「不對」的。測試


2.2 變量

  編程語言最強大的特性之一就是變量賦值的能力,變量即值引用。
  用賦值語句建立變量並給變量賦值:
  >>> message = 'And now for something completely different'
  >>> n = 17
  >>> pi = 3.1415926535897932
  以上3條賦值語句,第一個創建一個message新變量並賦值了一個字符串,第二個把n賦值爲整數17,第三個把π的近似值賦值給變量pi。
  咱們在紙上演示給變量賦值的時候,一般是先寫下變量名,而後用一個箭頭指向變量的值,這種類型的圖例咱們稱之爲狀態圖,由於狀態圖能夠標示每一個變量的狀態。上面例子的狀態圖如圖2.1所示。spa

  圖2.1翻譯


  變量類型即值引用類型。
  >>> type(message)調試

  <type 'str'>
  >>> type(n)rest

  <type 'int'>
  >>> type(pi)

  <type 'float'>

 

2.3 變量名和關鍵字

  程序員一般會選擇有具體含義的名字來給變量命名——用來記錄變量的做用。
  變量名的長度沒有限制,能夠包含數字和字母,可是必須以字母開頭,推薦首字母小寫,固然首字母大寫也是合法的變量名(後面你會明白其緣由)。
  定義變量名也可使用下劃線「_」,一般用在有多個單詞的變量名,例如my_name、airspeed_of_unladen_swallow等。
  若是你定義一個非法的變量名,你將會獲得一個語法錯誤:
  >>> 76trombones = 'big parade'
  SyntaxError: invalid syntax
  >>> more@ = 1000000
  SyntaxError: invalid syntax
  >>> class = 'Advanced Theoretical Zymurgy'
  SyntaxError: invalid syntax
  變量名 76trombones 不是以字母開頭,而 more@ 則包含了非法字符「@」,可是class爲何也是錯誤的呢?那是由於class 是Python的一個關鍵字。由於解釋器運用關鍵字來識別程序結構,所以關鍵字是不能用來做爲變量名使用的。
  Python 2版本有31個關鍵字:
    and    del    from    not    while
    as    elif    global    or    with
    assert    else    if    pass    yield
    break    except    import    print
    class    exec    in    raise
    continue    finally    is    return
    def    for    lambda    try
  而在Python 3版本中 exec 再也不是關鍵字,可是多了一個nonlocal 關鍵字。
  所以,請牢記這些關鍵字,當解釋器報變量名錯誤的時候你能夠檢查變量名是否跟關鍵字重複了。


2.4 運算符和運算

  像表示加法和乘法的運算符是特殊字符,將運算符應用到計算中叫作運算。

  運算符+,-,*,/和**分別表示加法,減法,乘法,除法和冪,用法示例以下:
  20+32    hour-1    hour*60+minute    minute/60    5**2    (5+9)*(15-7)

  在其它一些編程語言中,^表示異或運算,可是在Python中用XOR來表示異或位運算。本書不會討論位運算,若是你對此感興趣,請參考與位運算相關的連接:http://wiki.python.org/moin/BitwiseOperators
  在Python2版本中,除法運算可能不像你想象的那樣:
  >>> minute = 59
  >>> minute/60
  0
  例子中minute的值爲59,在傳統算術中59除以60的結果是0.98333,而並非0.而形成這種差別的緣由是Python在執行的時候是向下取整數的,當兩個數都是整數的時候,結果也是整數。所以向下取整數就會把小數部分去掉了,所以本例計算結果就是0了。
  在Python3版本中,這個除法運算的結果就是一個浮點數。而新的運算符 // 則表示向下取整數。
  >>> minute/60.0
  0.98333333333333328


2.5 表達式和語句

   一個表達式是值、變量和運算符的組合,值和變量自己都被認爲是表達式,所以下面這些表達式都是合法的(假設變量x已經被賦值):

  17
  x
  x + 17


  語句是指Python解釋器能夠執行的代碼單元,咱們能夠看到兩種語句:打印和賦值。從技術上講表達式也是語句,只是把它們區分開來理解起來可能會顯得簡單一些,它們之間最大的差異在於:表達式有值,而語句則沒有。


2.6 交互模式和腳本模式

  使用解釋型語言有一個好處,就是把代碼保存爲腳本以前,你能夠經過交互式的方式測試代碼,可是交互模式和腳本模式之間的差別依然容易被混淆。
  例如,你當你把Python當成一個計算器使用,你可能輸入:
  >>> miles = 26.2
  >>> miles * 1.61
  42.182
  第一行賦值給變量miles,可是卻看不到效果,第二行是一個表達式,因此解釋器計算並顯示告終果。由此咱們獲得了馬拉松全程長度爲大約42千米。
  可是你要是把代碼寫在腳本里而且運行腳本,你根本看不到輸出結果。在腳本模式中,表達式自己並不可見,而Python實際上已經對錶達式進行了計算,你只有這樣輸入纔會看到輸出結果:
  miles = 26.2
  print miles * 1.61
  最初你可能對解釋器的這種行爲感到疑惑。
  一般狀況下,腳本包含一系列的語句,若是輸出代碼超過一行以上,那麼運行腳本的結果將會一次性的顯示出來。
  例如,腳本以下:
  print 1
  x = 2
  print x
  輸出結果以下:
  1
  2
  賦值語句不會有輸出結果。

 

  練習 1 

  輸入如下語句,觀察Python解釋器的行爲。
  5
  x = 5
  x + 1
  而後再把代碼放在腳本里並執行該腳本,看看會輸出了什麼結果。以後把每一個表達式改爲print語句再運行查看結果。

 

2.7 運算順序

  當表達始終出現多個運算符的時候,計算順序取決於優先等級。在算術運算中Python是遵循數學慣例的。英文縮寫PEMDAS可一幫助你記住預算規則:
    P - 括號具備最高優先級,能夠強制解釋器按所需順序計算,因爲括號內的表達式優先計算,所以 2*(3-1) 等於4,(1+1)**(5-2)等於8(**表示冪運算)。你也能夠運用括號讓表達式更容易閱讀,例如 (minute*100)/60 和 minute*100/60 運算結果是同樣的。
    E - 冪運算的優先等級次之,因此2**1+1的結果是3,而不是4;3*1**3的結果是3,而不是27.
    MDAS - 乘法和除法具備相同的優先等級,其優先級高於加法和減法,加法和減法則具備相同的優先級。2*3-1等於5,而不是4;6+4/2等於8,而不是5。
  

  優先級相同的運算符按從左到右的順序計算(指數運算除外),在表達式 degrees / 2 * pi 中,先算除法而後結果再乘以pi。若是改爲除以2 π,你能夠用括號這樣寫 degrees/(2*pi)或者寫成degrees/2/pi。
  我其實也不肯意花太多時間去記運算符的優先級的,若是我沒法解釋表達式優先級,我會使用括號讓表達式看起來簡單一些。

 

2.8 字符串操做

  一般,你不能對字符串進行數學運算,即便字符串看起來像數字,以下所示代碼是非法的:
  '2'-'1' 'eggs'/'easy' 'third'*'a charm'
  「+」 運算符在字符串操做中是可行的,可是可能不是你所指望的那樣:它執行鏈接操做,也就是把兩個字符串首尾相連。
  例如:
  first = 'throat'
  second = 'warbler'
  print first + second
  輸出結果就是 throatwarbler
  「*」 運算符在字符串操做中也是可行的,它執行重複操做,例如:
  'Spam'*3 運算結果是 'SpamSpamSpam',也就是其中一個操做數是字符串,而另一個必須是一個整數。
  對字符串進行 + 和 * 操做的用法對比是有意義的,就像4*3等同於4+4+4,而'Spam'*3等同於'Spam'+'Spam'+'Spam'同樣。另外一方面,字符串串聯和重複操做跟整數的相加和相乘仍是有顯著區別的,你能區分這裏面的不一樣屬性嗎?

 

2.9 註釋

  隨着程序愈來愈大,愈來愈複雜,其閱讀難度也是愈來愈大。正式語言是龐雜晦澀的,一般很難查看其中一段代碼就能弄明白它在作什麼和這麼作的緣由。
  出於這個緣由,在程序中添加一些用天然語言說明程序的做用的文字就是一個很好習慣。這些說明文字就叫作註釋,通常以 # 開始。
  # compute the percentage of the hour that has elapsed
  percentage = (minute * 100) / 60
  在這個例子中,註釋內容是單獨一行顯示的,固然你也能夠把註釋放在代碼行的最後:
  percentage = (minute * 100) / 60 # percentage of an hour
  每一行代碼中從 # 開始的內容都會被解釋器忽略——這部份內容對程序無任何影響。
  註釋在記錄程序代碼的非明顯特性的時候是很是有用,其合理性體如今要能讓讀者能弄明白代碼的做用,所以程序中用註釋來解釋代碼的做用是有必要的。
  固然,這也不是絕對的,像下面這個註釋倒是畫蛇添足的。
  v = 5 # 賦值5 給變量 v
  而下面這個註釋卻包含着代碼中看不出來的有用的信息
  v = 5 # 5米/秒的速度
  所以,好的變量名能夠減小注釋的內容,可是太長的變量名又會顯得過猶不及,這個地方須要你自行權衡處理。

 

2.10 調試

  此時你最容易犯的語法錯誤是使用了非法的變量名,就像 class 或 yield,這些關鍵字是不能做爲變量名的,又或者像odd~job和US$,這些變量名包含非法字符。
  你若是在一個變量名中間加一個空格,Python就會認爲這是兩個沒有操做符的操做數:
  >>> bad name = 5
  SyntaxError: invalid syntax
  對於語法錯誤,錯誤信息一般沒有太大的幫助,最多見的語法錯誤就是 SyntaxError: invalid syntax 和 SyntaxError: invalid token。
  運行時錯誤最多見的就是「先用後定義」,也就是在給某變量賦值以前就使用該變量,例如你把一個變量名拼寫錯了就會發生這個錯誤:
  >>> principal = 327.68
  >>> interest = principle * rate
  NameError: name 'principle' is not defined
  另外變量名是區分大小寫的,例如LaTeX和latex就是不同的。此時,最容易致使語法錯誤的狀況就是使用變量的順序。例如:計算1/2 π,你可能會輸入以下代碼:
  >>> 1.0 / 2.0 * pi
  可是,按優先等級,除法是先進行計算,所以你將會獲得的結果是π/2,而不是1/2π。此時Python並不知道你到底想要什麼結果,所以在這個例子中你得不到任何報錯信息,於是你獲得了一個錯誤的結果。

 

2.11 術語表

  值:
    數據基本單位,如數字或字符串,程序操做等
  類型:
    值的分類。到目前爲止有整數,浮點數和字符型。
  整數:
    表示整數的類型
  浮點型:
    用小數表示的數字類型
  字符型:
    表示字符序列的類型
  變量:
    值引用的名稱
  語句:
    表示命令或操做的代碼。目前爲止,語句包含賦值和打印語句。
  賦值:
    爲變量賦值的語句
  狀態圖:
    用來表示變量及其值引用的圖形
  關鍵字:
    編譯器用來解析程序的保留字。例如if,def和while等關鍵字是不能用來做爲變量名的。
  運算符:
    用來表示簡單計算,如加減乘除或字符串級聯的特殊字符
  操做數:
    運算符所操做的值
  向下取整:
    兩數相除忽略小數部分
  表達式:
    由變量、運算符、值等表示求得數值的組合
  求值:
    經過操做來簡化表達式並得到一個值
  優先法則:
    用於計算涉及多個運算符和操做數的表達式的順序的規則集
  鏈接:
    把兩個操做數首尾相連
  註釋:
    程序中的爲了讓其餘程序員(或任何閱讀源代碼的人)提供的對程序的執行沒有任何影響信息。

 

2.12 練習


練習 2
  假設咱們執行如下賦值語句:
  width = 17
  height = 12.0
  delimiter = '.'
  爲下面每個表達式寫下運算結果和結果類型(表達式的值)

  1.   width/2
  2.   width/2.0
  3.   height/3
  4.   1 + 2 * 5
  5.   delimiter * 5

  用Python解釋器檢查你的答案

   

 

練習 3
  練習使用Python做爲一個計算器:
  1. 計算半徑爲 r 的球體體積爲:4/3 π r3,半徑爲5的球體積是多少?提示:392.7 是錯的。 

print(4/3*3.14159*5**3)
523.5983333333332

 

  2. 假設一本書的價格是 $24.95,可是書店有40%的優惠,運費每次按第一本書 3$ 計算,超出的其它書按每本 0.75$ 計算。若是購買60本書則須要多少錢?

print('%.2f' % (24.95*(1-0.4)*60+3+0.75*59))
945.45

 

  3. 若是我在 6:52 從家裏出發,先慢速跑 1 英里(8分15秒每英里),而後再快跑 3 英里(7分12秒每英里),而後再慢跑1英里,請問我幾點能回到家吃早飯?

   

這一題個人解題思路是:先算出跑步一共花了多少分鐘,而後跟出發時間減一下,能夠算出大概 7:30 能回到家

print((((8*60+15)*2+(7*60+12)*3)/60))
38.1
相關文章
相關標籤/搜索