Python語法特性

Python語法特性

使用Python來編寫也有很長一段時間了,也想着如何優化本身的代碼,隨之也搜了一些問題。
其中印象比較深入的就是stackoverflow上的一個問題解答了。python

 

Argument Unpackingexpress

可使用 * 和 ** 分別將一個列表和一個字典解包爲函數參數如:app

def draw_point(x, y):
	# do something


tuple = (6, 8)
dir = {'x': 6, 'y': 8}

draw_point(*tuple)
draw_point(**dir)

Decorators 函數

裝飾器的做用就是在不須要修改原函數代碼的前提下增長新的功能,在調用原函數的時候先執行裝飾器,如:優化

def print_before_func(func):
	def wrapper(*args, **kwargs):
		print("print before func")
		return func(*args, **kwargs)
	return wrapper


@print_befor_func
def write(text):
	print(text)


write(Hello world)

結果:
print before func
Hello world


Dictionary default .get value this

字典中有一個get()方法。若是你使用dict['key']的方式而key不存在的話就會出現異常。使用dict.get('key')的話若是key不存在則只會返回None。固然get()方法提供了第二個參數,若是返回None則會返回第二個參數的值。code

num = dict.get('num', 0)

 

Enumeration
使用enumeration包住一個可迭代對象,它會將index和item綁在一塊兒,返回一個enumeration對象,如:orm

a = ['a', 'b', 'c', 'd']
for index, item in enumeration(a):
	print(index, item)


···
0 a
1 b
2 c
3 d
···

 

在同時須要索引和值的時候頗有用對象

 

For/else
語法以下:blog

for i in foo:
	if i == 0:
		break
else:
	print("it was never 0")

 

else代碼塊會在循環正常結束後執行,也就是說沒用出現break時纔會調用else代碼塊,上面代碼等價於:

found = False
for i in foo:
	if i == 0:
		found = True
		break

if not found:
	print("it was never 0")

這個語法挺容易讓人混淆的,全部在使用的時候最好是註釋一下,以避免被其餘小夥伴搞錯含義了。 

上面的代碼也等價於:

if any(i == 0 for i in foo):
	pass
else:
	print("it was never 0")


Generator expressions
假如你這樣寫:

x = (n for n in foo if bar(n))


你將會獲得一個生成器,並能夠把它付給一個變量x。如今你能夠像下面同樣使用生成器: 

for n in x:
	print(n)


這樣作的好處就是節省內存了。你不須要中間存儲,而若是像下面這樣的話,則須要: 

x = [n for n in foo if bar(n)]
# 列表推導


在某些狀況下,這會致使極重要的速度提高。 

你能夠添加許多if語句到生成器的尾端,基本複製for循環嵌套:

>>> n = ((a,b) for a in range(0,2) for b in range(4,6))
>>> for i in n:
...   print i 

(0, 4)
(0, 5)
(1, 4)
(1, 5)

 

使用生成器最大的好處就是節省內存了。由於每個值只有在你須要的時候纔會生成,而不像列表推導那樣一次性生成全部的結果。

 

List stepping
切片操做符中的步長(step)參數。例如:

a = [1,2,3,4,5]
>>> a[::2]  		# iterate over the whole list in 2-increments
[1,3,5]

特殊例子x[::-1]對‘x反轉’來講至關有用。

>>> a[::-1]
[5,4,3,2,1]

 

固然,你可使用reversed()函數來實現反轉。
區別在於,reversed()返回一個迭代器,因此還須要一個額外的步驟來將結果轉換成須要的對象類型。
這個特性在判斷例如迴文的時候灰常有用,一句話搞定

True if someseq == someseq[::-1] else False

 

Named string formatting
%-格式化接收一個字典(也適用於%i%s等)

>>> print "The %(foo)s is %(bar)i." % {'foo': 'answer', 'bar':42}
The answer is 42.

 

 

try/except/else
else語句塊只有當try語句正常執行(也就是說,except語句未執行)的時候,纔會執行。
finally則不管是否異常都會執行。

try:
     Normal execution block
except A:
     Exception A handle
except B:
     Exception B handle
except:
     Other exception handle
else:
     if no exception,get here
finally:
     this block will be excuted no matter how it goes above

 

參考文章:Hidden features of Python

相關文章
相關標籤/搜索