[2] Python變數

1. 概述

在本文中我會介紹關於在Python中何為變數、如何命名和使用變數。首先我們來看一下我們在上一篇中擬定的學習計劃,加粗體代表我們已經介紹的內容,斜體代表新增內容。

  • 計算機編程的原理簡要介紹
  • 集成開發環境PyCharm
  • 變數名、數字、字元串、列表
  • 句式
  • 輸入和輸出
  • 條件判斷語句
  • 循環語句
  • 注釋
  • 函數
  • 模塊和引入
  • 各類數據結構

2. 變數

變數是存放數據的一個內存區域,可以理解為存放數據的一個地方,我們用一個自己看得懂的詞或者字母來表示特定的數據,在程序中,直接用變數名來代替這些數據,能讓程序更直觀、簡潔、便於發現錯誤。比如如果我們要計算一個人的體重(重力),假設這個人重65kg,重力係數取10N/kg,我們可以這麼編:

print(65 * 10)n

點擊運行後,我們會在屏幕上看到650。

或者我們可以使用變數:

m = 65ng = 10nprint(m * g)n

點擊運行後,我們也會看到結果為650。

看樣子我們的代碼從一行變成了三行,但是如果數據本身十分複雜、代碼比較多、數據得重複使用時,使用變數來代替數據會讓代碼更簡潔,如果有數據輸入錯誤需要更改,我們只要更改賦予變數值的那行(就是m = 65,g = 10)就可以了。

比如我們有十個人,體重分別是10、20、30、40、50、60、70、80、90、100kg,重力係數取10N/kg,我們可以這麼編:

print(10 * 10)nprint(20 * 10)nprint(30 * 10)n...nprint(100 * 10)n

或者這麼編:

g = 10nprint(10 * g)nprint(20 * g)nprint(30 * g)n...nprint(100 * g)n

兩者運行結果都是一樣的。但是萬一我們要更加精確,g取9.8的時候,在第一段代碼中我們需要一行一行改,把每個代表重力係數的10改成9.8,而在第二段代碼中我們只需要把第一行的g = 10改成g = 9.8就行了,程序每看到一個g,就會知道這個g的值是9.8。

3. 變數名的命名規則

變數是可以用來存值,以及代表一個值以便使用和更改,給變數起名也要遵守一定的基本法,當然程序猿的決定權也是很重要的。我們在命名一個變數時,可以使用:

  • 大小寫字母
  • 數字
  • 下劃線

命名不限長度、起名風格,但必須要遵守以下基本規則:

  • 必須以大小寫字母或者下劃線開頭,不得以數字開頭,比如name1可以但是1name就不能作為變數名。
  • 為了遵守代碼的簡潔易讀的原則,起的名字必須要有意義,比如我們想要有個年齡的變數名,我們可以用age或者nian_ling,但是如果起名a或者abc,雖然沒錯,卻增加了別人或者日後我們讀這段代碼的學習成本(我們還要花時間來弄懂這個變數名究竟指代什麼、在程序中用來幹什麼)。

當然,還有一點很重要就是:

  • 變數名區分大小寫,name和Name是不一樣的。

下面我們來看幾個正確的命名方式:

namenPerson1nperson_2n_gravity_constantnAVOGADRO_CONSTANTnhomeAddressn

4. 賦值

作為一個變數,必須得有一個值,我們用等號來給變數賦值,比如

normal_price = 998nsurprise_price = 99.8n

也就是說我們給normal_price正常價錢一個值,998,給驚喜價surprise_price一個值99.8。一般來說,我們可以理解為我們把右邊的數據賦予給變數,然後用這個變數來在接下來的程序中表示這個數據。

Python的一個優點在於:我們不需要特地強調這個變數是是什麼類型(整數、浮點數還是字元串還是其他類型),Python的編譯器會自動檢測後面數據來推斷類型,不知道什麼是整數、浮點數、字元串的同學,我會在之後的文章里介紹這些數據類型的區別。

我們賦值有好幾種方法,

