程式扎記: [ The python tutorial ] 3. An Informal Introduction to Python

標籤

2011年12月30日 星期五

[ The python tutorial ] 3. An Informal Introduction to Python

轉載自 這裡 
3.1. Using Python as a Calculator 
Let’s try some simple Python commands. Start the interpreter and wait for the primary prompt, >>>. (It shouldn’t take long.

- Numbers 
跟其他語言一樣, 你可以使用加減乘除對數字進行操作 : 
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2 # and a comment on the same line as code
4
>>> (50-5*6)/4
5.0
>>> 8/5 # Fractions aren't lost when dividing integers
1.6

更多有關於浮點數可以參考 Floating Point Arithmetic: Issues and Limitations, 要注意的是整數相除在 Python 會產生浮點數! 

如果在整數相除想得到捨棄小數點的整數結果, 可以考慮運算子 // : 
>>> # Integer division returns the floor:
... 7//3
2
>>> 7//-3
-3

符號 '=' 在 Python 用來賦值, 你可以在一行對多個變數賦值 : 
>>> x = y = z = 0 # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0

在 Python 的變數在 access 前必須要先賦值 ("defined" - assigned a value), 否則會有例外發生 : 
>>> # try to access an undefined variable
... n
Traceback (most recent call last):
File "", line 1, in
NameError: name 'n' is not defined

另外 Python 也支援 複數 型態. 你可以使用語法 real+imagj 賦值, 或是透過函示 complex(real, imag) 也可以 : 
>>> 1j * 1J
(-1+0j)
>>> 1j * complex(0, 1)
(-1+0j)
>>> 3+1j*3
(3+3j)
>>> (3+1j)*3
(9+3j)
>>> (1+2j)/(1+1j)
(1.5+0.5j)

如果你要從一個複數 z 取出實數與虛數, 可以使用該複數的 attribute real/imag, 如 z.real and z.imag : 
>>> a=1.5+0.5j
>>> a.real
1.5
>>> a.imag
0.5

底下為一些對複數操作的範例, 你可以使用函數 abs(z) 取得複數的 "magnitude", 但是不能使用函數 float() 或 int() 對複數做轉換 : 
>>> a=3.0+4.0j
>>> float(a)
Traceback (most recent call last):
File "", line 1, in ?
TypeError: can't convert complex to float; use abs(z)
>>> a.real
3.0
>>> a.imag
4.0
>>> abs(a) # sqrt(a.real**2 + a.imag**2)
5.0

在 Interactive mode, 上一次操作的結果會被存放在變數 _ : 
>>> tax = 12.5 / 100
>>> price = 100.50
>>> price * tax
12.5625
>>> price + _
113.0625
>>> round(_, 2)
113.06

對於上面介紹的特數變數 "_" 最好不要取跟它同名的變數或是對它進行賦值, 否則你便無法使用該變數的特殊功能 : 

- Strings 
在 Python 中的字串可以用 single/double quote 來包住, 底下為簡單範例 : 
>>> 'spam eggs'
'spam eggs'
>>> 'doesn\'t'
"doesn't"
>>> "doesn't"
"doesn't"
>>> '"Yes," he said.'
'"Yes," he said.'
>>> "\"Yes,\" he said."
'"Yes," he said.'
>>> '"Isn\'t," she said.'
'"Isn\'t," she said.'

如果字串有跨行, 你可以使用 backslash "\", 這樣下一行跟上一行便會自動串接, 在很長的字串或多行字串很有用 : 
hello = "This is a rather long string containing\n\
several lines of text just as you would do in C.\n\
Note that whitespace at the beginning of the line is\
significant."

print(hello)

上面範例的換行需要用 '\n' 來表示, 如果你想要讓代碼中字串的換行就直接代表換行, 可以考慮 triple quote """ 或 ''' : 
 

如果你想要讓 '\n' 就是字面上的字元而不是換行時, 可以在前面加 "r" : 
 

字串可以透過符號 + 進行串接, 或是透過符號 * 進行重複 : 
 

兩個相臨的字串會被自動串接 : 
 

在 Python 沒有所謂 Char 型態, char 就是長度為一的字串, 你可以使用 index 的方式取的字串中的某個 char, 第一個字元的 index=0, 或是透過 slice [m:n] 操作多個字元 : 
>>> word
'HelpA'
>>> word[4]
'A'
>>> word[0:2]
'He'
>>> word[2:4]
'lp'

事實上 slice 也可以這樣用 : 
>>> word[:2] # The first two characters
'He'
>>> word[2:] # Everything except the first two characters
'lpA'

Python 的字串是 immutable 的, 也就是你不能使用 [] 改變它的值 : 
>>> word[0] = 'x'
Traceback (most recent call last):
File "", line 1, in ?
TypeError: 'str' object does not support item assignment
>>> word[:1] = 'Splat'
Traceback (most recent call last):
File "", line 1, in ?
TypeError: 'str' object does not support slice assignment

但是你可以使用字串來 "產生新的" 字串 (原有字串內容不變) : 
>>> word[:2] + word[2:] # s[:i] + s[i:] equals s.
'HelpA'
>>> word[:3] + word[3:]
'HelpA'

如果再使用 slice 時, 範圍超過或不在原有字串中, 則空字串會被返回 : 
>>> word[1:100] # 範圍超過, 頂多印到字串尾
'elpA'
>>> word[10:]
''
>>> word[2:1]
''

你也可以使用負值來告訴 slice 從右邊數過來 : 
>>> word[-1] # The last character
'A'
>>> word[-2] # The last-but-one character
'p'
>>> word[-2:] # The last two characters
'pA'
>>> word[:-2] # Everything except the last two characters
'Hel'

如果在 slice 使用負數但又超過範圍 : 
>>> word[-100:]
'HelpA'
>>> word[-10] # error
Traceback (most recent call last):
File "", line 1, in ?
IndexError: string index out of range

如果你要知道字串的長度可以使用函數 len() : 
>>> s = 'supercalifragilisticexpialidocious'
>>> len(s)
34

如果想知道更多字串處理可以參考 : 
Sequence Types — str, bytes, bytearray, list, tuple, range 
Strings are examples of sequence types, and support the common operations supported by such types.

String Methods 
Strings support a large number of methods for basic transformations and searching.

String Formatting 
Information about string formatting with str.format() is described here.

Old String Formatting Operations 
The old formatting operations invoked when strings and Unicode strings are the left operand of the % operator are described in more detail here.

- About Unicode 
Unicode 從 Python 3.0 以後開始支援. 在某些時候你需要 Unicode 內的字符時, 可以使用 Unicode-Escape encoding : 
>>> 'Hello\u0020World !' # \u0020=0x0020 是空白
'Hello World !'

如果你想轉變字串編碼到特定編碼, 可以使用字串自帶方法 encode(), 並將你想轉換成的編碼名稱用小寫當作參數傳入 : 
>>> "李".encode('utf-8')
b'\xe6\x9d\x8e'

- Lists 
串列為使用 [ ] 將元素包括, 並以 ',' 區隔. 跟字串一樣, 你也可以使用 index 或是 slice 來取得串列中的元素 : 
 

使用 slice 返回的串列是新的串列, 但是串列中的元素還是舊的串列中的元素. (shallow copy), 另外串列中的元素你是可以改變的 : 
>>> a
['spam', 'eggs', 100, 1234]
>>> a[2] = a[2] + 23
>>> a
['spam', 'eggs', 123, 1234]

使用 slice 來對串列賦值很方便, 但是也有可能改變原有串列的大小喔 : 
>>> # Replace some items:
... a[0:2] = [1, 12]
>>> a
[1, 12, 123, 1234]
>>> # Remove some:
... a[0:2] = []
>>> a
[123, 1234]
>>> # Insert some:
... a[1:1] = ['bletch', 'xyzzy']
>>> a
[123, 'bletch', 'xyzzy', 1234]
>>> # Insert (a copy of) itself at the beginning
>>> a[:0] = a
>>> a
[123, 'bletch', 'xyzzy', 1234, 123, 'bletch', 'xyzzy', 1234]
>>> # Clear the list: replace all items with an empty list
>>> a[:] = []
>>> a
[]

使用函數 len() 可以知道串列元素個數 : 
>>> a = ['a', 'b', 'c', 'd']
>>> len(a)
4

串列可以巢狀操作 : 
>>> q = [2, 3]
>>> p = [1, q, 4]
>>> len(p)
3
>>> p[1]
[2, 3]
>>> p[1][0]
2

如果要加元素到串列, 可以使用函數 append() : 
>>> p[1].append('xtra')
>>> p
[1, [2, 3, 'xtra'], 4]
>>> q # 因為是 shallow copy, 所以原有串列的值也會改變
[2, 3, 'xtra']

3.2 First Steps Towards Programming 
底下我們透過前面介紹的內容, 簡單寫一個 費比係數 的產生函數 : 
 

天啊. 程式碼怎麼這麼短! 這是因為 Python 的某些特性讓我們少寫很多代碼, 首先是你可以使用所謂的 "multiple assignment" : 
如果是其他語言的話, 可能就需要兩行 "a=0" 與 "b=1". 另外便是 while loop 的程式碼區塊並不需要 "{}", 原因是 Python 使用縮排來區分程式碼區塊. 最後是在處理 費比數列 中當前數為前兩數相加, 其他語言可能會是如下撰寫 : 
  1. int t = b  
  2. b = a + b  
  3. a = t  
但這邊卻只需要 "a, b = b, a+b" ! 那也是 "multiple assignment" 好用的地方.

沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!