Python語法速查,這些都會嗎?
Python 是一門獨特的語言,快速瀏覽一下他的要點:
1)、面向?qū)ο螅好恳粋€變量都是一個類,有其自己的屬性(attribute)與方法(method)。
2)、語法塊:用縮進(四個空格)而不是分號、花括號等符號來標記。因此,行首的空格不能隨意書寫。
3)、注釋:行內(nèi)用“#”號,行間注釋寫在兩組連續(xù)三單引號之間:’’’
4)、續(xù)行:行尾輸入一個反斜杠加一個空格(’\ ‘),再換行。如果行尾語法明顯未完成(比如以逗號結(jié)尾),可以直接續(xù)行。
5)、打印與輸入: 函數(shù) print() 與 input(),注意 print() 的 sep 與 end 參數(shù)。
6)、變量:無需指定變量類型,也不需要提前聲明變量。
刪除變量:del()
復(fù)制變量:直接將變量a賦值給b,有時僅僅復(fù)制了一個“引用”。此后 b 與 a 的改動仍會互相影響。必要時使用 a is b 來判斷是否同址。
7)、模塊:通過 import pandas 的方式加載模塊(或者 import pandas as pd),并用形如
pandas.DataFrame(或 pd.DataFrame)的方式調(diào)用模塊內(nèi)的方法。也可以使用 from pandas import
DataFrame 的方式,這樣在下文可以直接使用 DataFrame 作為調(diào)用名。
8)、幫助:配合使用 dir() 與 help() 命令;其中前者是輸出變量所有的成員。以及查閱 官網(wǎng)頁面。
變量復(fù)制的一個例子。
a = [1, 2] b = a print(id(a) - id(b)) # 地址差為 0,表示實質(zhì)是同址的 0
b.append(3) print(a) # 只改動了 b,但 a 也跟著變動了 [1, 2, 3] a is b True
使用切片來重新分配空間:
a is a[:] False
數(shù)據(jù)結(jié)構(gòu)
Python 原生的數(shù)據(jù)結(jié)構(gòu)包括:
數(shù)字(num)
細分為整數(shù)(int)與浮點數(shù)(float)兩種。
- 四則運算:+, -, *, / ,乘方: **
- 整除: 5 // 2 = 2,取余:5 % 2 = 1
- 自運算: a += 1 (四則與乘方均可類似自運算)
以及一些細節(jié):
- 運算兩數(shù)中只要有一個浮點數(shù),結(jié)果就是浮點數(shù);
- 整數(shù)相除,即使能除盡,結(jié)果也是浮點數(shù);
- Python 內(nèi)部的機制解決了整數(shù)溢出的問題,不用擔心。
布爾(bool)與邏輯
首字母大寫 True / False.
- 邏輯運算符:與 A and B,或 A or B,非 not A
- 邏輯關(guān)系符:等于 ==, 不等于 !=. 其他不贅述。
- 幾種邏輯判斷例子:
變量 x | x = [] | x = 0 | x = 2 |
---|---|---|---|
bool(x) | False | False | True |
if x: … | False | False | True |
if x is None: … | False | False | False |
序列(sequence)
序列主要包括字符串(str)、列表(list)與元祖(tuple)三類。
- 序列索引規(guī)則:
- 索引從0開始,到 N-1 結(jié)束。
- 切片:切片的索引是左閉右開的。
- seq[0:2](從 0 到 1)
- seq[2:](從 2 到尾)
- seq[:3] (從頭到 2)
- seq[:](全部)
- seq[:10:2](從頭到9,每兩個取一個)
- seq[::2](全部,每兩個取一個)
- 索引允許負數(shù):seq(-1) 與 seq(N - 1) 等同,seq(-3:-1)與 seq(N-3:N-1) 等同。
- 序列通用函數(shù):
- len():返回序列長度。
- +/* :加號用于連接兩個序列,乘號重復(fù)排列若干次再連接。
- seq1 in seq2:如果 seq1 這個片段可以在 seq2 中被找到,返回 True.
- index:在 seq1 in seq2 為 True 時使用,seq2.index(seq1) 表示 seq1 首次出現(xiàn)于 seq2 中的位置。
- max()/min():返回序列中的最值。如果不是數(shù)字,則按 ASCII 碼順序返回。
- cmp(seq1, seq2):比較大小。結(jié)果為負,則表示 seq1 較小。
字符串(str)
寫于一對雙引號或單引號內(nèi)。用 str() 可以強制轉(zhuǎn)換為字符串。
- 轉(zhuǎn)義:反斜杠。如果強制不解釋字符串,在左引號前加字母 r 即可:
r"c:\new"
. - 分割與連接:
**.split()
與**.join()
.
s = " I love Python" # 首位是空格 lst = s.split(' ') lst1 = '-'.join(lst) print(lst, '\n', lst1) ['', 'I', 'love', 'Python'] -I-love-Python
- 緊切:
strip()
去掉字符串首尾兩端的空格。方法lstrip()/rstrip()
則只切除首端/尾端的空格。
s.strip() 'I love Python'
- 大小寫轉(zhuǎn)換:如下幾個方法:
- 首字母大寫:s.title()
- 全大寫:s.upper()
- 全小寫:s.lower()
- 句首大寫:s.capitalize()
- 格式化:字符串格式化是一種實用功能。通過 .format() 成員函數(shù)完成。
'I like {} and {}'.format('Python', 'you') 'I like Python and you' '{0} + {2} = {1}'.format (10, 20, 'Python ') # 按順序引用 '10 + Python = 20' '{0} * {1} = {0}'.format (10, 'Python ') # 編號反復(fù)引用 '10 * Python = 10'
格式化控制碼:
控制碼 | 含義 | 控制碼 | 含義 |
---|---|---|---|
:s | 字符串 | :c | 單個字符 |
:b/o/x/d | 二、八、十六、十進制數(shù) | :e/f | 科學計數(shù)法/浮點數(shù) |
一些復(fù)雜控制的例子:
例子 | 含義 | 例子 | 含義 |
---|---|---|---|
:.2f/:+.2f | 兩位小數(shù)/帶符號兩位小數(shù) | : .2f | 正數(shù)前補空格的兩位小數(shù) |
:, | 逗號分隔符 | :.2% | 百分比兩位小數(shù) |
:.2e | 科學計數(shù)法兩位小數(shù) | :^4d | 總寬四位居中對齊 |
:>4d/<4d | 總寬四位左/右對齊 | :0>4d | 總寬四位左側(cè)補零 |
舉例:
"{:0>7.2f} is an odd number".format(123.4) # 總寬 7 位小數(shù)點后 2 位,左側(cè)補零 '0123.40 is an odd number'
其他實用的字符串函數(shù):
- str.replace(old, new[, times]):將字符串中前 times 個 old 子串替換為 new。Times 不指定時默認替換全部。
- str.isdigit():判斷字符串是否每一位都是數(shù)字,返回 True 或者 False。
字符串中正則表達式的內(nèi)容參見本文附錄。
列表(list)
中括號式的結(jié)構(gòu)。list()
用于強制轉(zhuǎn)換類型。
lst = [1, 2, 3] print(lst) [1, 2, 3] # 【反轉(zhuǎn)】:其中第二種方式會更改現(xiàn)有的列表 lst1 = list(reversed(lst)) lst.reverse() print(lst1, lst) [3, 2, 1] [3, 2, 1] # 【追加】:元素 append(),另一個列表:extend() lst.append(4) print(lst) [3, 2, 1, 4] lst.extend(lst1) print(lst) [3, 2, 1, 4, 3, 2, 1] # 【插入】:lst.insert(idx, obj) 會在 lst[idx] 處插入 obj,然后依次后移原有項 lst.insert(1, 100) print(lst) [3, 100, 2, 1, 4, 3, 2, 1] # 【刪除】:lst.remove(obj) 會刪除首個匹配值,若無匹配會報錯; # lst.pop(idx) 會返回 lst[idx],并將其刪除。如果不指定 idx,默認為列表尾 lst.remove(2) print(lst) [3, 100, 1, 4, 3, 2, 1] tmp = lst.pop() print(lst, "\n", tmp) [3, 100, 1, 4, 3, 2] 1 # 【搜索】:使用序列通用函數(shù)即可。用 count(obj) 可以計算頻數(shù)。 # 【排序】:sort() 方法。如果指定 reverse 參數(shù),可降序排序。 lst.sort(reverse=True) print(lst) [100, 4, 3, 3, 2, 1] # 【清空】:clear() lst.clear() print(lst) []
元組(tuple)
圓括號式的結(jié)構(gòu),是一種不可變序列。
a = (1, 'string ', [1 ,2]) print(a) (1, 'string ', [1, 2])
Note: 定義一個空的元組用()
,定義只有一個元組的元組,需要加,
,否則就不是元組了,如下:
>>> tuple1 = () >>> type(tuple1) <type 'tuple'> >>> tuple2 = (1) >>> type(tuple2) <type 'int'> >>> tuple3 = (1,) >>> type(tuple3) <type 'tuple'>
字典(dict)
字典是一種類哈希表的數(shù)據(jù)結(jié)構(gòu),內(nèi)部無序,通過鍵值對(key: value)的形式存儲數(shù)據(jù)。幾種字典初始化的方式:
# 小字典直接賦值 d1 = {"name": "wklchris", "gender": "male"} # 利用字典增加鍵值對的方法 d2 = {} d2['name'] = 'wklchris' # 一個值賦給多個鍵 d3 = {}.fromkeys(("name", "gender"), "NA") # 強制格式轉(zhuǎn)換 d4 = dict(name="wklchris", gender="male") print(d1, d2, d3, d4, sep="\n") {'name': 'wklchris', 'gender': 'male'} {'name': 'wklchris'} {'name': 'NA', 'gender': 'NA'} {'name': 'wklchris', 'gender': 'male'}
字典的操作方法:
len(d1) 2 # 【復(fù)制】: dd = d1.copy() dd is d1 False # 【查找鍵名稱】: "name" in dd True # 【刪除鍵值對】 del(dd["name"]) # 【get】 dd.get("name", "Nothing") # 如果鍵不存在,返回“Nothing” 'Nothing' # 【setdefault】 dd.setdefault("name", "wklchris") # 如果鍵不存在,就新建該鍵,并賦值 'wklchris' print(dd) {'name': 'wklchris', 'gender': 'male'} # 【輸出鍵值】: list(dd.items()) [('name', 'wklchris'), ('gender', 'male')] list(dd.keys()) ['name', 'gender'] list(dd.values()) ['wklchris', 'male'] # 【彈出鍵值對】:pop(key) / popitem(key) # 其中,后者會隨機彈出一個鍵值對 tmp = dd.pop("gender") print(dd, tmp) {'name': 'wklchris'} male # 【更新】:update(ref_dict) 以 ref_dict 為準,更新當前字典 d4 = {"name": "Test", "Age": 3} dd.update(d4) print(dd) {'name': 'Test', 'Age': 3}
集合(set)
本文只討論可變集合,關(guān)于不可變集合的內(nèi)容,參考 help(frozenset)。
集合是一種無序的數(shù)據(jù)存儲方式,且內(nèi)部元素具有唯一性。集合與字典一樣都可以用花括號的形式創(chuàng)立。但在書寫 a={} 時,Python 會將其識別為字典類型。
- 增添:add() / update()
- 刪除:remove() / discard(),區(qū)別在于后者搜索無結(jié)果會報錯。
- 從屬:a.issubset(b) 集合 a 是否是 b 的子集;a.issuperset(b) 集合 a 是否是 b 的父集。a == b 兩集合是否全等。
- 集合運算:集合運算不會改變參與運算的集合本身。
- 并集: a | b 或者 a.union(b)
- 交集: a & b 或者 a.intersection(b)
- 補集: a - b 或者 a.difference(b)
注意:在字符串強制轉(zhuǎn)換為集合時,必要時使用中括號先轉(zhuǎn)為列表(否則字符串會被拆分為單個字符后再進行轉(zhuǎn)換)。例如: -
ss = {"a", "b", "c"} ss | set("de") {'a', 'b', 'c', 'd', 'e'} ss | set(["de"]) {'a', 'b', 'c', 'de'}
基本語句
同大多數(shù)程序語言一樣,Python 擁有 if, for, while
語句。什么?switch
語句?使用字典就好。
if 語句與三元操作
在 Python 中,else if
被縮寫為單個關(guān)鍵詞 elif
.
if 1.0 > 1: a = 1 elif 1.0 < 1: a = 2 else: a = 3 a 3
值得一提的是,Python 中的 if 語句支持鏈式比較,形如 a < x < b, a < x >= b
等:
a = 0 if 1 < 2 > 1.5: a = 1 a 1
三元操作實質(zhì)是高度簡化的 if 環(huán)境,形如 X = a if flag else b
:
a = 1 if 2 < 1 else 2 a 2
for 語句
Python 的循環(huán)語句中,像其他語言一樣,有 break
(跳出循環(huán)體) 與 continue
(循環(huán)步進) 關(guān)鍵詞可以使用。
for 語句借助關(guān)鍵詞 in 使用:(函數(shù) range(N, M=0, s=1)
是一個生成等差數(shù)列的函數(shù),位于左閉右開區(qū)間[M,N)
上且公差為 s)。
for i in range(3): print(i) 0 1 2
注意到字典的 d.items(), d.keys(), d.values() 命令也常常用于 for 語句:
d = {"a": 1, "b": 2, "c": 3} for k, v in d.items(): print(k, v) b 2 c 3 a 1
以上等價于:
for k in d.keys(): print(k, d[k]) b 2 c 3 a 1
Python 中的 for
語句可選 else
語法塊,表示 for
語句正常結(jié)束后執(zhí)行的內(nèi)容(中途 break
不屬于正常結(jié)束)。這對于處理一些 break 操作很有幫助。例如:
a = 0 flag = 0 for i in range(5): if i > 2: flag = 1 break if flag == 1: a = 1 a 1
這在 Python 中顯得太復(fù)雜了,直接使用 for…else…
即可:
a = 1 for i in range(5): if i > 1: break else: a = 0 a 1
while 語句
while 語句的 else
語法塊,指明了退出 while 循環(huán)后立刻執(zhí)行的內(nèi)容;它不是必需的。
如果你想要將 while 語句內(nèi)部的參數(shù)傳出(比如下例的計數(shù)器終值),這是一個不錯的方案。
count = 1 while count < 5: a = count count *= 2 else: b = count print(a, b) 4 8
列表解析
列表解析是一種創(chuàng)建列表的高度縮寫方式:
lst = [x ** 2 for x in range(4)] lst [0, 1, 4, 9]
也可以配合 if 語句:
lst = [x ** 2 for x in range(4) if x > 0] lst [1, 4, 9]
類似的,也有字典解析,以及下文會介紹的生成器,也有生成器解析(把外圍的括號換成圓括號即可):
{n: n ** 2 for n in range(3)} {0: 0, 1: 1, 2: 4}
函數(shù)
本節(jié)介紹 Python 函數(shù)的基礎(chǔ)特點,以及一些實用函數(shù)。
函數(shù)定義與判斷
使用 def
關(guān)鍵字。三連雙引號間的內(nèi)容被視為函數(shù)的幫助字符串,可以通過 help()
命令查看。
def func(a, b=0): """ This is a function that can meow. """ return " ".join(["meow"] * (a + b))
調(diào)用函數(shù):
func(2) # 單參數(shù),僅 a 'meow meow' func(2, 3) # 雙參數(shù), a 與 b 都被傳入 'meow meow meow meow meow' help(func) Help on function func in module __main__: func(a, b=0) This is a function that can meow.
通過 callable()
可以判斷一個對象是否是一個可調(diào)用的函數(shù):
callable(func) True
不定參函數(shù)
利用序列(或元組)與字典,向函數(shù)傳參。前者在傳入時需要加上一個星號,后者需要兩個。
lst = [1, 3, 4] d = {"a": 2, "b": 3, "c": 5} print("{}+{}={}".format(*lst), "{a}+={c}".format(**d)) 1+3=4 2+3=5
zip 函數(shù)
zip() 函數(shù)的作用是“合并”多個列表為一個。其返回值是一個列表,列表內(nèi)的元素類型是元組。如果待合并的列表長度不同,以最短的為準。
a = [1, 2, 3, 4] b = [5 ,6, 7] c = "abcd" list(zip(a, b, c)) [(1, 5, 'a'), (2, 6, 'b'), (3, 7, 'c')]
它比較常用于交換字典的鍵與值:
dict(zip(d.values(), d.keys())) {2: 'a', 3: 'b', 5: 'c'}
lambda 函數(shù)
一種匿名函數(shù)的聲明方式。如果你使用過 MATLAB
,你可能熟悉這一類概念。
func = lambda x, y: x + y func(2, 5) 7
map 函數(shù)
map()
能夠?qū)魅氲男蛄羞M行依次操作,并將結(jié)果返回為一個可轉(zhuǎn)換為列表的 map
對象。通常列表解析(或生成器解析)可以實現(xiàn)與其同樣的工作。
lst = list(map(lambda x: x + 1, range (5))) print(lst) [1, 2, 3, 4, 5] f = lambda x: x + 1 [f(x) for x in range(5)] [1, 2, 3, 4, 5]
filter 函數(shù)
給定序列,對于滿足某規(guī)則的部分(即 True),予以返回。
list(filter(lambda x: x > 0, range(-3, 3))) [1, 2]
reduce 函數(shù)
該函數(shù)在 Python 2 中是可以直接調(diào)用的,但在 Python 3 中需要從 functools
模塊進行調(diào)用。
from functools import reduce reduce(lambda x, y: x + y, range (5)) # 0+1+2+3+4 10
enumerate 函數(shù)
它允許你像 d.items() 那樣,用類似的方式操作列表:
a = [1, 3, 5] for i, v in enumerate(a): print("lst[{}] = {}".format(i, v)) lst[0] = 1 lst[1] = 3 lst[2] = 5
作者:柯廣的網(wǎng)絡(luò)日志 ? Python語法速查,這些都會嗎?
微信公眾號:Java大數(shù)據(jù)與數(shù)據(jù)倉庫