調用解釋器時,腳本名和附加參數傳入一個名爲 sys.argv 的字符串列表。你可以獲取這個列表經過執行 import sys,列表的長度大於等於1;沒有給定腳本和參數時,它至少也有一個元素:sys.argv[0] 此時爲空字符串。腳本名指定爲 '-' (表示標準輸入)時, sys.argv[0] 被設定爲 '-',使用 -c 指令 時,sys.argv[0] 被設定爲 '-c'。使用 -m 模塊 參數時,sys.argv[0] 被設定爲指定模塊的全名。-c 指令 或者 -m 模塊 以後的參數不會被 Python 解釋器的選項處理機制所截獲,而是留在 sys.argv 中,供腳本命令操做。html
*test.py* import sys print(sys.argv) print(sys.argv[1] >>>python test.py -c -m ...['test.py','-c','-m'] ...-c
Python replace() 方法把字符串中的 old(舊字符串) 替換成 new(新字符串),若是指定第三個參數max,則替換不超過 max 次。python
str.replace(old, new[, max])函數
a = 'hello world' b = a.replace('world','python') print(b) ...hello python
enumerate() 函數用於將一個可遍歷的數據對象(如列表、元組或字符串)組合爲一個索引序列,同時列出數據和數據下標,通常用在 for 循環當中。工具
enumerate(sequence, [start=0])code
a = ['abc','def','ghi'] b = list(enumerate(a)) print(b) for i,j in enumerate(a): print(i,j) ...[(0, 'abc'), (1, 'def'), (2, 'ghi')] ...0 abc ...1 def ...2 ghi
實際上enumerate就是個可迭代對象,可用如下方法實現:htm
def enumerate(sequence, start=0): n = start for elem in sequence: yield n, elem n += 1
循環能夠有一個 else 子句;它在循環迭代完整個列表(對於 for )或執行條件爲 false (對於 while )時執行,但循環被 break 停止的狀況下不會執行。如下搜索素數的示例程序演示了這個子句:對象
for n in range(2, 10): for x in range(2, n): if n % x == 0: print(n, 'equals', x, '*', n//x) break else: print(n, 'is a prime number') ... 2 is a prime number 3 is a prime number 4 equals 2 * 2 5 is a prime number 6 equals 2 * 3 7 is a prime number 8 equals 2 * 4 9 equals 3 * 3
函數體的第一行語句能夠是可選的字符串文本,這個字符串是函數的文檔字符串,或者稱爲 docstring。(更多關於 docstrings 的信息請參考 文檔字符串) 有些工具經過 docstrings 自動生成在線的或可打印的文檔,或者讓用戶經過代碼交互瀏覽;在你的代碼中包含 docstrings 是一個好的實踐,讓它成爲習慣吧。索引
def test(): ''' doc test ''' print('test') print(test.__doc__) ... doc test
函數 調用 會爲函數局部變量生成一個新的符號表。確切的說,全部函數中的變量賦值都是將值存儲在局部符號表。變量引用首先在局部符號表中查找,而後是包含函數的局部符號表,而後是全局符號表,最後是內置名字表。所以,全局變量不能在函數中直接賦值(除非用 global 語句命名),儘管他們能夠被引用。文檔
函數引用的實際參數在函數調用時引入局部符號表,所以,實參老是 傳值調用 (這裏的 值 老是一個對象 引用 ,而不是該對象的值)。 一個函數被另外一個函數調用時,一個新的局部符號表在調用過程當中被建立。字符串
一個函數定義會在當前符號表內引入函數名。函數名指代的值(即函數體)有一個被 Python 解釋器認定爲 用戶自定義函數 的類型。 這個值能夠賦予其餘的名字(即變量名),而後它也能夠被當作函數使用。這能夠做爲通用的重命名機制:
def test(): print('test') >>>test ...<function test at 10042ed0> >>>f = test >>>f ...test ---------- a = 100 def test(n): a = 200 print('test%d%d'%(n,a)) test(3) print (a) ...test3200 ...100 ---------- a = 100 def test(n): global a a = 200 print('test%d%d'%(n,a)) test(3) print (a) ...test3200 ...200
def test(a,b=100,c='haha'): print(a,b,c) test(2)# positional argument ...2 100 haha
正確的調用 test(2,b=50) # 1 positional, 1 keyword test(a=5,c='hahaha')# 2 keyword arguments 錯誤的調用 test(b=50) test(c='hahha',5) test(5,a=10)
引入一個形如name 的參數時,它接收一個字典,該字典包含了全部未出如今形式參數列表中的關鍵字參數。這裏可能還會組合使用一個形如 name 的形式參數,它接收一個元組,包含了全部沒有出如今形式參數列表中的參數值( name 必須在 name 以前出現)。
def test(a,*b,**c): print(a) print(b) print(c) test('a','dsad','dasdad',k='weqeq',y='werrq') ...a ...('dsad', 'dasdad') ...{'k': 'weqeq', 'y': 'werrq'}
另有一種相反的狀況: 當你要傳遞的參數已是一個列表,但要調用的函數卻接受分開一個個的參數值。這時候你要把已有的列表拆開來。例如內建函數 range() 須要要獨立的 start,stop 參數。你能夠在調用函數時加一個 * 操做符來自動把參數列表拆開:
a = [1,10] b = range(*a) print(list(b)) ...[1, 2, 3, 4, 5, 6, 7, 8, 9]
以一樣的方式,可使用 ** 操做符分拆關鍵字參數爲字典:
tmp = {'a':10,'b':20} def test(a,b): print(a,b) test(**tmp) ...10 20
lambda表達式,一般是在須要一個函數,可是又不想費神去命名一個函數的場合下使用,也就是指匿名函數。
def get_y(a,b): return lambda x:ax+b y1 = get_y(1,1) >>>y1(1) ...2
getattr() 是 python 的內建函數,getattr(object,name) 就至關於object.name可是這裏 name 能夠爲變量
def test(a,b): ''' dsadad ''' print(a,b) def get(n): for i in dir(n): print(getattr(test,i)) get(test)
函數註解在定義函數的時候對參數和返回值添加註解
def test(a: int, b: "it's b", c: str = 5) -> tuple: return a, b, c print(test.__annotations__) ...{'a': int, 'b': "it's b", 'c': str, 'return': tuple}