最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python高級用法總結(jié)

 更新時間:2018年05月26日 00:14:11   作者:Yabea  
Python很棒,它有很多高級用法值得細細思索,學習使用。本文將根據(jù)日常使用,總結(jié)介紹Python的一組高級特性,包括:列表推導式、迭代器和生成器、裝飾器

列表推導(list comprehensions)

場景1:將一個三維列表中所有一維數(shù)據(jù)為a的元素合并,組成新的二維列表。

最簡單的方法:新建列表,遍歷原三維列表,判斷一維數(shù)據(jù)是否為a,若為a,則將該元素append至新列表中。
缺點:代碼太繁瑣,對于Python而言,執(zhí)行速度會變慢很多。

針對場景1,我們首先應該想到用列表解析式來解決處理,一行代碼即可解決:

lista = [item for item in array if item[0] == 'a']

那么,何為列表解析式?

官方解釋:列表解析式是Python內(nèi)置的非常簡單卻強大的可以用來創(chuàng)建list的生成式。

強大具體如何體現(xiàn)?

可以看到,使用列表解析式的寫法更加簡短,除此之外,因為是Python內(nèi)置的用法,底層使用C語言實現(xiàn),相較于編寫Python代碼而言,運行速度更快。

場景2: 對于一個列表,既要遍歷索引又要遍歷元素。

這里可以使用Python內(nèi)建函數(shù)enumerate,在循環(huán)中更好的獲取獲得索引。

array = ['I', 'love', 'Python']
for i, element in enumerate(array):
  array[i] = '%d: %s' % (i, seq[i])

可以使用列表推導式對其進行重構(gòu):

def getitem(index, element):
  return '%d: %s' % (index, element)

array = ['I', 'love', 'Python']
arrayIndex = [getitem(index, element) for index, element in enumerate(array)]

據(jù)說這種寫法更加的Pythonic。

總結(jié):如果要對現(xiàn)有的可迭代對象做一些處理,然后生成新的列表,使用列表推導式將是最便捷的方法。

迭代器和生成器

迭代器(Iterator)

這里的迭代可以指for循環(huán),在Python中,對于像list,dict和文件等而言,都可以使用for循環(huán),但是它們并不是迭代器,它們屬于可迭代對象。

什么可迭代對象

最簡單的解釋:可以使用for...in...語句進行循環(huán)的對象,就是可迭代對象(Iterable),可以使用isinstance()方法進行判斷。

from collections import Iterable 
type = isinstance('python', Iterable)
print type

什么是迭代器
迭代器指的是可以使用next()方法來回調(diào)的對象,可以對可迭代對象使用iter()方法,將其轉(zhuǎn)換為迭代器。

temp = iter([1, 2, 3])
print type(temp)
print next(temp)

此時temp就是一個迭代器。所以說,迭代器基于兩個方法:

  • next:返回下一個項目
  • iter 返回迭代器本身

可理解為可被next()函數(shù)調(diào)用并不斷返回下一個值的對象就是迭代器,在定義一個裝飾器時將需要同時定義這兩個方法。

迭代器的優(yōu)勢

在構(gòu)建迭代器時,不是將所有的元素一次性的加載,而是等調(diào)用next方法時返回元素,所以不需要考慮內(nèi)存的問題。

迭代器應用場景

那么,具體在什么場景下可以使用迭代器呢?

  • 數(shù)列的數(shù)據(jù)規(guī)模巨大
  • 數(shù)列有規(guī)律,但是不能使用列表推導式描述。

生成器

生成器是一種高級迭代器,使得需要返回一系列元素的函數(shù)所需的代碼更加的簡單和高效(不像創(chuàng)建迭代器代碼那般冗長)。

生成器函數(shù)

生成器函數(shù)基于yield指令,可以暫停一個函數(shù)并返回中間結(jié)果。當需要一個將返回一個序列或在循環(huán)中執(zhí)行的函數(shù)時,就可以使用生成器,因為當這些元素被傳遞到另一個函數(shù)中進行后續(xù)處理時,一次返回一個元素可以有效的提升整體性能。
常見的應用場景是使用生成器的流數(shù)據(jù)緩沖區(qū)。

生成器表達式

生成式表達式是一種實現(xiàn)生成器的便捷方式,將列表推導式的中括號替換為圓括號。
和列表推導式的區(qū)別:列表生成式可以直接創(chuàng)建一個表,但是生成器表達式是一種邊循環(huán)邊計算,使得列表的元素可以在循環(huán)過程中一個個的推算出來,不需要創(chuàng)建完整的列表,從而節(jié)省了大量的空間。

