注意:以下基於Python3
基礎篇
一、資料型別
1.list中增加元素,追加元素到末尾:list.append(‘元素’)、插入到指定的位置:list.insert(‘索引號’,‘元素’);刪除末尾的元素:list.pop、刪除指定位置的元素:list.pop(‘索引號’)
2.input()返回的資料型別是str
3.迭代/迴圈:for x in ... 把每個元素代入變數x
,然後執行縮排塊的語句
4.dict中避免key不存在的錯誤2種方法,1、透過in
判斷key是否存在:'Jia' in dict 返回Ture或False 2、透過dict提供的get()方法:dict.get('Yannan');刪除元素:dict.pop(key)
5.set:和dict類似,也是一組key的集合,但不儲存value。由於key不能重複,所以,在set中,沒有重複的key。要建立一個set,需要提供一個list作為輸入集合:s = set([1,2,3]).
新增元素:s.add(key) 刪除元素:s.remove(key)。set可以看成數學意義上的無序和無重複元素的集合,因此,兩個set可以做數學意義上的交集、並集等操作:交集& 並集 |
6.列表倒序方法:list = [3,5,4] list.sort() >>[3,4,5]
7.字串的元素替代方法:s = 'abc' s.replace('a','A') >>'Abc' 謹記變數s仍是'abc' 原因是replace方法建立了一個新的字串'Abc'
二、函式
1.函式名其實就是指向一個函式物件的引用,完全可以把函式名賦給一個變數,相當於給這個函式起了一個“別名”:ads(-100) >>100 a = abs a(-67) >>67
2.空函式
1 def nop(): 2 pass
pass語句什麼都不做,那有什麼用?實際上pass
可以用來作為佔位符,比如現在還沒想好怎麼寫函式的程式碼,就可以先放一個pass
,讓程式碼能執行起來。
pass還可以用在其他語句裡,比如:
1 if age >=18: 2 pass
缺少了pass,程式碼執行就會有語法錯誤。
3.函式可以同時返回多個值,但其實就是一個tuple
4.函式執行完畢也沒有return語句時,自動return None
5.如果有必要,可以先對引數的資料型別做檢查
6.除了正常定義的必選引數外,還可以使用預設引數、可變引數、關鍵字引數和命名關鍵字引數,使得函式定義出來的介面,不但能處理複雜的引數,還可以簡化呼叫者的程式碼
7.計算x的n次方的方法,使用while迴圈
1 def power(x, n): 2 s = 1 3 while n > 0: 4 n = n - 1 5 s = s * x 6 return s
8.可變引數 計算a2 + b2 + c2 + ……
1 def calc(*numbers): 2 sum = 0 3 for n in numbers: 4 sum = sum + n * n 5 return sum
9.關鍵字引數
可變引數允許你傳入0個或任意個引數,這些可變引數在函式呼叫時自動組裝為一個tuple。而關鍵字引數允許你傳入0個或任意個含引數名的引數,這些關鍵字引數在函式內部自動組裝為一個dict
1 def person(name, age, **kw): 2 print('name:', name, 'age:', age, 'other:', kw)
關鍵字引數有什麼用?它可以擴充套件函式的功能。比如,在person
函式里,我們保證能接收到name
和age
這兩個引數,但是,如果呼叫者願意提供更多的引數,我們也能收到。試想你正在做一個使用者註冊的功能,除了使用者名稱和年齡是必填項外,其他都是可選項,利用關鍵字引數來定義這個函式就能滿足註冊的需求。
10.命名關鍵字引數 命名的關鍵字引數是為了限制呼叫者可以傳入的引數名,同時可以提供預設值。
1 def person(name, age, *, city, job): 2 print(name, age, city, job)
和關鍵字引數**kw
不同,命名關鍵字引數需要一個特殊分隔符*
,*
後面的引數被視為命名關鍵字引數
11.遞迴函式 計算階乘n!
1 def fact(n): 2 if n==1: 3 return 1 4 return n * fact(n - 1)
遞迴函式的優點是定義簡單,邏輯清晰。理論上,所有的遞迴函式都可以寫成迴圈的方式,但迴圈的邏輯不如遞迴清晰。缺點是過深的呼叫會導致棧溢位。
12.切片
L[0:3]
表示,從索引0
開始取,直到索引3
為止,但不包括索引3
。即索引0
,1
,2
,正好是3個元素。
L = list(range(10)) >>L[:9:2] >>[0, 2, 4, 6, 8] 第三個數字是步長
13.迭代
在Python中,迭代是透過for ... in
來完成的
迭代dict中的key、value、key和value:for key in dict、for value in d.values()、for k,v in d.items()
如何判斷一個物件是可迭代物件呢?方法是透過collections模組的Iterable型別判斷:
>>> from collections import Iterable >>> isinstance('abc', Iterable) # str 是否可迭代 True >>> isinstance([1,2,3], Iterable) # list 是否可迭代 True >>> isinstance(123, Iterable) # 整數 是否可迭代 False
14.列表生成式
>>> [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']
運用列表生成式,可以寫出非常簡潔的程式碼。例如,列出當前目錄下的所有檔案和目錄名,可以透過一行程式碼實現:
>>> import os # 匯入os模組 >>> [d for d in os.listdir('.')] # os.listdir可以列出檔案和目錄
列印dict中的 key=value,並輸出一個列表:
>>> d = {'x': 'A', 'y': 'B', 'z': 'C' } >>> [k + '=' + v for k, v in d.items()] ['y=B', 'x=A', 'z=C']
把一個list中所有的字串變成小寫:
>>> L = ['Hello', 'World', 'IBM', 'Apple'] >>> [s.lower() for s in L] ['hello', 'world', 'ibm', 'apple']
15.生成器
g = (x * x for x in range(10))
>>> next(g) 0 >>> next(g) 1
generator儲存的是演算法,每次呼叫next(g)
,就計算出g
的下一個元素的值,直到計算到最後一個元素,沒有更多的元素時,丟擲StopIteration
的錯誤。
當然,上面這種不斷呼叫next(g)
實在是太變態了,正確的方法是使用for
迴圈,因為generator也是可迭代物件:
>>> g = (x * x for x in range(10)) >>> for n in g: ... print(n)
所以,我們建立了一個generator後,基本上永遠不會呼叫next()
,而是透過for
迴圈來迭代它,並且不需要關心StopIteration
的錯誤。
斐波拉契數列(Fibonacci),除第一個和第二個數外,任意一個數都可由前兩個數相加得到:
1, 1, 2, 3, 5, 8, 13, 21, 34, ...
1 def fib(max): 2 n, a, b = 0, 0, 1 3 while n < max: 4 print(b) 5 a, b = b, a + b 6 n = n + 1 7 return 'done'
16.迭代器
生成器都是Iterator
物件,但list
、dict
、str
雖然是Iterable(可迭代物件)
,卻不是Iterator(迭代器)
。
把list
、dict
、str
等Iterable
變成Iterator
可以使用iter()
函式:
>>> isinstance(iter([]), Iterator) True >>> isinstance(iter('abc'), Iterator) True
凡是可作用於for
迴圈的物件都是Iterable
型別;
凡是可作用於next()
函式的物件都是Iterator
型別,它們表示一個惰性計算的序列;
集合資料型別如list
、dict
、str
等是Iterable
但不是Iterator
,不過可以透過iter()
函式獲得一個Iterator
物件。