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ù)倉庫