简明python教程 --C++程序员的视角(一):数值类型、字符串、运算符和控制流
最初的步驟
- Python是大小寫敏感的
- 任何在#符號右面的內容都是注釋
- >>> help('print')
在“print”上使用引號,那樣Python就可以理解我是希望獲取關于“print”的幫助而不是想要打印東西。
?
數據類型
在Python中有4種類型的數——整數、長整數、浮點數和復數(Python 有五個內置的簡單類型:bool、int、long、float?和?complex)。
- 2、0177,0x7F是整數的例子。Python 在這一點上更像 C,因為它的類型范圍是依賴于平臺的。int 是一種 32 位的整數值。因而,它被限制為只能保存從 -232?到 232?- 1 之間的值(在多數平臺上)
- 長整數類型的精度不受限,僅計算機內存對它有影響,如?100L。當需要額外的精度時,Python自動將整型變換升級為長整型,而不用擔心溢出。
>>> 2 ** 10 1024 >>> 2 ** 50 1125899906842624L - 3.23和52.3E-4是浮點數的例子。E標記表示10的冪。在這里,52.3E-4表示52.3 * 10-4。浮點值始終是按雙精度處理的。
- (-5+4j)和(2.3-4.6j)是復數的例子。在 Python 中,復數的虛部被表示為?j。通過使用?real?和imag?屬性,即可訪問復數的不同部分。
在Python中一切皆是對象,如果您不怕麻煩,還可以直接使用它們的構造函數。
>>> b = bool(True) >>> i = int(100) >>> l = long(100) >>> f = float(100.1) >>> c = complex(3.0, 1.2) >>> print b, i, l, f, c True 100 100 100.1 (3+1.2j) >>> print c.real, c.imag 3.0 1.2?
字符串
在雙引號中的字符串與單引號中的字符串的使用完全相同。
使用 'What\'s your name?',或者"What's your name?"
利用三引號,你可以指示一個多行的字符串。你可以在三引號中自由的使用單引號和雙引號。
在一個字符串中,行末的單獨一個反斜杠表示字符串在下一行繼續,而不是開始一個新的行。
"This is the first sentence. This is the second sentence."
等價于:
自然(原始 raw)字符串:指示某些不需要如轉義符那樣的特別處理的字符串,自然字符串通過給字符串加上前綴r或R來指定。
r"Newlines are indicated by \n"
一定要用自然字符串處理正則表達式。否則會需要使用很多的反斜杠。例如,后向引用符可以寫成'\\1'或r'\1'。
Unicode字符串:Python允許你處理Unicode文本——你只需要在字符串前加上前綴u或U。
u"This is a Unicode string."
記住,在你處理文本文件的時候使用Unicode字符串,特別是當你知道這個文件含有用非英語的語言寫的文本。
字符串是不可變的:這意味著一旦你創造了一個字符串,你就不能再改變它了。
按字面意義級連字符串:如果你把兩個字符串按字面意義相鄰放著,他們會被Python自動級連。例如,'What\'s' 'your name?'會被自動轉為"What's your name?"
?
字符串方法:字符串是str類型的對象,這些對象方法可以完成包括檢驗一部分字符串和去除空格在內的各種工作。如果要了解這些方法的完整列表,請參見help(str)。
- startswith方法是用來測試字符串是否以給定字符串開始。
- in操作符用來檢驗一個給定字符串是否為另一個字符串的一部分。
- find方法用來找出給定字符串在另一個字符串中的位置,或者返回-1以表示找不到子字符串。
- str類也有以一個作為分隔符的字符串的join序列的項目的整潔的方法,它返回一個生成的大字符串。
基本概念
?
在 Python 中,不需要使用特殊字符(或符號)來指示語句的結束。這與有些語言不同。例如,基于 C 的語言使用分號(;)來指示代碼行的結束。Python假定每個物理行對應一個邏輯行。默認地,Python希望每行都只使用一個語句,這樣使得代碼更加易讀。
一個物理行中使用多于一個邏輯行,那么你需要使用分號(;)來特別地標明這種用法。
如果某個程序行太長,可以在文件中的下一物理行繼續這一行。沒有硬性規定一個代碼行應該多長。但是一般限制為 80 個字符,這容易適合大多數顯示器的一個打印頁面。有幾種方式來擴展超過一行的代碼語句:
- 三引號字符串可以擴展到多個行。
- 括號中的表達式可以擴展到多個行。邏輯行中使用了圓括號、方括號或波形括號的時候,不需要使用反斜杠。這被稱為暗示的行連接。
- 可以使用繼續字符(\)來在多行分割語句。它被稱為明確的行連接。
?
在邏輯行首的空白(空格和制表符)用來決定邏輯行的縮進層次,從而用來決定語句的分組,這意味著同一層次的語句必須有相同的縮進。(可以在編輯器中設定用4個空格替換Tab)
與其他編程語言使用特殊的字符來區分代碼塊(比如基于 C 的語言中的花括號{?和?})不同,在python的流控制語句中,流控制指令后跟一個冒號(:),然后再是一個程序語句塊,Python 需要縮進以指示代碼塊。
?
【注釋】
1 無論是行注釋還是段注釋,均以#加一個空格來注釋。
2 如果需要在代碼中使用中文注釋,必須在python文件的最前面加上如下注釋說明:
# -* - coding: UTF-8 -* -3 如下注釋(#!)用于(Unix可執行腳本)指定解釋器
#! /usr/bin/env pythonUnix可執行腳本:
- 第一行是特定的:特殊形式的注釋,它被稱作組織行 ——源文件的頭兩個字符是#!,后面跟著一個程序。這行告訴你的Linux/Unix系統當你執行你的程序的時候,它應該運行哪個解釋器。
- 往往擁有可執行權限:在Unix系統上使用chmod +x myfile這條shell命令賦予這個文件(文件可以沒有.py后綴)執行的權限,你就能夠在操作系統的shell中敲入> myfile運行它,就好像這是個二進制文件一樣。
- 如果在shell中敲入> python myfile來運行程序,是不需要#!特殊注釋的。
建議使用這種形式——#!/usr/bin/env python,而不是——#!/usr/bin/python,讓env程序自動搜索PATH環境變量中羅列的所有目錄,可以避免硬編碼Python解釋器的路徑。
運算符和表達式
| + | 加 | 兩個對象相加 | 3 + 5得到8。'a' + 'b'得到'ab'。 'a'+6是錯誤的。 python不支持自增運算符和自減運算符。例如i++/i--是錯誤的,但i+=1是可以的 |
| - | 減 | 得到負數或是一個數減去另一個數 | -5.2得到一個負數。50 - 24得到26。 |
| * | 乘 | 兩個數相乘或是返回一個被重復若干次的字符串 | 2 * 3得到6。'la' * 3得到'lalala'。 |
| ** | 冪 | 返回x的y次冪 | 3 ** 4得到81(即3 * 3 * 3 * 3) |
| / | 除 | x除以y | 1/2在python2.5之前會等于0.5,在python2.5之后會等于0(整數的除法得到整數結果)。4.0/3或4/3.0得到1.3333333333333333 |
| // | 取整除 | 返回商的整數部分 | 4 // 3.0得到1.0 |
| % | 取模 | 返回除法的余數 | 8%3得到2。-25.5%2.25得到1.5 |
| << | 左移 | 把一個數的比特向左移一定數目(每個數在內存中都表示為比特或二進制數字,即0和1) | 2 << 2得到8。——2按比特表示為10 |
| >> | 右移 | 把一個數的比特向右移一定數目 | 11 >> 1得到5。——11按比特表示為1011,向右移動1比特后得到101,即十進制的5。 |
| & | 按位與 | 數的按位與 | 5 & 3得到1。 |
| | | 按位或 | 數的按位或 | 5 | 3得到7。 |
| ^ | 按位異或 | 數的按位異或 | 5 ^ 3得到6 |
| ~ | 按位翻轉 | x的按位翻轉是-(x+1) | ~5得到6。 |
| < | 小于 | 返回x是否小于y。所有比較運算符返回1表示真,返回0表示假。這分別與特殊的變量True和False等價。注意,這些變量名的大寫。 | 5 < 3返回0(即False)而3 < 5返回1(即True)。比較可以被任意連接:3 < 5 < 7返回True。 |
| > | 大于 | 返回x是否大于y | 5 > 3返回True。如果兩個操作數都是數字,它們首先被轉換為一個共同的類型。否則,它總是返回False。 |
| <= | 小于等于 | 返回x是否小于等于y | x = 3; y = 6; x <= y返回True。 |
| >= | 大于等于 | 返回x是否大于等于y | x = 4; y = 3; x >= y返回True。 |
| == | 等于 | 比較對象是否相等 | x = 2; y = 2; x == y返回True。x = 'str'; y = 'stR'; x == y返回False。x = 'str'; y = 'str'; x == y返回True。 |
| != | 不等于 | 比較兩個對象是否不相等 | x = 2; y = 3; x != y返回True。 |
| not | 布爾“非” | 如果x為True,返回False。如果x為False,它返回True。 | x = True;?not x返回False。(相當于C++里的!) |
| and | 布爾“與” | 如果x為False,x and y返回False,否則它返回y的計算值。 | x = False; y = True;?x and y,由于x是False,返回False。在這里,Python不會計算y,因為它知道這個表達式的值肯定是False(因為x是False)。這個現象稱為短路計算。(相當于C++里的&&) |
| or | 布爾“或” | 如果x是True,它返回True,否則它返回y的計算值。 | x = True; y = False;?x or y返回True。短路計算在這里也適用。(相當于C++里的||) |
?
運算符優先級
| lambda | Lambda表達式 |
| or | 布爾“或” |
| and | 布爾“與” |
| not x | 布爾“非” |
| in,not in | 成員測試 |
| is,is not | 同一性測試 |
| <,<=,>,>=,!=,== | 比較 |
| | | 按位或 |
| ^ | 按位異或 |
| & | 按位與 |
| <<,>> | 移位 |
| +,- | 加法與減法 |
| *,/,% | 乘法、除法與取余 |
| +x,-x | 正負號 |
| ~x | 按位翻轉 |
| ** | 指數 |
| x.attribute | 屬性參考 |
| x[index] | 下標 |
| x[index:index] | 尋址段 |
| f(arguments...) | 函數調用 |
| (expression,...) | 綁定或元組顯示 |
| [expression,...] | 列表顯示 |
| {key:datum,...} | 字典顯示 |
| 'expression,...' | 字符串轉換 |
結合規律
- 運算符通常由左向右結合,即具有相同優先級的運算符按照從左向右的順序計算。例如,2 + 3 + 4被計算成(2 + 3) + 4。
- 一些如賦值運算符那樣的運算符是由右向左結合的,即a = b = c被處理為a = (b = c)。
表達式
注意Python如何打印“漂亮的”輸出。盡管我們沒有在'Area is'和變量area之間指定空格,Python自動在那里放了一個空格,這樣我們就可以得到一個清晰漂亮的輸出,而程序也變得更加易讀(因為我們不需要擔心輸出之間的空格問題)。這是Python如何使程序員的生活變得更加輕松的一個例子。
?
控制流
在Python中有三種控制流語句——if、for和while。還有相關的break和continue語句。
if-elif-else語句
我們為內建的raw_input函數提供一個字符串,這個字符串被打印在屏幕上,然后等待用戶的輸入。一旦我們輸入一些東西,然后按回車鍵之后,函數返回輸入。
對于raw_input函數來說是一個字符串。我們通過int把這個字符串轉換為整數,并把它存儲在變量guess中。事實上,int是一個類,不過你想在對它所需了解的只是它把一個字符串轉換為一個整數(假設這個字符串含有一個有效的整數文本信息)。
注意我們使用了縮進層次來告訴Python每個語句分別屬于哪一個塊,if語句在結尾處包含一個冒號——我們通過它告訴Python下面跟著一個語句塊。
帶有冒號字符的?if?和?else?語句的終止,以及?if?和?else?塊中語句的縮進。正如所提到的,這兩個特征是 Python 中流控制語句所必需的。
while-else語句
True和False被稱為布爾類型。在檢驗重要條件的時候,布爾類型十分重要,它們并不是真實的值1。
在這里else塊事實上是多余的,因為你可以把其中的語句放在同一塊(與while相同)中,跟在while語句之后,這樣可以取得相同的效果。如果你從for或while循環中break,任何對應的循環else塊將不執行。
?
for..in循環
循環語句:
for 變量 in 集合 : … else : …python不支持類似c的for(i=0;i<5;i++)這樣的循環語句,但可以借助range模擬:
for x in range(0,5,2): print xrange返回一個序列的數,這個序列從第一個數開始到第二個數為止。例如,range(1,5)給出序列[1, 2, 3, 4]。默認地,range的步長為1。如果我們為range提供第三個數,那么它將成為步長。例如,range(1,5,2)給出[1,3]。記住,range?向上?延伸到第二個數,即它不包含第二個數。
else部分是可選的。如果包含else,它總是在for循環結束后執行一次,除非遇到break語句。
記住,for..in循環對于任何序列都適用。這里我們使用的是一個由內建range函數生成的數的列表,但是廣義說來我們可以使用任何種類的由任何對象組成的序列!
?
Python 中的?for?循環很特殊,與 Python 編程語言中內置的容器數據類型緊密相關。由于 Python 容器類型的豐富特性,for?循環非常強大。本質上,for?循環涉及到一個迭代器(iterator),用于在集合中逐項移動。
下面部分涉及到容器類型?。
for?循環有一個簡單的語法,使您可以從容器對象中提取單個項目并對其進行某些操作。簡單地說,使用?for循環,可以迭代中對象集合的項目。對象集合可以是任何 Python 容器類型,包括tuple、string?和?list類型。
但是容器 metaphor 的功能比這三種類型更強大。metaphor 包括其他序列類型,如?dictionary?和?set,將來的文章中將對它們進行討論。但是請稍等!還有更多信息:for?循環可以用于迭代支持迭代 metaphor 的任何對象,這使?for?循環非常有用。
tuple?類型是不可變的異構容器。這主要是說?tuple?可以存放不同類型的對象,但是它一旦創建,就無法更改。下面用for?循環迭代tuple?的元素。
>>> t = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) >>> count = 0 >>> for num in t: ... count += num ... else: ... print count ... 45>>> count = 0 >>> for num in t: ... if num % 2: ... continue ... count += num ... else: ... print count ... 20?
?string?是不可變的同構容器,這意味著它僅能存放字符且一旦建立將無法修改。下面演示如何使用 Pythonstring?作為?for?循環的容器。
?
>>> st = "Python Is A Great Programming Language!"# 一次打印 string 中的一個字符 # 逗號使 print 語句打印字符值時后面跟著空格字符,而不是換行字符。如果沒有后面的逗號,字符將全部打印在單獨的行中,會很難讀。 >>> for c in st: ... print c, ... P y t h o n I s A G r e a t P r o g r a m m i n g L a n g u a g e ! # 調用 string 對象的 lower 方法返回的臨時 string,lower 方法將 string 中的所有字符轉換為小寫 >>> count = 0 >>> for c in st.lower(): ... if c in "aeiou": ... count += 1 ... else: ... print count ... 12?
list?是異構可變容器,這意味著它可以存放不同類型的對象且創建后可以修改。使用?for?循環使處理容器中的每個項目非常簡單,甚至處理包含各種不同對象的?list?也是如此。下面演示如何使用?list?和?for?循環。
>>> mylist = [1, 1.0, 1.0j, '1', (1,), [1]] >>> for item in mylist: ... print item, "\t", type(item)) ... 1 <type 'int'> 1.0 <type 'float'> 1j <type 'complex'> 1 <type 'str'> (1,) <type 'tuple'> [1] <type 'list'>?
for?循環主體可以修改其正在迭代的?list。正如您可能認為的,這樣并不好,如果進行此操作,Python 解釋器將無法很好地工作。?
>>> mylist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> for item in mylist: ... if item % 2: ... mylist.insert(0, 100) ... ^CTraceback (most recent call last): File "<stdin>", line 3, in ? KeyboardInterrupt >>> print mylist [100, ...., 100, 100, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # Many lines deleted for clarity>>> mylist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> for item in mylist[:]: # 使用切片運算符創建原始 list 的副本,for 循環將迭代該副本,而對原始list 進行修改 ... if item % 2: ... mylist.insert(0, 100) ... >>> print mylist [100, 100, 100, 100, 100, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]?
本例中的第一個?for?循環只要在原始?list?中發現奇數,它就在?list?的開始插入數值 100。當然,這是一種演示此問題的不同尋常的方式,但卻非常好。一旦在三個點的 Python 提示后按 Enter 鍵,Python 解釋器就處于無限循環的混亂中。要停止這種混亂,必須通過按 Ctrl-C(其在 Python 輸出中顯示為?^C)來中斷進程,然后會出現?KeyboardInterrupt?異常。如果打印出修改的?list,將看到mylist?現在包含大量的值為 100 的元素(新元素的準確數量取決于您中斷循環的速度)。
本例中的第二個?for?循環演示了如何避免此問題。使用切片運算符創建原始?list?的副本。現在?for?循環將迭代該副本,而對原始list?進行修改。最終的結果是修改后的原始?list,它現在以五個值為 100 的新元素開始。
Python?for?循環更像?foreach?循環。基于 C 的編程語言具有?for?循環,但它的設計目的是對一系列操作執行特定次數。Python?for?循環可以通過使用內置的?range?和?xrange?方法來模擬該行為。
>>> r = range(10) >>> print r [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> type(r) <type 'list'>>>> xr = xrange(10) >>> print xr xrange(10) >>> type(xr) <type 'xrange'>?
本例首先演示了?range?方法,它創建一個包含一系列整數的新?list。調用?range?方法的一般形式是提供單個值,用作整數?list?的上限。零為起始值。因此,調用?range(10)?將創建包含整數 0 至 9(包含 9)的list。
range?方法接受起始索引以及步長。所以,調用range(11,20)?將創建從 11 至 19(包含 19)的整數list,而調用?range(12, 89, 2)?將創建從 12 至 88 的偶數?list。
由于?xrange?方法也創建整數?list(其使用相同參數),所以它與?range?方法非常相似。但是,xrange?方法僅在需要時才在?list?中創建整數。嘗試打印出新創建的?xrange?時除了?xrange?的名稱,不會顯示任何數據。當需要迭代大量整數時,xrange?方法更適用,因為它不會創建極大的?list,那樣會消耗大量計算機內存。
下面演示了如何在?for?循環內使用?range?方法來創建整數 1 至 10(包含 10)的乘法表。
>>> for row in range(1, 11): ... for col in range(1, 11): ... print "%3d " % (row * col), ... print ... 1 2 3 4 5 6 7 8 9 102 4 6 8 10 12 14 16 18 203 6 9 12 15 18 21 24 27 304 8 12 16 20 24 28 32 36 405 10 15 20 25 30 35 40 45 506 12 18 24 30 36 42 48 54 607 14 21 28 35 42 49 56 63 708 16 24 32 40 48 56 64 72 809 18 27 36 45 54 63 72 81 9010 20 30 40 50 60 70 80 90 100本例使用兩個?for?循環,外面的?for?循環關注乘法表中的每一行,嵌套的?for?循環關注每行內的列。每個循環都迭代包含整數 1 至 10(包含 10)的?list。
最里面的?print?語句使用了一個名為?字符串格式化?的新概念來創建格式設置精美的表。字符串格式化是一種非常有用的技術,用于以格式設置精美的布局創建由不同數據類型組成的?string。現在詳細信息并不重要,將來的文章中將講述這些內容(了解 C 編程語言的?printf?方法的任何人都會很熟悉這些內容)。在本例中,字符串格式化指定將從整數創建新?string?且需要保留三個字符來存放該整數(如果該整數小于三個字符,將在左邊用空格填補,從而使數據排列整齊)。
第二個?print?語句用于打印新行,從而使乘法表中的下一行被打印在新的行中。
range?方法還可用于迭代容器,通過使用適當的索引訪問序列中的每一項。要進行此操作,需要包含容器的允許范圍索引值的整數list,這可以通過使用?range?方法和?len?方法來輕松實現。
>>> st = "Python Is A Great Programming Language!">>> for index in range(len(st)): ... print st[index], ... P y t h o n I s A G r e a t P r o g r a m m i n g L a n g u a g e ! >>> for item in st.split(' '): ... print item, len(item) ... Python 6 Is 2 A 1 Great 5 Programming 11 Language! 9?
第一個?for循環使用?len?方法作為?range?方法的參數,創建可用于單獨訪問?string?中每個字符的整數list。
第二個?for循環還顯示了如何將?string?分割為子字符串的?list(使用空格字符來指示子字符串的邊界)。for?循環迭代子字符串?list,打印每個子字符串及其長度。
??
break語句
break語句是用來終止while或for循環語句的,即哪怕循環條件沒有稱為False或序列還沒有被完全遞歸,也停止執行循環語句。一個重要的注釋是,如果你從for或while循環中?終止?,任何對應的循環else塊將不執行。
輸入字符串的長度通過內建的len函數取得。
?
continue語句
continue語句被用來告訴Python跳過當前while或for循環塊中的剩余語句,然后?繼續?進行下一輪循環。
?
from:?http://www.cnblogs.com/wei-li/archive/2012/03/24/2415408.html總結
以上是生活随笔為你收集整理的简明python教程 --C++程序员的视角(一):数值类型、字符串、运算符和控制流的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hadoop中shuffle阶段流程分析
- 下一篇: 简明python教程 --C++程序员的