a = b = c = 998nd, e, f, g, h = 1998, 98, 9.8, "Surprise!", 9999.98n

這裡,a和b和c都是998,d是1998,e是98,f是9.8,g是「Surprise!」,h是9999.98。

5. 簡單代碼的運行順序和值的更改

一般來說,代碼都是從上往下運行的,比如

normal_price = 998nsale_price = normal_price * 0.9n

我們先定義了normal_price是998,知道了normal_price的值後,才能計算出normal_price*0.9,然後再把計算出的值賦予sale_price。

但是如果我們交換這兩行,

sale_price = normal_price * 0.9nnormal_price = 998n

Python就會報錯,因為我們在運行第一行時,還沒有normal_price這個變數,不知道它究竟指代的是什麼。

當然賦值給一個變數後不等於我們不能更改這個變數的值,例如

normal_price = 998nsale_price = normal_price * 0.9nnormal_price = 98n

首先執行第一行,normal_price為998;

接著執行第二行,sale_price為998 * 0.9,即898.2;

接著執行第三行,normal_price被重新賦值,現在是98。程序結束。

我們可以看到本程序創建了兩個變數,而在程序結束時兩個變數的值分別是898.2和98,雖然sale_price被定義為normal_price打九折,但因為第二行執行時用的是998這個值,並不知道之後normal_price被改成了98,而在執行第二行後,sale_price的值的計算就結束了、停止了,不會再更新了。

大家不要把編程想得太智能了,用我大一時教C語言的教授一句話就是:

電腦很笨,你必須得一步一步告訴它要幹什麼。

如果我們想顯示值的話,我們可以插入print函數,運行時能看到值的更改。

我們再來練習一段代碼:

normal_price = 998nsale_price = normal_price * 0.9nprint("Line 1 & 2")nprint(normal_price, sale_price)nnnormal_price = sale_pricensale_price = sale_price - 10nprint("Line 6 & 7")nprint(normal_price, sale_price)n

結果顯示是

Line 1 & 2n998 898.2nLine 6 & 7n898.2 888.2n

我們來一行一行運行:

  1. 賦予normal_price值998
  2. 計算normal_price * 0.9,得出898.2,賦值給sale_price
  3. 在屏幕顯示「Line 1 & 2」 這句話
  4. 在屏幕顯示normal_price和sale_price的值
  5. 空白行
  6. 將sale_price的值(898.2)賦給normal_price,此時normal_price被改為898.2
  7. 將sale_price的值減去10,得出898.2-10=888.2,賦給sale_price以更新其值
  8. 在屏幕顯示「Line 6 & 7」 這句話
  9. 在屏幕顯示normal_price和sale_price的值

難點在第7行,

sale_price = sale_price - 10n

賦值的原則是,計算右邊的數據,再賦給左邊的變數,在此處表現為我們先看右邊,sale_price - 10,計算這個公式時我們還沒更新sale_price的值,所以我們還是用它的老值898.2,減去10後,再把計算的結果賦給左邊,更新sale_price所存儲的變數。

「=」等號並不是我們數學裡理解的等於,而是更貼近於一個向左的箭頭,意思是把右邊的值賦予給左邊這個變數。

用彙編語言來理解,其實整個過程可以分為兩部,

sub $1, sale_price, 10nmov $1, sale_pricen

首先,我們去內存中找sale_price,找到了值898.2,做個減法,得出888.2,再放到一個臨時的中間存儲器(這裡我用$1,可以理解為1號存儲器)。然後我們再把臨時存儲器里的888.2這個值,去覆蓋sale_price這個內存區域原來的值。

如果對本文有任何意見或建議,歡迎大家評論區評論,謝謝!


推薦閱讀:

如何用100行Python代碼做出魔性聲控遊戲「八分音符醬」
爬蟲入門到精通-headers的詳細講解(If-modified-since)
跟黃哥學python序列文章之python方法鏈(method chaining)
代碼優化指南:人生苦短,我用Python
由淺入深寫代理(3) -socks5 代理

TAG:Python | 计算机科学 | 编程 |