Python文法糖系列
摘自:https://blog.csdn.net/five3/article/details/83474633
文法糖說明
文法糖(Syntactic sugar):
計算機語言中特殊的某種文法
這種文法對語言的功能并沒有影響
對于程式員有更好的易用性
能夠增加程式的可讀性
簡而言之,文法糖就是程式語言中提供[奇技淫巧]的一種手段和方式而已。 通過這類方式編寫出來的代碼,即好看又好用,好似糖一般的文法。固美其名曰:文法糖
一個簡單的例子
假設:有2個數字,現需要從中得到最大的那個數字。如何實作?
b = 2
c = 3
if b > c:
a = b
else:
a = c
其實還有更多的其它實作方式:
a = max(b, c)
a = c > b and c or b
a = c if c > b else b
a = [b, c][c > b]
這些都是可以實作我們需求的方法,殊途同歸。但是它們在易用性、簡潔性、可讀性、性能等方面的表現都不一樣。那麼問題來了!
哪個才是我們所說的文法糖呢?
一些常見的文法糖
a = 1; b = 2; c = 3
b, c = c, b
a < c < b < 5
'1' * 100
[1,2,3,4] + [5,6,7,8]
可以看到這些文法,在其它語言裡通常不會出現的。但是在Python中卻神奇的被支援了,是以這些都是當之無愧的Python文法糖。
切片操作
像清單這類可以支援**切片**操作的對象,則是我最初喜歡Python的一個非常重要的原因。
l = [1, 2, 3, 4, 5]
l[2]
l[:3]
l[3:]
l[2:4]
l[:-1]
l[:]
l[::2]
with文法糖
with文法糖實作的是一個上下文管理器,它主要的特點就是幫助我們自動管理上下文的銜接。即在需要的時候傳給我們,不需要的時候自動關閉上下文對象。 需要注意的是:使用with文法糖是有條件的。即其後跟的對象必須要實作__enter__和__exit__這2個魔法屬性。具體使用的例子如下:
with open('example_2.txt', 'r', encoding='utf-8') as f:
for line in f:
print(line, end='')
else文法糖
Python中提供一類else的文法,它可以在原有文法基礎之上,支援更多一種情況的選擇。 主要有for-else,while-else,try-else。需要注意的是,for-else和while-else需要和break語句配合時使用。
for else
for i in range(1):
print(i)
break
print('for end')
while else
i = 1
while i:
i -= 1
print('while end')
try else
try:
1 / 1
except Exception as e:
print('except occured')
print('it is fine')
finally:
print('i am finally')
函數相關文法糖
Python中函數我們都非常的熟悉,而在函數的使用上卻有着與其它語言不同的選擇。
動态參數
def example_dynamic_args(*args, **kwargs):
'''動态參數'''
print(args)
print(kwargs)
這個函數的參數與函數相比,其參數會有些不同之處。因為它們在接收參數時使用了不同方式。
example_dynamic_args(1,'2', True, name='xiaowu', age=18)
l = [1,'2',False]
d = {'name': 'xiaoming', age: '16'}
example_dynamic_args(*l, **d)
匿名函數
匿名函數在很多的語言中都存在,通常在臨時需要一個函數的場景下使用。
lambda x: x * 2
Python中使用lambda表達式來實作匿名函數,觀察上面的lambda表達式。其特點如下:
可以接受函數
函數體隻有一個表達式
無需顯式的return語句
整個表達式在一個文法行内實作
值得注意的是,lambda表達式除了一些文法上的限制之外;其它函數該有的特性它都有。比如:支援動态參數。下面是一個使用lambda表示的場景:
in_dict = {'a': 10, 'b': 2, 'c': 3}
print('in_dict:', in_dict)
out_dict = sorted(in_dict.items(), key=lambda x: x[1])
print('out_dict', out_dict)
推導表達式
推導表達式是Python中常見的文法糖,在很多的資料處理場景中,我們可能會使用的到。 最常見的就是清單推導表達式,可以用來過濾、處理清單中的子項并輸出一個新的清單。除此之外還有幾個推導式也是非常好用的。
清單推導表達式
in_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 8, 7]
print('array before:', in_list)
array = [i for i in in_list if i % 2 != 0] # 清單推導表達式
print('array after:', array)
生成器推導表達式
array = (i for i in in_list if i % 2 != 0) # 生成器推導表達式
集合推導表達式
array = {i for i in in_list if i % 2 != 0} # 集合推導表達式
字典推導表達式
array = {i: i * 2 for i in in_list if i % 2 != 0} # 字典推導表達式
不同推導式在文法使用上基本一緻,隻是在傳回對象的類型上有所差别。
yield表達式
yield文法也是Python中比較有特點的文法糖,可以說是特有的。雖然其它語言有實作類似機制的功能。 yield是Python中實作**協程(coroutine)**的一個重要基礎。
def example_generator(in_list):
'''生成器'''
for i in in_list:
yield i * 2
裝飾器
重要的往往在最後面,裝飾器是學習Python繞不過去的坎。就像學習Java要了解面向對象和設計模式一樣。 學習Python,你就應該要掌握好閉包、生成器、裝飾器等相關知識。而對于編寫高并發程式時則要掌握協程相關知識。
def example_decorator(func):
'''裝飾器'''
def inner():
func()
return inner
更多學習
Python裝飾器詳解
Python多線程GIL
Python魔法屬性
Python文法糖
————————————————
版權聲明:本文為CSDN部落客「上帝De助手」的原創文章,遵循 CC 4.0 BY-SA 版權協定,轉載請附上原文出處連結及本聲明。
原文連結:https://blog.csdn.net/five3/article/details/83474633