g = (x * x for x in range(10))

總結(jié):生成器是一種高級迭代器。生成器的優(yōu)點是延遲計算,一次返回一個結(jié)果,這樣非常適用于大數(shù)據(jù)量的計算。但是,使用生成器必須要注意的一點是:生成器只能遍歷一次。

lambda表達式(匿名函數(shù))

lambda表達式純粹是為了編寫簡單函數(shù)而設計,起到了一個函數(shù)速寫的作用,使得簡單函數(shù)可以更加簡潔的表示。

lambda和def的區(qū)別

lambda表達式可以省去定義函數(shù)的過程,讓代碼更加的簡潔,適用于簡單函數(shù),編寫處理更大業(yè)務的函數(shù)需要使用def定義。
lambda表達式常搭配map(), reduce(), filter()函數(shù)使用

  • map(): map函數(shù)接受兩個參數(shù),一個是函數(shù),一個是序列,其中,函數(shù)可以接收一個或者多個參數(shù)。map將傳入的函數(shù)依次作用于序列中的每個元素,將結(jié)果作為新的列表返回。
    #將一個列表中的數(shù)字轉(zhuǎn)換為字符串 map(str, [1,2,3,4,5,6])

  • reduce():函數(shù)接收兩個參數(shù),一個是函數(shù),另一個是序列,但是,函數(shù)必須接收兩個參數(shù)reduce把結(jié)果繼續(xù)和序列的下一個元素做累積計算,其效果就是reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)。

  • filter():該函數(shù)用于篩選,將傳入的函數(shù),依次作用于每個元素,然后根據(jù)函數(shù)的返回值是True還是False,決定是留下還是丟棄該元素。

裝飾器

裝飾器本質(zhì)是一個Python函數(shù),它可以讓其它函數(shù)在沒有任何代碼變動的情況下增加額外功能。有了裝飾器,我們可以抽離出大量和函數(shù)功能本身無關(guān)的雷同代碼并繼續(xù)重用。經(jīng)常用于具有切面需求的場景:包括插入日志、性能測試、事務處理、緩存和權(quán)限校驗等。

那么為什么要引入裝飾器呢?

場景:計算一個函數(shù)的執(zhí)行時間。

一種方法就是定義一個函數(shù),用來專門計算函數(shù)的運行時間,然后運行時間計算完成之后再處理真正的業(yè)務代碼,代碼如下:

import time 

def get_time(func):
  startTime = time.time()
  func()
  endTime = time.time()
  processTime = (endTime - startTime) * 1000
  print "The function timing is %f ms" %processTime

def myfunc():
  print "start func"
  time.sleep(0.8)
  print "end func"

get_time(myfunc)
myfunc()

但是這段代碼的邏輯破壞了原有的代碼邏輯,就是對所有func函數(shù)的調(diào)用都需要使用get_time(func)來實現(xiàn)。
那么,有沒有更好的展示方式呢?當然有,那就是裝飾器。

編寫簡單裝飾器

結(jié)合上述實例,編寫裝飾器:

def get_time(func):
  def wrapper():
    startTime = time.time()
    func()
    endTime = time.time()
    processTime = (endTime - startTime) * 1000
    print "The function timing is %f ms" %processTime
  return wrapper
  
print "myfunc is:", myfunc.__name__
myfunc = get_time(myfunc)
print "myfunc is: ", myfunc.__name__
myfunc()

這樣,一個簡單的完整的裝飾器就實現(xiàn)了,可以看到,裝飾器并沒有影響函數(shù)的執(zhí)行邏輯和調(diào)用。
在Python中,可以使用"@"語法糖來精簡裝飾器的代碼,將上例更改為:

@ get_time
def myfunc():
  print "start func"
  time.sleep(0.8)
  print "end func"

print "myfunc is: ", myfunc.__name__
myfunc()

** 裝飾器的調(diào)用順序**
裝飾器可以疊加使用,若多個裝飾器同時裝飾一個函數(shù),那么裝飾器的調(diào)用順序和@語法糖的聲明順序相反,也就是:

@decorator1
@decorator2
def func():
  pass

等效于:

func = decorator1(decorator2(func()))

被裝飾的函數(shù)帶參數(shù)

上述實例中,myfunc()是沒有參數(shù)的,那如果添加參數(shù)的話,裝飾器該如何編寫呢?

