02.27 掌握這些高級Python技巧,讓你的編程事半功倍

前言

Python是一種面向對象的語言,它與英語非常相似,因此對於初學者來說是一種非常好的語言。它的高級特性和受支持的庫包甚至可以用幾行代碼來編寫複雜的任務。在本文中,我們將介紹python的一些高級特性,掌握這些特性可以讓你的編程更加順暢。

1.列表解析

列表解析為無處不在的for循環提供了一種更簡短、更好的替代方法。它用於我們需要對列表中的每個元素執行操作的迭代上下文中。

語法:

<code>[some_operation(element) for element in sequence]
- returns list of elements./<code>

舉例:

<code>​​# Python program to segregate positive and negative numbers in an array.
def segregate(arr):
return [x for x in arr if x%2 == 0] + [x for x in arr if x%2 != 0]
​​
if __name__ == '__main__':
arr = [1, 8, 5, 3, 2, 6, 7, 10]
arr = segregate(arr)
print (arr)
# prints [8, 2, 6, 10, 1, 5, 3, 7]/<code>

​我們用列表解析的方法將一個列表拼分成兩個列表重新拼接。第一個列表要挑選出所有的偶數,第二個列表挑選出所有的奇數。


2.切片

切片(slice)用於從給定的序列中提取元素的連續序列/子序列。默認情況下,step_size為1,因此生成一個連續序列。但是,我們可以為step_size提供任何值來獲得非連續的元素序列。

舉例:

<code># Python program to rotate an array by 'd' elements.

def rotate(arr, d):
return arr[d:] + arr[:d]

if __name__ == '__main__':
arr = [1, 2, 3, 4, 5, 6, 7, 8]
ar = rotate(arr, 3)

print (arr)

# prints [3 ,4, 5, 6, 7, 8, 1, 2]/<code>

這裡,我們再次連接兩個切片操作的結果(列表)。首先,我們將列表從索引' d '切片到結束,然後從開始切片到索引' d '。

<code># Python program to reverse an array.

def reverse(arr):
return arr[::-1]


if __name__ == '__main__':
arr = [1, 2, 3, 4, 5, 6, 7, 8]
arr = reverse(arr)
print (arr)

# prints [8 ,7, 6, 5, 4, 3, 2, 1]/<code>

這是一個顯示step_size用法的例子。步長為-1表示從結束到開始切片。

3.Lambda

Lambda是一個匿名函數,它只包含一個表達式。它基本上是函數的簡寫,可以在任何需要表達式的地方使用。

舉例:

<code>import math
square_root = lambda x: math.sqrt(x)

# is an equivalant lambda expression for below function
def square_root(x):
return math.sqrt(x)/<code>

這裡lambda函數用來表示對一個數求根號的函數​。​

4.Map

Map用於需要對元素序列應用函數/lambda的場景。儘管您幾乎總是可以用列表解析來代替使用映射的需求。

舉例:

<code># Square the numbers in the list.
import math


if __name__ == '__main__':

arr = [1, 2, 3, 4, 5]

arr = list(map(lambda x : x**2, arr))

print (arr)

# prints [1, 4, 9, 16, 25]/<code>

Map用於對序列中的每個元素進行平方。由於map返回一個iterable,我們需要用所需的類型(上面例子中的列表)包裝結果。

5.Filter過濾器

另一方面,Filter對一個元素序列應用一個函數/lambda,並返回該函數/lambda返回True的元素序列。

舉例:

<code># Print all even numbers in an array.


if __name__ == '__main__':
arr = [1, 2, 3, 4, 5, 6]
arr = list(filter(lambda x : x%2 == 0, arr))
print (arr)

# print [2, 4, 6]/<code>

這裡,我們應用過濾器只返回序列中的偶數。

6.生成器

生成器是創建迭代器的簡單方法。更正式地說,生成器是返回一個對象(迭代器)的函數,我們可以迭代該對象(一次一個值)。如果我們在python中從頭開始編寫相同的功能,它應該是這樣的:

<code># Iterator for next power of two.
class NextPowTwo:

def __init__(self, max_ele = 0):
self.max_ele = max_ele


def __iter__(self):
self.n = 0
return self

def __next__(self):
if self.n <= self.max_ele:
result = 2 ** self.n
self.n += 1
return result
else:
raise StopIteration


if __name__ == '__main__':

it = iter(NextPowTwo(20))

print (next(it)) # prints '1'
print (next(it)) # prints '2'
print (next(it)) # prints '4'
print (next(it)) # prints '8'/<code>

然而,實際的python不會讓我們這麼麻煩。下面是使用生成器的類似內容。正如您所看到的,上面提到的內容(調用__iter__()和__next__())都是由生成器自動處理的。

<code># Generator for next power of two.
def NextPowTwo(max_ele):
n = 0
while n < max_ele:
yield 2 * n
n += 1
raise StopIteration


obj = NextPowTwo(20)
print (obj.next())
print (obj.next())
print (obj.next())
print (obj.next())/<code>

生成器是通過使用yield語句而不是return語句i定義一個普通函數來創建的。如果函數包含至少一個yield語句,它就成為一個生成器函數。yield和return都將從函數返回一些值。函數在執行return時終止,而yield語句暫停函數,保存它的所有狀態,然後在後續調用時繼續執行。

一個生成器包含以下內容:

  • 至少有一個yield語句。
  • 返回一個對象(迭代器),但不立即開始執行。
  • 記住連續調用之間的局部變量及其狀態。
  • 實現迭代協議。


分享到:


相關文章: