<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          分享幾個冷門Python技巧

          共 2429字,需瀏覽 5分鐘

           ·

          2021-02-06 19:17



          大家好,歡迎來到 Crossin的編程教室 !


          有很多文章介紹了Python中各種很酷的功能(如變量拆包、偏函數(shù)、枚舉可迭代對象等)。但說到Python時,還有很多東西可以談?wù)摗=裉齑蛩惴窒砦宜篮褪褂玫囊恍┨匦裕@些我在其他地方很少見人提到過。


          整理字符串輸入


          對用戶輸入進(jìn)行整理的問題幾乎適用于你編寫的所有程序。通常情況下,將字符轉(zhuǎn)換為小寫或大寫就足夠了,有時你可以使用Regex來完成這項工作,但對于復(fù)雜的情況來說,可能有更好的方法:


          在本例中,可以看到空白字符“\n”和“\t”已被單個空格替換,而“\r”已被完全刪除。這是一個簡單的例子,但是我們可以更進(jìn)一步,使用unicodedata包和它的combining()函數(shù)來生成并進(jìn)行映射,從而生成更大的重新映射表,我們可以使用它來刪除字符串中的所有重音符(注:英文中的'符號)


          對迭代器進(jìn)行切片


          如果嘗試對一個迭代器進(jìn)行切片,會得到一個TypeError,這說明生成器對象是不可下標(biāo)訪問的,但有一個簡單的解決方案可以解決這個問題:


          使用itertools.islice我們可以創(chuàng)建一個islice對象,它是一個會生成所需項的迭代器。需要注意的是,這將消耗slice開始之前的所有生成器項,以及islice對象中的所有項。


          跳過可迭代對象的開始部分


          有時必須處理那些以不想要的可變數(shù)量的行(如注釋)開始的文件。itertools再次為這個問題提供了簡單的解決方案:


          這代碼段只生成初始注釋部分之后的行。如果我們只想在可迭代對象的開頭跳過一些循環(huán)(這里是跳過開頭的行),并且不知道具體有多少時,那么這種方法是很有用的。

          只帶有關(guān)鍵字參數(shù)(kwargs)的函數(shù)


          在使用以下這樣的函數(shù)時,創(chuàng)建只接受關(guān)鍵字參數(shù)的函數(shù)來(強制)提供更多的清晰性是很有幫助的:


          正如所看到的,這可以通過在關(guān)鍵字參數(shù)之前放置單個*參數(shù)來輕松解決。如果我們把位置參數(shù)放在*參數(shù)之前,位置參數(shù)顯然也會存在。


          創(chuàng)建支持with語句的對象


          例如,我們都知道如何使用with語句來打開文件或獲取鎖,但是我們可以實現(xiàn)自己的with語句嗎? 當(dāng)然,我們可以使用__enter__和__exit__方法來實現(xiàn)上下文管理協(xié)議:



          這是在Python中實現(xiàn)上下文管理最常見的方法,但是還有更簡單的實現(xiàn)方法:


          上面的代碼片段使用contextmanager管理器裝飾器實現(xiàn)了內(nèi)容管理協(xié)議。在進(jìn)入with塊時,tag函數(shù)(在yield之前)的第一部分會被執(zhí)行,然后該with塊被執(zhí)行,最后,tag函數(shù)的其余部分會被執(zhí)行。


          使用__slots__節(jié)省內(nèi)存


          如果曾經(jīng)編寫過一個創(chuàng)建某個類的大量實例的程序,可能會注意到的程序會突然需要大量內(nèi)存。這是因為Python使用字典來表示類實例的屬性,這使得它的速度很快,但是內(nèi)存效率不高,這通常并不是一個問題。然而,如果它成為的程序的一個問題時,可以嘗試使用__slots__:


          這里的情況是,當(dāng)我們定義了__slots__屬性時,Python會使用小的固定大小的數(shù)組而不是字典來定義屬性,這大大減少了每個實例所需的內(nèi)存。使用__slots__也有一些缺點——我們不能聲明任何新的屬性,并且我們只能使用在__slots__上這些屬性。而且,帶有__slots__的類不能使用多重繼承。


          限制CPU和內(nèi)存的使用


          如果不想優(yōu)化的程序內(nèi)存或CPU使用,只想把它限制在某個固定大小的內(nèi)存上,那么Python也有一個這樣的庫來做到這一點:


          這里我們可以看到設(shè)置最大CPU運行時間和最大內(nèi)存使用限制的兩個選項。對于CPU限制,我們首先獲取特定資源(RLIMIT_CPU)的軟限制和硬限制,然后使用參數(shù)指定的秒數(shù)和前面檢索到的硬限制來設(shè)置它。最后,我們注冊信號,如果CPU時間超過限制,該信號會導(dǎo)致系統(tǒng)退出。對于內(nèi)存,我們再次檢索軟限制和硬限制,并使用帶有大小參數(shù)的setrlimit和檢索的硬限制來設(shè)置它。


          控制什么可以導(dǎo)入,什么不可以導(dǎo)入


          一些語言有非常明顯的導(dǎo)出成員(變量、方法、接口)的控制機制,例如Golang,其中只有以大寫字母開頭的成員會被導(dǎo)出。另一方面,在Python中,所有東西都可以被導(dǎo)出,除非我們使用__all__:


          根據(jù)上面的代碼片段,我們知道只有bar函數(shù)會被導(dǎo)出。同樣,我們可以讓__all__為空,這樣,當(dāng)我們從這個模塊導(dǎo)入的時候,任何東西都不會被導(dǎo)出,并且會導(dǎo)致AttributeError。


          實現(xiàn)比較運算符的簡單方式


          考慮到目前已經(jīng)有相當(dāng)多的比較操作符——__lt__ 、__le__ 、 __gt__ ?或 __ge___,因此,為一個類實現(xiàn)所有的比較操作符是相當(dāng)煩人的。但如果有更簡單的方法可以實現(xiàn)呢?functools.total_ordering就派上用場了:


          那么,這到底是怎么工作的呢?total_ordering裝飾器用于簡化實現(xiàn)類實例排序的過程。我們只需要定義__lt__和__eq__,它們是剩余操作的映射所需的最小值,裝飾器就會為我們填充空白。


          結(jié)論


          并不是所有這些特性在日常的Python編程中都是必需和有用的,但是它們中的一些可能會在某個時刻派上用場,而且它們還可能會簡化那些非常冗長和難以實現(xiàn)的任務(wù)。所有這些特性都是Python標(biāo)準(zhǔn)庫的一部分,雖然其中的一些看起來不是那么“標(biāo)準(zhǔn)”。所以當(dāng)你想用Python實現(xiàn)某種功能時,不妨先去標(biāo)準(zhǔn)庫里找找看。(即使標(biāo)準(zhǔn)庫里沒找到,那大概率也會有第三方庫提供。)

          英文原文:https://martinheinz.dev/blog/1

          作者:Martin Heinz
          譯者:測試

          _往期文章推薦_

          讓代碼更加pythonic的寫法




          瀏覽 39
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产精品久久久久久久久久乐趣播 | 官方啪啪网 | 欧美逼首页 | 日本高清视频一区二区三区 | 欧美日韩在线观看123 |