#被裝飾的函數(shù)帶參數(shù)
def get_time3(func):
  def wrapper(*args, **kwargs):
    startTime = time.time()
    func(*args, **kwargs)
    endTime = time.time()
    processTime = (endTime - startTime) * 1000
    print "The function timing is %f ms" %processTime
  return wrapper
@ get_time3
def myfunc2(a):
  print "start func"
  print a
  time.sleep(0.8)
  print "end func"

a = "test"
myfunc2(a)

帶參數(shù)的裝飾器

裝飾器有很大的靈活性,它本身支持參數(shù),例如在上述實例中,@get_time裝飾器唯一的參數(shù)就是執(zhí)行業(yè)務的函數(shù),當然也可以在裝飾器中添加參數(shù),加以邏輯判斷。

內(nèi)置裝飾器

Python中,常見的類裝飾器包括:@staticmathod、@classmethod和@property

  • @staticmethod:類的靜態(tài)方法,跟成員方法的區(qū)別是沒有self參數(shù),并且可以在類不進行實例化的情況下調(diào)用。
  • @classmethod:跟成員方法的區(qū)別是接收的第一個參數(shù)不是self,而是cls(當前類的具體類型)
  • @property:表示可以直接通過類實例直接訪問的信息。

以上,是本次整理的Python高級用法,本文將持續(xù)更新。

相關(guān)文章

  • python實現(xiàn)在windows服務中新建進程的方法

    python實現(xiàn)在windows服務中新建進程的方法

    這篇文章主要介紹了python實現(xiàn)在windows服務中新建進程的方法,涉及Python針對Windows服務與進程操作的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • Python實現(xiàn)帶GUI界面的手寫數(shù)字識別

    Python實現(xiàn)帶GUI界面的手寫數(shù)字識別

    這篇文章主要介紹了如何通過Python實現(xiàn)帶GUI界面的手寫數(shù)字識別,文中的示例代碼講解詳細,對我們學習Python有一定的幫助,感興趣的可以了解一下
    2022-01-01
  • NumPy統(tǒng)計函數(shù)的實現(xiàn)方法

    NumPy統(tǒng)計函數(shù)的實現(xiàn)方法

    這篇文章主要介紹了NumPy統(tǒng)計函數(shù)的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • python使用ProjectQ生成量子算法指令集

    python使用ProjectQ生成量子算法指令集

    在量子計算機領域,由于實現(xiàn)方案的不同,在不同的體系內(nèi)的指令集其實是不一樣的,并不是說OpenQASM里面的所有指令都會被支持。但是這也沒有關(guān)系,因為本文將要介紹的開源量子計算模擬器框架ProjectQ可以支持將輸入的量子算法分解到對應的指令集中。
    2021-05-05
  • Django+Vue實現(xiàn)文件上傳下載的項目實踐

    Django+Vue實現(xiàn)文件上傳下載的項目實踐

    本文主要介紹了Django+Vue實現(xiàn)文件上傳下載的項目實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • 使用python遍歷指定城市的一周氣溫

    使用python遍歷指定城市的一周氣溫

    本文主要介紹了使用python遍歷指定城市的一周氣溫的實現(xiàn)方法。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-03-03
  • Python Dataframe 指定多列去重、求差集的方法

    Python Dataframe 指定多列去重、求差集的方法

    今天小編就為大家分享一篇Python Dataframe 指定多列去重、求差集的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • python實現(xiàn)桌面壁紙切換功能

    python實現(xiàn)桌面壁紙切換功能

    這篇文章主要為大家詳細介紹了python requests+pywin32實現(xiàn)桌面壁紙切換,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Python decorator攔截器代碼實例解析

    Python decorator攔截器代碼實例解析

    這篇文章主要介紹了Python decorator攔截器代碼實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • Python將圖片轉(zhuǎn)為漫畫風格的示例

    Python將圖片轉(zhuǎn)為漫畫風格的示例

    本文主要介紹了Python將圖片轉(zhuǎn)為漫畫風格的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04

最新評論

呼玛县| 大安市| 泸水县| 泗阳县| 广西| 垣曲县| 长治市| 冕宁县| 衡东县| 河西区| 平远县| 福清市| 红河县| 福清市| 曲沃县| 武隆县| 曲沃县| 宜阳县| 景东| 南陵县| 轮台县| 磐石市| 广州市| 久治县| 吉木萨尔县| 辛集市| 富裕县| 章丘市| 曲阜市| 慈利县| 青神县| 寿光市| 永康市| 太仆寺旗| 孝感市| 柘城县| 常宁市| 甘南县| 吉木萨尔县| 寿阳县| 报价|