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

Python中生成器和yield語(yǔ)句的用法詳解

 更新時(shí)間:2015年04月17日 10:36:09   投稿:goldensun  
這篇文章主要介紹了Python中生成器和yield語(yǔ)句的用法,生成器是Python編程進(jìn)階中的重要知識(shí)點(diǎn),需要的朋友可以參考下

 在開(kāi)始課程之前,我要求學(xué)生們填寫(xiě)一份調(diào)查表,這個(gè)調(diào)查表反映了它們對(duì)Python中一些概念的理解情況。一些話(huà)題("if/else控制流" 或者 "定義和使用函數(shù)")對(duì)于大多數(shù)學(xué)生是沒(méi)有問(wèn)題的。但是有一些話(huà)題,大多數(shù)學(xué)生只有很少,或者完全沒(méi)有任何接觸,尤其是“生成器和yield關(guān)鍵字”。我猜這對(duì)大多數(shù)新手Python程序員也是如此。

有事實(shí)表明,在我花了大功夫后,有些人仍然不能理解生成器和yield關(guān)鍵字。我想讓這個(gè)問(wèn)題有所改善。在這篇文章中,我將解釋yield關(guān)鍵字到底是什么,為什么它是有用的,以及如何來(lái)使用它。

注意:最近幾年,生成器的功能變得越來(lái)越強(qiáng)大,它已經(jīng)被加入到了PEP。在我的下一篇文章中,我會(huì)通過(guò)協(xié)程(coroutine),協(xié)同式多任務(wù)處理(cooperative multitasking),以及異步IO(asynchronous I/O)(尤其是GvR正在研究的 "tulip" 原型的實(shí)現(xiàn))來(lái)介紹yield的真正威力。但是在此之前,我們要對(duì)生成器和yield有一個(gè)扎實(shí)的理解.

協(xié)程與子例程

我們調(diào)用一個(gè)普通的Python函數(shù)時(shí),一般是從函數(shù)的第一行代碼開(kāi)始執(zhí)行,結(jié)束于return語(yǔ)句、異常或者函數(shù)結(jié)束(可以看作隱式的返回None)。一旦函數(shù)將控制權(quán)交還給調(diào)用者,就意味著全部結(jié)束。函數(shù)中做的所有工作以及保存在局部變量中的數(shù)據(jù)都將丟失。再次調(diào)用這個(gè)函數(shù)時(shí),一切都將從頭創(chuàng)建。

對(duì)于在計(jì)算機(jī)編程中所討論的函數(shù),這是很標(biāo)準(zhǔn)的流程。這樣的函數(shù)只能返回一個(gè)值,不過(guò),有時(shí)可以創(chuàng)建能產(chǎn)生一個(gè)序列的函數(shù)還是有幫助的。要做到這一點(diǎn),這種函數(shù)需要能夠“保存自己的工作”。

我說(shuō)過(guò),能夠“產(chǎn)生一個(gè)序列”是因?yàn)槲覀兊暮瘮?shù)并沒(méi)有像通常意義那樣返回。return隱含的意思是函數(shù)正將執(zhí)行代碼的控制權(quán)返回給函數(shù)被調(diào)用的地方。而"yield"的隱含意思是控制權(quán)的轉(zhuǎn)移是臨時(shí)和自愿的,我們的函數(shù)將來(lái)還會(huì)收回控制權(quán)。


在Python中,擁有這種能力的“函數(shù)”被稱(chēng)為生成器,它非常的有用。生成器(以及yield語(yǔ)句)最初的引入是為了讓程序員可以更簡(jiǎn)單的編寫(xiě)用來(lái)產(chǎn)生值的序列的代碼。 以前,要實(shí)現(xiàn)類(lèi)似隨機(jī)數(shù)生成器的東西,需要實(shí)現(xiàn)一個(gè)類(lèi)或者一個(gè)模塊,在生成數(shù)據(jù)的同時(shí)保持對(duì)每次調(diào)用之間狀態(tài)的跟蹤。引入生成器之后,這變得非常簡(jiǎn)單。

為了更好的理解生成器所解決的問(wèn)題,讓我們來(lái)看一個(gè)例子。在了解這個(gè)例子的過(guò)程中,請(qǐng)始終記住我們需要解決的問(wèn)題:生成值的序列。

注意:在Python之外,最簡(jiǎn)單的生成器應(yīng)該是被稱(chēng)為協(xié)程(coroutines)的東西。在本文中,我將使用這個(gè)術(shù)語(yǔ)。請(qǐng)記住,在Python的概念中,這里提到的協(xié)程就是生成器。Python正式的術(shù)語(yǔ)是生成器;協(xié)程只是便于討論,在語(yǔ)言層面并沒(méi)有正式定義。

例子:有趣的素?cái)?shù)

假設(shè)你的老板讓你寫(xiě)一個(gè)函數(shù),輸入?yún)?shù)是一個(gè)int的list,返回一個(gè)可以迭代的包含素?cái)?shù)1 的結(jié)果。

記住,迭代器(Iterable) 只是對(duì)象每次返回特定成員的一種能力。

你肯定認(rèn)為"這很簡(jiǎn)單",然后很快寫(xiě)出下面的代碼:
 

def get_primes(input_list):
  result_list = list()
  for element in input_list:
    if is_prime(element):
      result_list.append()
 
  return result_list
 
# 或者更好一些的...
 
def get_primes(input_list):
  return (element for element in input_list if is_prime(element))
 
# 下面是 is_prime 的一種實(shí)現(xiàn)...
 
def is_prime(number):
  if number > 1:
    if number == 2:
      return True
    if number % 2 == 0:
      return False
    for current in range(3, int(math.sqrt(number) + 1), 2):
      if number % current == 0:
        return False
    return True
  return False

上面 is_prime 的實(shí)現(xiàn)完全滿(mǎn)足了需求,所以我們告訴老板已經(jīng)搞定了。她反饋說(shuō)我們的函數(shù)工作正常,正是她想要的。

處理無(wú)限序列

噢,真是如此嗎?過(guò)了幾天,老板過(guò)來(lái)告訴我們她遇到了一些小問(wèn)題:她打算把我們的get_primes函數(shù)用于一個(gè)很大的包含數(shù)字的list。實(shí)際上,這個(gè)list非常大,僅僅是創(chuàng)建這個(gè)list就會(huì)用完系統(tǒng)的所有內(nèi)存。為此,她希望能夠在調(diào)用get_primes函數(shù)時(shí)帶上一個(gè)start參數(shù),返回所有大于這個(gè)參數(shù)的素?cái)?shù)(也許她要解決 Project Euler problem 10)。

我們來(lái)看看這個(gè)新需求,很明顯只是簡(jiǎn)單的修改get_primes是不可能的。 自然,我們不可能返回包含從start到無(wú)窮的所有的素?cái)?shù)的列表 (雖然有很多有用的應(yīng)用程序可以用來(lái)操作無(wú)限序列)??瓷先ビ闷胀ê瘮?shù)處理這個(gè)問(wèn)題的可能性比較渺茫。


在我們放棄之前,讓我們確定一下最核心的障礙,是什么阻止我們編寫(xiě)滿(mǎn)足老板新需求的函數(shù)。通過(guò)思考,我們得到這樣的結(jié)論:函數(shù)只有一次返回結(jié)果的機(jī)會(huì),因而必須一次返回所有的結(jié)果。得出這樣的結(jié)論似乎毫無(wú)意義;“函數(shù)不就是這樣工作的么”,通常我們都這么認(rèn)為的。可是,不學(xué)不成,不問(wèn)不知,“如果它們并非如此呢?”

想象一下,如果get_primes可以只是簡(jiǎn)單返回下一個(gè)值,而不是一次返回全部的值,我們能做什么?我們就不再需要?jiǎng)?chuàng)建列表。沒(méi)有列表,就沒(méi)有內(nèi)存的問(wèn)題。由于老板告訴我們的是,她只需要遍歷結(jié)果,她不會(huì)知道我們實(shí)現(xiàn)上的區(qū)別。
 

不幸的是,這樣做看上去似乎不太可能。即使是我們有神奇的函數(shù),可以讓我們從n遍歷到無(wú)限大,我們也會(huì)在返回第一個(gè)值之后卡?。?br />  

def get_primes(start):
  for element in magical_infinite_range(start):
    if is_prime(element):
      return element
假設(shè)這樣去調(diào)用get_primes:
 
def solve_number_10():
  # She *is* working on Project Euler #10, I knew it!
  total = 2
  for next_prime in get_primes(3):
    if next_prime < 2000000:
      total += next_prime
    else:
      print(total)
      return

顯然,在get_primes中,一上來(lái)就會(huì)碰到輸入等于3的,并且在函數(shù)的第4行返回。與直接返回不同,我們需要的是在退出時(shí)可以為下一次請(qǐng)求準(zhǔn)備一個(gè)值。

不過(guò)函數(shù)做不到這一點(diǎn)。當(dāng)函數(shù)返回時(shí),意味著全部完成。我們保證函數(shù)可以再次被調(diào)用,但是我們沒(méi)法保證說(shuō),“呃,這次從上次退出時(shí)的第4行開(kāi)始執(zhí)行,而不是常規(guī)的從第一行開(kāi)始”。函數(shù)只有一個(gè)單一的入口:函數(shù)的第1行代碼。
 
走進(jìn)生成器

這類(lèi)問(wèn)題極其常見(jiàn)以至于Python專(zhuān)門(mén)加入了一個(gè)結(jié)構(gòu)來(lái)解決它:生成器。一個(gè)生成器會(huì)“生成”值。創(chuàng)建一個(gè)生成器幾乎和生成器函數(shù)的原理一樣簡(jiǎn)單。

一個(gè)生成器函數(shù)的定義很像一個(gè)普通的函數(shù),除了當(dāng)它要生成一個(gè)值的時(shí)候,使用yield關(guān)鍵字而不是return。如果一個(gè)def的主體包含yield,這個(gè)函數(shù)會(huì)自動(dòng)變成一個(gè)生成器(即使它包含一個(gè)return)。除了以上內(nèi)容,創(chuàng)建一個(gè)生成器沒(méi)有什么多余步驟了。

生成器函數(shù)返回生成器的迭代器。這可能是你最后一次見(jiàn)到“生成器的迭代器”這個(gè)術(shù)語(yǔ)了, 因?yàn)樗鼈兺ǔ>捅环Q(chēng)作“生成器”。要注意的是生成器就是一類(lèi)特殊的迭代器。作為一個(gè)迭代器,生成器必須要定義一些方法(method),其中一個(gè)就是__next__()。如同迭代器一樣,我們可以使用next()函數(shù)來(lái)獲取下一個(gè)值。

為了從生成器獲取下一個(gè)值,我們使用next()函數(shù),就像對(duì)付迭代器一樣。

(next()會(huì)操心如何調(diào)用生成器的__next__()方法)。既然生成器是一個(gè)迭代器,它可以被用在for循環(huán)中。

每當(dāng)生成器被調(diào)用的時(shí)候,它會(huì)返回一個(gè)值給調(diào)用者。在生成器內(nèi)部使用yield來(lái)完成這個(gè)動(dòng)作(例如yield 7)。為了記住yield到底干了什么,最簡(jiǎn)單的方法是把它當(dāng)作專(zhuān)門(mén)給生成器函數(shù)用的特殊的return(加上點(diǎn)小魔法)。**

yield就是專(zhuān)門(mén)給生成器用的return(加上點(diǎn)小魔法)。

下面是一個(gè)簡(jiǎn)單的生成器函數(shù):
 

>>> def simple_generator_function():
>>>  yield 1
>>>  yield 2
>>>  yield 3
這里有兩個(gè)簡(jiǎn)單的方法來(lái)使用它:
 
>>> for value in simple_generator_function():
>>>   print(value)
1
2
3
>>> our_generator = simple_generator_function()
>>> next(our_generator)
1
>>> next(our_generator)
2
>>> next(our_generator)
3

魔法?

那么神奇的部分在哪里?我很高興你問(wèn)了這個(gè)問(wèn)題!當(dāng)一個(gè)生成器函數(shù)調(diào)用yield,生成器函數(shù)的“狀態(tài)”會(huì)被凍結(jié),所有的變量的值會(huì)被保留下來(lái),下一行要執(zhí)行的代碼的位置也會(huì)被記錄,直到再次調(diào)用next()。一旦next()再次被調(diào)用,生成器函數(shù)會(huì)從它上次離開(kāi)的地方開(kāi)始。如果永遠(yuǎn)不調(diào)用next(),yield保存的狀態(tài)就被無(wú)視了。

我們來(lái)重寫(xiě)get_primes()函數(shù),這次我們把它寫(xiě)作一個(gè)生成器。注意我們不再需要magical_infinite_range函數(shù)了。使用一個(gè)簡(jiǎn)單的while循環(huán),我們創(chuàng)造了自己的無(wú)窮串列。
 
def get_primes(number):
    while True:
        if is_prime(number):
            yield number
        number += 1

如果生成器函數(shù)調(diào)用了return,或者執(zhí)行到函數(shù)的末尾,會(huì)出現(xiàn)一個(gè)StopIteration異常。 這會(huì)通知next()的調(diào)用者這個(gè)生成器沒(méi)有下一個(gè)值了(這就是普通迭代器的行為)。這也是這個(gè)while循環(huán)在我們的get_primes()函數(shù)出現(xiàn)的原因。如果沒(méi)有這個(gè)while,當(dāng)我們第二次調(diào)用next()的時(shí)候,生成器函數(shù)會(huì)執(zhí)行到函數(shù)末尾,觸發(fā)StopIteration異常。一旦生成器的值用完了,再調(diào)用next()就會(huì)出現(xiàn)錯(cuò)誤,所以你只能將每個(gè)生成器的使用一次。下面的代碼是錯(cuò)誤的:

 

>>> our_generator = simple_generator_function()
>>> for value in our_generator:
>>>   print(value)
 
>>> # 我們的生成器沒(méi)有下一個(gè)值了...
>>> print(next(our_generator))
Traceback (most recent call last):
 File "<ipython-input-13-7e48a609051a>", line 1, in <module>
  next(our_generator)
StopIteration
 
>>> # 然而,我們總可以再創(chuàng)建一個(gè)生成器
>>> # 只需再次調(diào)用生成器函數(shù)即可
 
>>> new_generator = simple_generator_function()
>>> print(next(new_generator)) # 工作正常
1

因此,這個(gè)while循環(huán)是用來(lái)確保生成器函數(shù)永遠(yuǎn)也不會(huì)執(zhí)行到函數(shù)末尾的。只要調(diào)用next()這個(gè)生成器就會(huì)生成一個(gè)值。這是一個(gè)處理無(wú)窮序列的常見(jiàn)方法(這類(lèi)生成器也是很常見(jiàn)的)。

執(zhí)行流程

讓我們回到調(diào)用get_primes的地方:solve_number_10。
 

def solve_number_10():
  # She *is* working on Project Euler #10, I knew it!
  total = 2
  for next_prime in get_primes(3):
    if next_prime < 2000000:
      total += next_prime
    else:
      print(total)
      return

我們來(lái)看一下solve_number_10的for循環(huán)中對(duì)get_primes的調(diào)用,觀察一下前幾個(gè)元素是如何創(chuàng)建的有助于我們的理解。當(dāng)for循環(huán)從get_primes請(qǐng)求第一個(gè)值時(shí),我們進(jìn)入get_primes,這時(shí)與進(jìn)入普通函數(shù)沒(méi)有區(qū)別。

  •     進(jìn)入第三行的while循環(huán)
  •     停在if條件判斷(3是素?cái)?shù))
  •     通過(guò)yield將3和執(zhí)行控制權(quán)返回給solve_number_10

接下來(lái),回到insolve_number_10:

  •     for循環(huán)得到返回值3
  •     for循環(huán)將其賦給next_prime
  •     total加上next_prime
  •     for循環(huán)從get_primes請(qǐng)求下一個(gè)值

這次,進(jìn)入get_primes時(shí)并沒(méi)有從開(kāi)頭執(zhí)行,我們從第5行繼續(xù)執(zhí)行,也就是上次離開(kāi)的地方。
 

def get_primes(number):
  while True:
    if is_prime(number):
      yield number
    number += 1 # <<<<<<<<<<

最關(guān)鍵的是,number還保持我們上次調(diào)用yield時(shí)的值(例如3)。記住,yield會(huì)將值傳給next()的調(diào)用方,同時(shí)還會(huì)保存生成器函數(shù)的“狀態(tài)”。接下來(lái),number加到4,回到while循環(huán)的開(kāi)始處,然后繼續(xù)增加直到得到下一個(gè)素?cái)?shù)(5)。我們?cè)僖淮伟裯umber的值通過(guò)yield返回給solve_number_10的for循環(huán)。這個(gè)周期會(huì)一直執(zhí)行,直到for循環(huán)結(jié)束(得到的素?cái)?shù)大于2,000,000)。

更給力點(diǎn)

在PEP 342中加入了將值傳給生成器的支持。PEP 342加入了新的特性,能讓生成器在單一語(yǔ)句中實(shí)現(xiàn),生成一個(gè)值(像從前一樣),接受一個(gè)值,或同時(shí)生成一個(gè)值并接受一個(gè)值。

我們用前面那個(gè)關(guān)于素?cái)?shù)的函數(shù)來(lái)展示如何將一個(gè)值傳給生成器。這一次,我們不再簡(jiǎn)單地生成比某個(gè)數(shù)大的素?cái)?shù),而是找出比某個(gè)數(shù)的等比級(jí)數(shù)大的最小素?cái)?shù)(例如10, 我們要生成比10,100,1000,10000 ... 大的最小素?cái)?shù))。我們從get_primes開(kāi)始:

 

def print_successive_primes(iterations, base=10):
  # 像普通函數(shù)一樣,生成器函數(shù)可以接受一個(gè)參數(shù)
  
  prime_generator = get_primes(base)
  # 這里以后要加上點(diǎn)什么
  for power in range(iterations):
    # 這里以后要加上點(diǎn)什么
 
def get_primes(number):
  while True:
    if is_prime(number):
    # 這里怎么寫(xiě)?
 get_primes的后幾行需要著重解釋。yield關(guān)鍵字返回number的值,而像 other = yield foo 這樣的語(yǔ)句的意思是,"返回foo的值,這個(gè)值返回給調(diào)用者的同時(shí),將other的值也設(shè)置為那個(gè)值"。你可以通過(guò)send方法來(lái)將一個(gè)值”發(fā)送“給生成器。
 
def get_primes(number):
  while True:
    if is_prime(number):
      number = yield number
    number += 1

通過(guò)這種方式,我們可以在每次執(zhí)行yield的時(shí)候?yàn)閚umber設(shè)置不同的值?,F(xiàn)在我們可以補(bǔ)齊print_successive_primes中缺少的那部分代碼:
 

def print_successive_primes(iterations, base=10):
  prime_generator = get_primes(base)
  prime_generator.send(None)
  for power in range(iterations):
    print(prime_generator.send(base ** power))

這里有兩點(diǎn)需要注意:首先,我們打印的是generator.send的結(jié)果,這是沒(méi)問(wèn)題的,因?yàn)閟end在發(fā)送數(shù)據(jù)給生成器的同時(shí)還返回生成器通過(guò)yield生成的值(就如同生成器中yield語(yǔ)句做的那樣)。

第二點(diǎn),看一下prime_generator.send(None)這一行,當(dāng)你用send來(lái)“啟動(dòng)”一個(gè)生成器時(shí)(就是從生成器函數(shù)的第一行代碼執(zhí)行到第一個(gè)yield語(yǔ)句的位置),你必須發(fā)送None。這不難理解,根據(jù)剛才的描述,生成器還沒(méi)有走到第一個(gè)yield語(yǔ)句,如果我們發(fā)生一個(gè)真實(shí)的值,這時(shí)是沒(méi)有人去“接收”它的。一旦生成器啟動(dòng)了,我們就可以像上面那樣發(fā)送數(shù)據(jù)了。

綜述

在本系列文章的后半部分,我們將討論一些yield的高級(jí)用法及其效果。yield已經(jīng)成為Python最強(qiáng)大的關(guān)鍵字之一。現(xiàn)在我們已經(jīng)對(duì)yield是如何工作的有了充分的理解,我們已經(jīng)有了必要的知識(shí),可以去了解yield的一些更“費(fèi)解”的應(yīng)用場(chǎng)景。

不管你信不信,我們其實(shí)只是揭開(kāi)了yield強(qiáng)大能力的一角。例如,send確實(shí)如前面說(shuō)的那樣工作,但是在像我們的例子這樣,只是生成簡(jiǎn)單的序列的場(chǎng)景下,send幾乎從來(lái)不會(huì)被用到。下面我貼一段代碼,展示send通常的使用方式。對(duì)于這段代碼如何工作以及為何可以這樣工作,在此我并不打算多說(shuō),它將作為第二部分很不錯(cuò)的熱身。
 

import random
 
def get_data():
  """返回0到9之間的3個(gè)隨機(jī)數(shù)"""
  return random.sample(range(10), 3)
 
def consume():
  """顯示每次傳入的整數(shù)列表的動(dòng)態(tài)平均值"""
  running_sum = 0
  data_items_seen = 0
 
  while True:
    data = yield
    data_items_seen += len(data)
    running_sum += sum(data)
    print('The running average is {}'.format(running_sum / float(data_items_seen)))
 
def produce(consumer):
  """產(chǎn)生序列集合,傳遞給消費(fèi)函數(shù)(consumer)"""
  while True:
    data = get_data()
    print('Produced {}'.format(data))
    consumer.send(data)
    yield
 
if __name__ == '__main__':
  consumer = consume()
  consumer.send(None)
  producer = produce(consumer)
 
  for _ in range(10):
    print('Producing...')
    next(producer)

 
請(qǐng)謹(jǐn)記……

我希望您可以從本文的討論中獲得一些關(guān)鍵的思想:

  •     generator是用來(lái)產(chǎn)生一系列值的
  •     yield則像是generator函數(shù)的返回結(jié)果
  •     yield唯一所做的另一件事就是保存一個(gè)generator函數(shù)的狀態(tài)
  •     generator就是一個(gè)特殊類(lèi)型的迭代器(iterator)
  •     和迭代器相似,我們可以通過(guò)使用next()來(lái)從generator中獲取下一個(gè)值
  •     通過(guò)隱式地調(diào)用next()來(lái)忽略一些值

我希望這篇文章是有益的。如果您還從來(lái)沒(méi)有聽(tīng)說(shuō)過(guò)generator,我希望現(xiàn)在您可以理解它是什么以及它為什么是有用的,并且理解如何使用它。如果您已經(jīng)在某種程度上比較熟悉generator,我希望這篇文章現(xiàn)在可以讓您掃清對(duì)generator的一些困惑。

 

相關(guān)文章

  • matplotlib之pyplot模塊實(shí)現(xiàn)添加子圖subplot的使用

    matplotlib之pyplot模塊實(shí)現(xiàn)添加子圖subplot的使用

    這篇文章主要介紹了matplotlib之pyplot模塊實(shí)現(xiàn)添加子圖subplot的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • python re.match()用法相關(guān)示例

    python re.match()用法相關(guān)示例

    這篇文章主要介紹了python re.match()用法相關(guān)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Python下實(shí)現(xiàn)的RSA加密/解密及簽名/驗(yàn)證功能示例

    Python下實(shí)現(xiàn)的RSA加密/解密及簽名/驗(yàn)證功能示例

    這篇文章主要介紹了Python下實(shí)現(xiàn)的RSA加密/解密及簽名/驗(yàn)證功能,結(jié)合具體實(shí)例形式分析了Python中RSA加密、解密的實(shí)現(xiàn)方法及簽名、驗(yàn)證功能的使用技巧,需要的朋友可以參考下
    2017-07-07
  • 在Python中使用Mako模版庫(kù)的簡(jiǎn)單教程

    在Python中使用Mako模版庫(kù)的簡(jiǎn)單教程

    這篇文章主要介紹了在Python中使用Mako模版庫(kù)的簡(jiǎn)單教程,包括在Django或者Tornado框架中集成Mako的方法,需要的朋友可以參考下
    2015-04-04
  • Python?NumPy教程之二元計(jì)算詳解

    Python?NumPy教程之二元計(jì)算詳解

    二元運(yùn)算符作用于位,進(jìn)行逐位運(yùn)算。二元運(yùn)算只是組合兩個(gè)值以創(chuàng)建新值的規(guī)則。本文將為大家詳細(xì)講講Python?NumPy中的二元計(jì)算,需要的可以了解一下
    2022-08-08
  • python list count統(tǒng)計(jì)個(gè)數(shù)的實(shí)現(xiàn)

    python list count統(tǒng)計(jì)個(gè)數(shù)的實(shí)現(xiàn)

    這篇文章主要介紹了python list count統(tǒng)計(jì)個(gè)數(shù)的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • python基于chardet識(shí)別字符編碼的方法

    python基于chardet識(shí)別字符編碼的方法

    chardet?是一個(gè)流行的 Python 庫(kù),用于檢測(cè)文本文件的字符編碼,本文就來(lái)介紹一下python基于chardet識(shí)別字符編碼的方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-01-01
  • 在Python中使用poplib模塊收取郵件的教程

    在Python中使用poplib模塊收取郵件的教程

    這篇文章主要介紹了在Python中使用poplib模塊收取郵件的教程,代碼基于Python2.x版本,需要的朋友可以參考下
    2015-04-04
  • Python7個(gè)爬蟲(chóng)小案例詳解(附源碼)上篇

    Python7個(gè)爬蟲(chóng)小案例詳解(附源碼)上篇

    這篇文章主要介紹了Python7個(gè)爬蟲(chóng)小案例詳解(附源碼)上篇,本文章內(nèi)容詳細(xì),通過(guò)案例可以更好的理解爬蟲(chóng)的相關(guān)知識(shí),七個(gè)例子分為了三部分,本次為上篇,共有二道題,需要的朋友可以參考下
    2023-01-01
  • Pillow使用Image篇的使用

    Pillow使用Image篇的使用

    本文主要介紹了Pillow使用Image篇的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11

最新評(píng)論

祁门县| 开江县| 阳城县| 长乐市| 张家界市| 金山区| 大城县| 马公市| 西城区| 安福县| 永清县| 高邑县| 庄河市| 郁南县| 尼玛县| 平舆县| 防城港市| 犍为县| 宁德市| 深州市| 滁州市| 阿鲁科尔沁旗| 扎兰屯市| 苍山县| 固始县| 辛集市| 揭东县| 全州县| 石渠县| 塘沽区| 盘锦市| 唐山市| 罗定市| 五河县| 清水河县| 房产| 扎囊县| 道孚县| 东港市| 新竹市| 张家界市|