什麼是Pythonic?如何Pythonic?

什麼是Pythonic?就是讓你的Python代碼看上去更簡潔、明瞭、規範。建議大家寫Python用Pycharm,它會按PEP8規範提示大家的寫法,就是代碼下面會有波浪線或問號,然後按IDE提示的方法修改即可。

既然說到規範,先說一下Python的命名規範:

文件名

小寫字母,單詞之間用_分割:test_site.py

類名

單詞首字母大寫,即駝峯式:TestSite

全局變量

大寫字母,單詞之間用_分割:TEST_SITE

普通變量/函數

小寫字母,單詞之間用_分割:
test_engineer_site
get_site()

個人建議,如無特殊需求,建議大家使用Python3.8(2022.5.29)
第一,版本總歸要升上來的,用的版本越高,可用的特性也越多;第二,Python3.9目前稍微有點新,有些三方包還不支持。

下面列出一些Pythonic的例子,大家收藏並多多練習:

1.一行賦值多個變量

# 其他語言風格
test = 1
engineer = 2
site = 3

# Pythonic
test, engineer, site = 1, 2, 3

2.一行代碼交換兩個變量

# 其他語言風格
temp = test
test = engineer
engineer = temp

# Pythonic
test, engineer= engineer, test

3.拼接字符串

# 其他語言風格
alist = ["測試", "工程師", "小站"]
res = alist[0] +  alist[1] +  alist[2]  #或是通過循環加

# Pythonic
res = ''.join(alist)  # 不僅代碼少,速度還快

4.使用操作符in

# 不推薦
if word == "測試" or word == "工程師" or word == "小站":
    print("在列表中")

alist = ["測試", "工程師", "小站"]
for i in range(len(alist)):
    print(alist[i])


# Pythonic
if word in ["測試", "工程師", "小站"]:
    print("在列表中")
if word not in ["測試", "工程師", "小站"]:
    print("不在列表中")

alist = ["測試", "工程師", "小站"]
for i in alist:
    print(i)

# 遍歷字典的鍵-值(key-value)
for k, v in dic.items():
    print(k, v)

5.鏈式比較

# 不推薦
if age>25 and age<35:
    print("苦練技術不怕互聯網公司年齡歧視")
if age1==38 and age2==38 and age3==38 and age4==38: 
    print("苦練技術不怕互聯網公司年齡歧視")


# Pythonic
if 25 <age <35:
    print("苦練技術不怕互聯網公司年齡歧視")
if age1==age2==age3==age4==38: 
    print("苦練技術不怕互聯網公司年齡歧視")

6.列表去重

# Pythonic
a = [1, 2, 3, 1, 2, 3]
a = list(set(a))

7.判斷真假

# 不推薦
if a == True:
    print("a爲True")

if a is True:
    print("a爲True")

if len(alist) != 0:
    print("alist不爲空")

if alist != []:
    print("alist不爲空")

if astr != '':
    print("astr不是空字符串") 


# Pythonic
if a:
    print("a爲True")

if not a:
    print("a爲False")

if alist:
    print("alist不爲空")

if astr:
    print("astr不是空字符串") 

if not astr:
    print("astr是空字符串") 

8.if else 三目運算

# 其他語言風格
if age < 18:
    flag = "未成年"
else:
    flag = "成年"

# Pythonic
flag = "未成年" if age < 18 else "成年"  # 4行變1行

9.使用f''接拼字符串和變量

# 不推薦
a, b = "測試", "小站"
res = a + "工程師" + b

# Pythonic
a, b = "測試", "小站"
res = f"{a}工程師{b}"

10.使用enumerate遍歷列表的索引和值

# 不推薦
alist = ["測試", "工程師", "小站"]
for i in range(len(alist)):
    print(f'{i}:{alist[i]}')

# Pythonic
alist = ["測試", "工程師", "小站"]
for index, word in enumerate(alist):
    print(f'{index}:{word}')

11.列表推導式

# 其他語言風格
alist = [5, 2, 7, 0, 1, 8]
new_list = []
for i in alist:
    if i > 4:
        new_list.append(i) 

# Pythonic
alist = [5, 2, 7, 0, 1, 8]
new_list = []
new_list = [i for i in alist if i > 4]

12.獲取字典元素

# 不推薦
adic = {"apple": 4, "banana": 6, "pear": 3}
apple_num = adic["apple"]
egg_num = adic["egg"]  # 該句會報錯

# Pythonic
# 不推薦
adic = {"apple": 4, "banana": 6, "pear", 3}
apple_num = adic.get("apple")
egg_num = adic.get("egg", 0)  # key不存在時,返回值爲指定的0

13.遍歷字典的鍵(key)

# 不推薦
adic = {"apple": 4, "banana": 6, "pear", 3}
for key in adict.keys():
    print(key)

# Pythonic
adic = {"apple": 4, "banana": 6, "pear", 3}
for key in adict:
    print(key)

14.解包

# 解包列表、元組
test, engineer, site = ["測試", "工程師", "小站"]  # ("測試", "工程師", "小站")也支持

# 更復雜的列表解包
a, *rest = [1, 2, 3]
# 輸出:a = 1, rest = [2, 3]

a, *middle, c = [1, 2, 3, 4]
# 輸出:a = 1, middle = [2, 3], c = 4

# 函數調用對列表解包
def func(a, b, c, d):
    print(a, b, c, d)

args = [1, 2, 3, 4]
func(*args)
# 輸出:1 2 3 4

# 函數調用對字典解包
# ** 會以鍵/值的形式解包一個字典
def func(a, b, c, d):
    print(a, b, c, d)

kwargs = {"a": 1, "b": 2, "c": 3, "d": 4}
func(**kwargs)
# 輸出:1 2 3 4

15.使用with打開文件

# 不推薦
f = open("file.txt")
try:
    data = f.read()
    # ...
finally:
    f.close()

# Pythonic
# 使用with最後會自動調用close()方法
with open("file.txt") as f:
    data = f.read()
    # ...

16.使用zip()同時處理多個列表

# 不推薦
a, b = [1,2,3], [3,4,5]
for i in range(len(a)):
    print(a[i], b[i])

# Pythonic
a, b = [1,2,3], [3,4,5]
z = zip(a, b)
for x, y in z:
    print(x, y)

17.any()/all()函數

# 不推薦
alist = [0,None,'',5]
for i in alist:
    if i:
        print('至少有一個爲真')

alist = [0,None,'',5]
flag = True
for i in alist:
    if not i:
        flag = False
if flag:
    print('全部爲真')


# Pythonic
# any():至少有一個爲真則返回真
if any(alist):
    print('至少有一個爲真')

# all():全部爲真才返回真
if all(alist):
    print('全部爲真')

可以看到,使用Pythonic寫出的代碼量,是不是比其他語言風格的代碼量要少的多,這也就是爲啥Python寫起來快的原因,而且方便。

 

---------------------------------------------------------------------------------

關注微信公衆號即可在手機上查閱,並可接收更多測試分享~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章