簡明Python3教程 6.基礎


你肯定不滿足於只打印"Hello World"吧? 你想要的更多 - 你希望得到一些輸入,操縱它后再從中得到某些東西.
我們可以使用python中的常量和變量實現這些功能。

 

字面常量(literal constant)
字面常量的一個例子是數字諸如5, 1.23, 9.25e-3或字符串This is a string', "It's a string!".
顧名思義,字面常量的重點在於"字面", 你直接以字面的意義使用它們。數字2永遠是數字2絕不會是別的東西。
而常量代表它們永遠不會被改變,因此它們全被稱為字面常量


數字
python3擁有3種數字類型 - 整數,浮點和復數(注: python3的整數類型已經被統一了,再沒有短整數和長整數的分別)
•  例如,2是一個整數.
•  浮點數的例子如3.23, 52.3E-4. E代表10的冪,在這里52.3E-4等於52.3 * 10-4
•  -5+4j, 2.3 - 4.6j屬於復數

編程老鳥請注意
python3沒有"long int"類型,事實上python的整數可以任意大(注: 只是理論上的,再咋地存儲器也不是無限的)

 

字符串
字符串是一個字符序列,經常用來表示字詞. 字詞可以是英語也可以是Unicode標准支持下的任何語言.
而unicode支持世界上絕大多數語言(http://www.unicode.org/faq/basic_q.html#16).

編程老鳥請注意
在python3中不存在純ASCII字符串,因為Unicode是ASCII的父集。
如果你真的需要一個純ASCII字符串,則需調用字符串.encode("ascii")方法.
詳見StackOverflow中的相關討論
(http://stackoverflow.com/questions/175240/how-do-i-convert-a-files-format-from-unicode-to-ascii-using-python#175270).
(注: 沒必要看了過時了,調用encode后產生一個bytes對象,它不是字符串對象,python3中的所有字符串都是unicode)
我幾乎可以保證在你編寫的每個程序中都會用到字符串,下面將教你如何使用字符串,你要特別留心點阿.

單引號
你可以將字符串放到單引號中,所有空白字符即空格和tab都回原封保留。

雙引號
雙引號和單引號的效果完全相同。

三引號
在指定多行字符串的時候可以利用三引號 - ("""'''), 在三引號中還能自由的使用單引號和雙引號. 一個例子:
     '''This is a multi
     This is the second
     "What's your name?
     He said "Bond, Jam
     '''
轉義字符
假設你想要一個帶單引號(')的字符串,你會怎么寫呢?例如What's your name?,
你不能寫成'What's your name?', 因為python會搞不清字符串是從哪開始又是從哪結束.
所以你需要告訴python字符串中間的單引號並不是字符串的結束標志。利用轉義字符可以做到這點.
將單引號替換成 /' - 注意反斜杠,這樣字符串就變成'What/'s your name?'了.
另一個辦法是使用雙引號"What's your name?",

不過當你需要雙引號的時候和單引號的情況類似,必須加上反斜杠 /", 而反斜杠也一樣必須表示成//
如果你需要一個雙行字符串呢? 一個辦法是使用前面提到的三引號或者使用換行的轉義字符/n開始新的一行,
還有一個有用的轉義字符/t表示tab, 轉義字符太多了我只說了常用的.
另一個值得注意的地方是在一個字符串末尾的反斜杠表示這個字符串將被合並到下一行, 例如:
     "This is the first sentence./
     This is the second sentence."

上面的字符串等價於"This is the first sentence. This is the second sentence.".

原始字符串
如果你不希望python對字符串進行特別處理, 比如取消轉義字符, 可以為字符串加上前綴r或R.
例如r"Newlines are indicated by /n".

字符串是不可變類型
這意味着創建一個字符串對象后就無法改變它了. 這聽起來很糟糕, 其實非也, 后面見分解.

字面字符串連接 
如果你將兩個字面字符串相鄰, 它們會被python自動合並到一起.
例如'What/'s ' 'your name?'會變為"What's your name?"
C++程序員請注意
python沒有單獨的字符類型, 也沒這個必要我保證你不會為此煩惱.
Perl/PHP程序員請注意
單引號和雙引號字符串完全相同, 沒有任何區別
正則表達式用戶請注意
永遠使用原始字符串編寫正則表達式, 否則會需要大量的反斜杠, 例如反向引用可以表示為'//1'r'/1'.

字符串的format方法
有時我們需要使用額外信息構造字符串, 這時format就很有用了.
     #!/usr/bin/python
     # Filename: str_format.py
     age = 25
     name = 'Swaroop'
     print('{0} is {1} years old'.format(name, age))
     print('Why is {0} playing with that python?'.format(name))
輸出:
     $ python str_format.py
     Swaroop is 25 years old
     Why is Swaroop playing with that python?

format如何工作?
一個string可以含有某些格式說明符, 隨后調用的format將用你提供給它的參數替換對應的格式說明符.
觀察上面的例子, {0}對應變量name它也是format的第1個參數. 與之類似{1}對應format的第2個參數age.
注意我們也可以使用字符串連接達到同樣的目的: name + ' is ' + str(age) + ' years old'.
但是這種方式太亂啊, 很容易出錯. 而且需要手動將變量轉換為字符串而format可以為我們代勞.
最后, 使用format我們可以改變最終生成的字符串而不必修改傳給format的變量, 反之一樣.
format的本質就是將其參數替換到字符串中的格式說明符, 下面是一些更復雜的使用方式:
     >>> '{0:.3}'.format(1/3) #小數點后保留3位
     '0.333'
     >>> '{0:_^11}'.format('hello') #以下划線填充字符串到11位長, hello中間對齊
     '___hello___'
     >>> '{name} wrote {book}'.format(name='Swaroop', book='A Byte of Python') 
     # 關鍵字格式化
     'Swaroop wrote A Byte of Python'

關於格式說明符的具體信息見Python增強提議No.3101(http://www.python.org/dev/peps/pep-3101/).


變量
只使用字面常量很快就會感到無聊 - 我們需要某種方式存儲並操作任何信息,變量就是其主要手段。
正如其名 - 變量的值可以變化,即可以用它們存儲任何數據。
變量實際上只是計算機存儲器的一部分,用於存儲你給出的信息。
與字面常量不同,你需要訪問這些變量,因此需要你給它們起名字。

 

標識符命名
變量是標識符的一個例子,而標識符用於標識某些東西的名字。下面是一些命名標識符識必須遵守的規則:
•  標識符的第一個字符必須是字母(包括大小寫ASCII字母或unicode字符)或下划線('_')(注: 沒錯,用中文試試哈)
•  后面的字符可以由字母(大小寫ASCII字母或unicode字符),下划線('_')和數字組成.
•  標識符是大小寫敏感的,例如mynamemyName是不同的,前者小寫后者大寫.
•  一些合法標識符的例子i, __my_name, name_23, a1b2_c3,
   resumé_count.(注: 不知道亂碼還是某國語言...)
•  非法標識符的例子, 2things, my-name, "this_is_inquotes"

 

數據類型
變量能容納不同類型的值,被稱為數據類型. 基本數據類型包括我們剛才討論過的數字和字符串.
在后面的章節中我們將看到如何利用類創建我們自己的數據類型。

 

對象
記住,在python中一切皆對象,因此從廣義上我們不說"某物"而說"某對象"

面向對象編程用戶請注意
python是很徹底的面向對象語言,它的一切包括數字,字符串和函數全是對象。

 

如何編寫python程序
     從現在開始,保存和運行一個python程序的過程如下:
     1. 打開你鍾愛的編輯器.
     2. 輸入本書的范例代碼.
     3. 用源文件注釋中給出的名字保存文件。並且我遵循慣例為python文件加上py后綴名.
     4. 以命令python program.py啟動解釋器執行程序或者使用IDLE. 當然你也可以使用前文介紹過的執行方法。

 

范例: 使用變量和字面常量
     # Filename : var.py
     i = 5
     print(i)
     i = i + 1
     print(i)
     s = '''This is a multi-line string
     This is the second line.'''
     print(s)
     #輸出:
         $ python var.py
         5
         6
         This is a multi-line stri
         This is the second line.

范例工作流程:
首先,我們使用賦值運算符(=)為變量i賦值字面常量5,這行被稱做一條語句,因為它表示需要完成某種操作,
這里是為變量名i綁定數值5. 接下來我們使用print語句打印i的值.

(注: py2k中print是條語句,說成"print語句"可以接受,但py3k中print是個地道的函數,因此說"調用print函數"更為恰當)
然后我們為i的值加1並存回i, 當打印它的值時得到意料中的6
與之類似,我們又為變量S賦值字面字符串然后打印它。

靜態語言程序員請注意
變量被賦值后即可使用,這里無需變量聲明或數據類型定義.

 

邏輯行和物理行
你所看到的代碼中的行即為物理行,而python將一條語言當作一個邏輯行。
python假設一個物理行對應一個邏輯行。
邏輯行的例子是形如print('Hello World')的單條語句,如果它獨占一行(就象你在編輯器看到的),那么它也是一個物理行.
python本身鼓勵每條語句占一行,這樣可讀性更強。
如果你希望在一個物理行包含多個邏輯行,則必須使用分號(;)顯式一個邏輯行/語句的結束. 例,
     i = 5
     print(i)

與下面的等效
     i = 5;
     print(i);
這樣寫的效果也一樣
     i = 5; print(i);
甚至可以這樣寫
     i = 5; print(i)
雖然有多種寫法,但我強烈建議你一個物理行只包含一個邏輯行. 不過當邏輯行太長,也可以把它寫成多個物理行。
這些辦法都是為了盡可能避免分號,使得代碼的可讀性更強。事實上我從不使用甚至都沒在python程序中看到過分號。
下面是一個將邏輯行擴展為多個物理行的例子,它被稱做顯式行合並(explicit line joining)
     s = 'This is a string. /
     This continues the string.'
     print(s)

相應的輸出為:
     This is a string. This continues the string.
與之類似的,

     print
     /(i)

相當於
     print(i)
另外某些情況下會導致隱式行合並(implicit line joining),比如邏輯行使用了大中小括號,此時無需反斜杠。
在后面的章節我們會使用列表編寫程序,屆時你會看到這種用法。

 

縮進
在python中空白字符是非常重要的,更具體的說是每行開頭的空白字符十分重要。這被稱作縮進
邏輯行開頭的空白字符(空格和tab)用於確定邏輯行的縮進級別,依此按順序將語句分組。
也就是說同組的語句必須擁有相同的縮進級別,而這些語句組被稱作。下一章我們會看到塊的重要性。
現在你需要牢記的是錯誤的縮進會導致程序出錯, 舉個例子:
     i = 5
      print('Value is ', i) #錯誤! 注意本行的開頭多了一個空格.
     print('I repeat, the value is ', i)

運行上面代碼會得到下面的錯誤信息:
     File "whitespace.py", line 4
     print('Value is ', i) # Error! Notice a single space at the start of the line
        ^
     IndentationError: unexpected indent

你可能注意到了程序的第2行的開頭多了一個空格. 錯誤信息告訴我們程序的語法是非法的, 即程序的編寫有問題.
這也意味着你不能隨便開始新的語句塊(除了主塊, 我們一直在主快內編寫). 那么要如何開始新的塊呢? 后面的章節會有詳解, 比如控制流.

如何縮進
不要混用空格和tab, 否則在不同的平台可能無法正常工作.
我強烈建議你使用tab或4個空格進行縮進, 謹記兩者則其一然后一直用下去.

靜態語言程序員請注意
python總是使用縮緊表達語句塊, 這里沒有括號啥事. 運行代碼Run from __future__ import braces了解更多
(注: 表運行了, 過時了無視吧, 不過前句話沒過時啊!)

 

小結
本章涉及到很多核心知識, 下面會接觸到更有趣的東東, 比如控制流語句.
在此之前請確定你已經對本章的內容有足夠的理解了.

 

 

 

--------------Python書籍推薦-----------------
Python基礎教程-第2版.修訂版 
 
 
PYTHON核心編程
 
 
零基礎學Python


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM