天天看點

Python文法糖系列

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