Python3的一些常用語法和屬性
1、切片
平常我們要想取 list 或者 tuple 中指定索引范圍的元素,可能需要通過循環,比較麻煩。Python 中提供了切片(Slice)操作符,能大大簡化這種操作。
>>> L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack'] # 取前3個元素,用一行代碼就可以完成切片: >>> L[0:3] ['Michael', 'Sarah', 'Tracy'] # 也可以從索引1開始,取出2個元素出來: >>> L[1:3] ['Sarah', 'Tracy'] # 也支持倒數切片: >>> L[-2:] ['Bob', 'Jack'] >>> L[-2:-1] ['Bob']
L[0:3]表示,從索引0開始取,直到索引3為止,但不包括索引3。即索引0,1,2,正好是3個元素。
如果第一個索引是0,還可以省略:
>>> L[:3] ['Michael', 'Sarah', 'Tracy']
用法示例:
>>> L = list(range(100)) >>> L [0, 1, 2, 3, ..., 99] #前10個數: >>> L[:10] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] #后10個數: >>> L[-10:] [90, 91, 92, 93, 94, 95, 96, 97, 98, 99] #前10個數,每兩個取一個: >>> L[:10:2] [0, 2, 4, 6, 8] #所有數,每5個取一個: >>> L[::5] [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95] #甚至什么都不寫,只寫[:]就可以原樣復制一個list: >>> L[:] [0, 1, 2, 3, ..., 99]
tuple 也可以用切片操作,只是操作的結果仍是tuple。字符串'xxx'也可以看成是一種list,每個元素就是一個字符。因此,字符串也可以用切片操作,只是操作結果仍是字符串。
#tuple切片操作 >>> (0, 1, 2, 3, 4, 5)[:3] (0, 1, 2) #字符串切片操作 >>> 'ABCDEFG'[:3] 'ABC' >>> 'ABCDEFG'[::2] 'ACEG'
在很多編程語言中,針對字符串提供了很多各種截取函數(例如,substring),其實目的就是對字符串切片。Python沒有針對字符串的截取函數,只需要切片一個操作就可以完成,非常簡單。
2、迭代(for循環)
如果給定一個list或tuple,我們可以通過for循環來遍歷這個list或tuple,這種遍歷我們稱為迭代(Iteration)。Python的for循環不僅可以用在list或tuple上,還可以作用在其他可迭代對象上。只要是可迭代對象,都可以迭代。
默認情況下,dict迭代的是key。如果要迭代value,可以用for value in d.values(),如果要同時迭代key和value,可以用for k, v in d.items()。
>>> d = {'a': 1, 'b': 2, 'c': 3}
>>> for key in d:
... print(key)
...
a
c
b
字符串也是可迭代對象,因此,也可以作用于for循環:
>>> for ch in 'ABC':
... print(ch)
...
A
B
C
我們可以通過 Python 內置的enumerate函數將一個list變成索引-元素對,這樣就可以在for循環中同時迭代 list 的索引和元素本身:
>>> for i, value in enumerate(['A', 'B', 'C']):
... print(i, value)
...
0 A
1 B
2 C
2.1、如何判斷對象是否是可迭代對象
我們可以通過 collections 模塊的 Iterable 類型來判斷如何判斷一個對象是否是可迭代對象:
>>> from collections import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代
True
>>> isinstance([1,2,3], Iterable) # list是否可迭代
True
>>> isinstance(123, Iterable) # 整數是否可迭代
False
3、推導式語法(一行代碼創建list、set、dictionary)
列表生成式即List Comprehensions,是Python內置的非常簡單卻強大的可以用來創建list的生成式。
舉個例子,要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用list(range(1, 11)):
>>> list(range(1, 11))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
但如果要生成[1x1, 2x2, 3x3, ..., 10x10]可能我們就需要用到循環。
但是在 Python 中,用列表生成式則可以用一行語句代替循環生成所需的list。寫列表生成式時,for前面的是一個表達式,把要生成的元素的組成規則放到前面,后面跟for循環,就可以把list創建出來。
#用循環創建,略顯麻煩: >>> L = [] >>> for x in range(1, 11): ... L.append(x * x) ... >>> L [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] #用列表生成式一行代碼即可創建: >>> [x * x for x in range(1, 11)] [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] #for循環后面還可以加上if判斷,這樣就可以篩選出僅偶數的平方: >>> [x * x for x in range(1, 11) if x % 2 == 0] [4, 16, 36, 64, 100]
還可以使用兩層循環,可以生成全排列:
>>> [m + n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
集合和字典同時也支持這種語法:
#推導式生成集合 a = {x for x in 'abracd' if x not in 'abc'} #{'r', 'd'} #推導式生成字典 {x: x**2 for x in (2, 4, 6)} #{2: 4, 4: 16, 6: 36}
4、__name__屬性(注意是雙下劃線)
一個模塊被另一個程序第一次引入時,其主程序將運行。如果我們想在模塊被引入時,模塊中的某一程序塊不執行,而僅在該模塊自身運行時才執行,此時我們可以用__name__屬性來進行控制:
#!/usr/bin/python3 # Filename: using_name.py if __name__ == '__main__': print('程序自身在運行') else: print('我來自另一模塊')
運行如下:
#執行腳本本身 $ python using_name.py 程序自身在運行 #在其他模塊引入該模塊 $ python >>> import using_name 我來自另一模塊
每個模塊都有一個__name__屬性,當其值是'__main__'時,表明該模塊自身在運行,否則是被引入。
5、異常的捕獲和拋出(try...except、raise)
5.1、try...except
python 中捕獲用 try... except 語法:
import sys try: f = open('myfile.txt') s = f.readline() i = int(s.strip()) except OSError as err: print("OS error: {0}".format(err)) except ValueError: print("Could not convert data to an integer.") except: print("Unexpected error:", sys.exc_info()[0]) raise
5.2、try...except...else
try/except 語句還有一個可選的 else 子句,如果使用這個子句,那么必須放在所有的 except 子句之后。else 子句將在 try 子句沒有發生任何異常的時候執行。

for arg in sys.argv[1:]: try: f = open(arg, 'r') except IOError: print('cannot open', arg) else: print(arg, 'has', len(f.readlines()), 'lines') f.close()
使用 else 子句比把所有的語句都放在 try 子句里面要好,這樣可以避免一些意想不到,而 except 又無法捕獲的異常。
5.3、try...except..finally
try-finally 語句無論是否發生異常都將執行最后的代碼。

以下實例中 finally 語句無論異常是否發生都會執行:
try: runoob() except AssertionError as error: print(error) else: try: with open('file.log') as file: read_data = file.read() except FileNotFoundError as fnf_error: print(fnf_error) finally: print('這句話,無論異常是否發生都會執行。')
5.4、拋出異常
Python 使用 raise 語句拋出一個指定的異常,raise 唯一的一個參數指定了要被拋出的異常。它必須是一個異常的實例或者是異常的類(也就是 Exception 的子類)。
raise [Exception [, args [, traceback]]]
實例:
x = 10 if x > 5: raise Exception('x 不能大于 5。x 的值為: {}'.format(x))
如果你捕獲了一個異常,但并不想去處理它,那么一個簡單的 raise 語句就可以再次把它拋出:
try: raise NameError('HiThere') except NameError: print('An exception flew by!') raise #異常被拋出 An exception flew by! Traceback (most recent call last): File "<stdin>", line 2, in ? NameError: HiThere
6、global 和 nonlocal關鍵字
當函數的內部作用域想修改外部作用域的變量時,就要用到global和nonlocal關鍵字。
以下實例修改全局變量 num:
#!/usr/bin/python3 num = 1 def fun1(): global num # 需要使用 global 關鍵字聲明 print(num) num = 123 print(num) fun1() print(num)
上面代碼將依次輸出:1 123 123
如果要修改嵌套作用域(非全局作用域)中的變量則需要 nonlocal 關鍵字了,如下實例:
#!/usr/bin/python3 #下面將依次輸出 100 100 def outer(): num = 10 def inner(): nonlocal num # nonlocal關鍵字聲明 num = 100 print(num) inner() print(num) outer()

浙公網安備 33010602011771號