<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 奇淫技巧!

          共 6536字,需瀏覽 14分鐘

           ·

          2022-02-16 22:32

          原文:https://medium.freecodecamp.org/an-a-z-of-useful-python-tricks-b467524ee747


          作者 Peter Gleeson 是一名數(shù)據(jù)科學(xué)家,日常工作幾乎離不 python。一路走來(lái),他積累了不少有用的技巧和 tips,現(xiàn)在就將這些技巧分享給大家。這些技巧將根據(jù)其首字母按 A-Z 的順序進(jìn)行展示。

          ALL OR ANY

          Python 之所以成為這么一門(mén)受歡迎的語(yǔ)言一個(gè)原因是它的可讀性和表達(dá)能力非常強(qiáng)。Python 也因此經(jīng)常被調(diào)侃為“可執(zhí)行的偽代碼”。不信你看:

          x?=?[True,?True,?False]
          if?any(x):
          ????print("At?least?one?True")
          if?all(x):
          ????print("Not?one?False")
          if?any(x)?and?not?all(x):
          ????print("At?least?one?True?and?one?False")

          BASHPLOTIB

          你想要在控制臺(tái)繪圖嘛?

          $?pip?install?bashplotlib

          現(xiàn)在,你的控制臺(tái)中就可以有圖了

          COLLECTIONS

          Python 有一些很棒的默認(rèn)數(shù)據(jù)類(lèi)型,但是有時(shí)候他們并不會(huì)像你所希望的那樣發(fā)揮作用。

          幸運(yùn)的是,Python 標(biāo)準(zhǔn)庫(kù)提供了 collection 模塊。它讓你可以使用更為多樣數(shù)據(jù)類(lèi)型。

          from?collections?import?OrderedDict,?Counter
          #?Remembers?the?order?the?keys?are?added!
          x?=?OrderedDict(a=1,?b=2,?c=3)
          #?Counts?the?frequency?of?each?character
          y?=?Counter("Hello?World!")

          DIR

          面對(duì)一個(gè) Python 對(duì)象,你是否曾想過(guò)可以直接看到其屬性?你也許可以試試以下的代碼:

          >>>?dir()
          >>>?dir("Hello?World")
          >>>?dir(dir)

          這是運(yùn)行 Python 的時(shí)候一個(gè)非常有用的功能,用于動(dòng)態(tài)探索你所使用的對(duì)象和模塊。更多詳情,可以查看這里:https://docs.python.org/3/library/functions.html#dir

          EMOJI

          對(duì)的,你沒(méi)看錯(cuò)!


          $?pip?install?emoji

          用 python 來(lái)創(chuàng)建表情包,你也可以。

          from?emoji?import?emojize
          print(emojize(":thumbs_up:"))

          ??

          FROM_FUTURE_IMPORT

          Python 非常受歡迎,這也就導(dǎo)致了它的版本更新非??欤碌陌姹就鶗?huì)有很多新特性。你不更新,就無(wú)法使用。

          然而,不要害怕。future 模塊可以讓你導(dǎo)入未來(lái)版本的功能。有點(diǎn)像時(shí)空穿梭有木有!

          from?__future__?import?print_function
          print("Hello?World!")

          GEOPY

          對(duì)于程序猿來(lái)說(shuō)地理可能是一個(gè)非常有挑戰(zhàn)性的領(lǐng)域。但是,geopy 模塊則讓它變得非常簡(jiǎn)單。

          $?pip?install?geopy

          它通過(guò)提取一系列不同地理編碼服務(wù)的 api 來(lái)工作,讓你能夠獲得一個(gè)地方的完整街道地址、緯度、經(jīng)度,甚至海拔。

          這里面同時(shí)還包含一個(gè)有用的“距離”類(lèi)別。它能使用你選定的度量去計(jì)算了兩個(gè)地點(diǎn)之間的距離。

          from?geopy?import?GoogleV3
          place?=?"221b?Baker?Street,?London"
          location?=?GoogleV3().geocode(place)
          print(location.address)
          print(location.location)

          HOWDOI

          有時(shí)候你碰到了一個(gè)編程問(wèn)題,覺(jué)得自己之前明明見(jiàn)過(guò)它的解決方法,但是卻記不起來(lái)具體是怎么樣的了。于是你想要去 StackOverflow 上找,但又不想離開(kāi)這個(gè)終端。這個(gè)時(shí)候,你需要下面這個(gè)工具——howdoi

          $?pip?install?howdoi

          你所遇到的任何問(wèn)題都可以問(wèn)它,它會(huì)盡他所能給你返回一個(gè)答案。

          $?howdoi?vertical?align?css
          $?howdoi?for?loop?in?java
          $?howdoi?undo?commits?in?git

          需要注意的是——它只從 StackOverflow 最頂端的答案中抓取代碼。所以它給你返回的不總是最有用的信息…

          $?howdoi?exit?vim

          INSPECT

          Python 的 inspect 模塊用于收集 Python 對(duì)象的信息,可以獲取類(lèi)或函數(shù)的參數(shù)的信息,源碼,解析堆棧等等

          下方的代碼樣例使用了 inspect.getsource() 來(lái)打印它自身的源碼。同樣還使用了 inspect.getmodule() 來(lái)打印定義了 inspect.getmodule() 的模塊。最后一行代碼則是打印了本行代碼所在的行號(hào)。在本例中,就是 4 。

          import?inspect
          print(inspect.getsource(inspect.getsource))
          print(inspect.getmodule(inspect.getmodule))
          print(inspect.currentframe().f_lineno)

          inspect 模塊可以有效地讓你知道你的代碼是如何工作的,你也可以利用它來(lái)完成一些個(gè)人的源碼。

          JEDI

          Jedi 庫(kù)是一個(gè)代碼自動(dòng)補(bǔ)齊和靜態(tài)分析的庫(kù)。它可以使你更快更高效地書(shū)寫(xiě)代碼。

          除非你在開(kāi)發(fā)自己的編輯器,否則你可能會(huì)非常喜歡將 Jedi 作為自己的編輯插件。

          你可能已經(jīng)正在使用 Jedi 而只是沒(méi)發(fā)現(xiàn)。IPython 項(xiàng)目就是利用 Jedi 來(lái)實(shí)現(xiàn)其自動(dòng)補(bǔ)全功能。

          **KWARGS

          無(wú)論你學(xué)習(xí)那種語(yǔ)言,在這條學(xué)習(xí)之路上總有那么一些里程碑。在 Python 的編程學(xué)習(xí)中,理解神秘的 **kwargs 語(yǔ)法應(yīng)該算是一個(gè)重要的里程碑。

          雙星“**”放在字典的前面可以讓你將字典的內(nèi)容作為命名參數(shù)傳遞給函數(shù)。字典的鍵是參數(shù)的名字,鍵的值作為參數(shù)的值傳遞給函數(shù)。如下所示:

          dictionary?=?{"a":?1,?"b":?2}
          def?someFunction(a,?b):
          ????print(a?+?b)
          ????return
          #?these?do?the?same?thing:
          someFunction(**dictionary)
          someFunction(a=1,?b=2)

          當(dāng)你想要?jiǎng)?chuàng)建一個(gè)函數(shù),它需要能處理事先沒(méi)有定義過(guò)的參數(shù),那么就要用到前面提到的技巧了。

          LIST COMPREHENSIONS

          List comprehensions(列表推導(dǎo)式)

          列表推導(dǎo)式可以說(shuō)是我最喜歡的 Python 技巧之一。這種表達(dá)式可以讓你寫(xiě)出像自然語(yǔ)言一樣易于理解并且還很簡(jiǎn)潔的代碼。

          你可以通過(guò)這個(gè)鏈接了解更多關(guān)于列表推導(dǎo)式的用法。地址:https://www.learnpython.org/en/List_Comprehensions

          numbers?=?[1,2,3,4,5,6,7]
          evens?=?[x?for?x?in?numbers?if?x?%?2?is?0]
          odds?=?[y?for?y?in?numbers?if?y?not?in?evens]
          cities?=?['London',?'Dublin',?'Oslo']
          def?visit(city):
          ????print("Welcome?to?"+city)
          for?city?in?cities:
          ????visit(city)

          MAP

          Python 有許多非常有用的內(nèi)置函數(shù)。其中一個(gè)就是 map()——特別是和 lambda 函數(shù)相結(jié)合的時(shí)候。

          x?=?[1,?2,?3]
          y?=?map(lambda?x?:?x?+?1?,?x)
          #?prints?out?[2,3,4]
          print(list(y))

          在這個(gè)例子中,map() 對(duì) x 中的每一個(gè)元素都應(yīng)用了一個(gè)簡(jiǎn)單的 lambda 函數(shù)。它會(huì)返回一個(gè) map 對(duì)象,這個(gè)對(duì)象可以被轉(zhuǎn)化成可迭代對(duì)象,如列表或者元組。

          NEWSPAPER3K

          newspaper3k, 如果你還沒(méi)有見(jiàn)過(guò)它,那么你可能會(huì)被這個(gè) Python newspaper 模塊所驚艷到。

          它可以讓你檢索到一系列國(guó)際領(lǐng)先出版物中的新聞和相關(guān)的元數(shù)據(jù)。你可以檢索圖片、文本和作者名。它甚至有一些內(nèi)置的自然語(yǔ)言處理功能。所以,如果你正在考慮使用 BeautifulSoup 或其他自制的爬蟲(chóng)庫(kù)來(lái)應(yīng)用于你的下一個(gè)項(xiàng)目。那么,省省時(shí)間和精力吧,你其實(shí)只需要 $ pip install newspaper3k。

          OPERATOR OVERLOADING(操作符重載)

          Python 支持操作符重載。“操作符重載”其實(shí)是個(gè)簡(jiǎn)單的概念,你是否曾經(jīng)想過(guò)為什么 Python 可以讓你使用“+”操作符來(lái)同時(shí)實(shí)現(xiàn)加法和連接字符串?這就是操作符重載在發(fā)揮作用。

          你可以定義使用 Python 標(biāo)準(zhǔn)操作符符號(hào)的對(duì)象,這可以讓你在特定的環(huán)境中使用特定的對(duì)象,就像下方的例子一樣。

          class?Thing:
          ????def?__init__(self,?value):
          ????????self.__value?=?value
          ????def?__gt__(self,?other):
          ????????return?self.__value?>?other.__value
          ????def?__lt__(self,?other):
          ????????return?self.__value?something?=?Thing(100)
          nothing?=?Thing(0)
          #?True
          something?>?nothing
          #?False
          something?#?Error
          something?+?nothing

          PPRINT

          Python 的默認(rèn) print 函數(shù)可以滿足日常的輸出任務(wù),但如果要打印更大的、嵌套式的對(duì)象,那么使用默認(rèn)的 print 函數(shù)打印出來(lái)的內(nèi)容會(huì)很丑陋。

          這個(gè)時(shí)候我們就需要 pprint 了,它可以讓復(fù)雜的結(jié)構(gòu)型對(duì)象以可讀性更強(qiáng)的格式顯示。這對(duì)于經(jīng)常要面對(duì)非普通數(shù)據(jù)結(jié)構(gòu)的 Python 開(kāi)發(fā)者來(lái)說(shuō)是必不可少的工具。

          import?requests
          import?pprint
          url?=?'https://randomuser.me/api/?results=1'
          users?=?requests.get(url).json()
          pprint.pprint(users)

          QUEUE(隊(duì)列)

          Python 支持多線程,它是通過(guò)標(biāo)準(zhǔn)庫(kù)中的 Queue 模塊來(lái)實(shí)現(xiàn)的。這個(gè)模塊可以讓你實(shí)現(xiàn)隊(duì)列數(shù)據(jù)結(jié)構(gòu)。這種數(shù)據(jù)結(jié)構(gòu)可以讓你根據(jù)特定的規(guī)則添加和檢索條目。

          “先進(jìn)先出”(FIFO)隊(duì)列可以讓你按照添加對(duì)象的順序來(lái)檢索他們?!昂筮M(jìn)先出”(LIFO)隊(duì)列可以讓你首先訪問(wèn)最近添加的對(duì)象。最后,優(yōu)先隊(duì)列可以讓你根據(jù)他們排序的順序進(jìn)行檢索。

          __repr__

          當(dāng)你定義一個(gè)類(lèi)的時(shí)候,提供一個(gè)方法可以返回用來(lái)表示該類(lèi)對(duì)象的可打印字符串會(huì)非常有用。例如:

          >>>?file?=?open('file.txt',?'r')
          >>>?print(file)
          'file.txt',?mode?'r'?at?0x10d30aaf0>

          這使得 debug 更加方便,具體的定義方式如下:

          class?someClass:
          ????def?__repr__(self):
          ????????return?""
          someInstance?=?someClass()
          #?prints?
          print(someInstance)

          sh

          sh 庫(kù)讓你像調(diào)用方法那樣調(diào)用系統(tǒng)中的命令。

          import?sh
          sh.pwd()
          sh.mkdir('new_folder')
          sh.touch('new_file.txt')
          sh.whoami()
          sh.echo('This?is?great!')

          TYPE HINT(類(lèi)型提示)

          Python 是一種動(dòng)態(tài)類(lèi)型語(yǔ)言。當(dāng)你定義變量、函數(shù)、類(lèi)別的時(shí)候,你不需要指定數(shù)據(jù)的類(lèi)型。這可以大大提升你的開(kāi)發(fā)速度,但也是有代價(jià)的。你可能會(huì)因?yàn)橐粋€(gè)簡(jiǎn)單的輸入問(wèn)題而導(dǎo)致運(yùn)行出錯(cuò)。

          在 Python3.5 之后,這就不是問(wèn)題了,在定義函數(shù)的時(shí)候你可以自主選擇要不要提供類(lèi)型提示。

          def?addTwo(x?:?Int)?->?Int:
          ????return?x?+?2

          你還可以定義類(lèi)型的別名:

          from?typing?import?List
          Vector?=?List[float]
          Matrix?=?List[Vector]
          def?addMatrix(a?:?Matrix,?b?:?Matrix)?->?Matrix:
          ??result?=?[]
          ??for?i,row?in?enumerate(a):
          ????result_row?=[]
          ????for?j,?col?in?enumerate(row):
          ??????result_row?+=?[a[i][j]?+?b[i][j]]
          ????result?+=?[result_row]
          ??return?result
          x?=?[[1.0,?0.0],?[0.0,?1.0]]
          y?=?[[2.0,?1.0],?[0.0,?-2.0]]
          z?=?addMatrix(x,?y)

          雖然不是強(qiáng)制性的,類(lèi)型注釋可以讓你的代碼理解起來(lái)更加簡(jiǎn)單。它們也允許你使用類(lèi)型檢測(cè)工具在運(yùn)行之前捕獲這些零散的類(lèi)型錯(cuò)誤。如果你正在從事大型、復(fù)雜的項(xiàng)目,那么類(lèi)型注釋也許會(huì)非常有幫助

          UUID

          通過(guò) Python 標(biāo)準(zhǔn)庫(kù)中的 uuid 模塊,可以快速并簡(jiǎn)單地生成統(tǒng)一的唯一ID(又稱(chēng)UUID).

          import?uuid
          user_id?=?uuid.uuid4()
          print(user_id)

          UUID 是128位的全局唯一標(biāo)識(shí)符,通常由32字節(jié)的字符串表示。它可以保證時(shí)間和空間的唯一性,也稱(chēng)為 GUID,全稱(chēng)為:UUID —— Universally Unique IDentifier,Python 中叫 UUID。它通過(guò) MAC 地址、時(shí)間戳、命名空間、隨機(jī)數(shù)、偽隨機(jī)數(shù)來(lái)保證生成ID的唯一性。

          VRITUAL ENVIRONMENTS

          這可能是我最喜歡的 Python技巧 了。你可能經(jīng)常要處理不止一個(gè) Python 項(xiàng)目,不幸的是,有時(shí)候不同項(xiàng)目會(huì)依賴不同的Python版本。這個(gè)時(shí)候,你應(yīng)該在系統(tǒng)里安裝哪個(gè) Python 版本呢?

          幸運(yùn)的是,Python 可以支持建立不同的虛擬環(huán)境來(lái)滿足不同的版本需求。

          python?-m?venv?my-project
          source?my-project/bin/activate
          pip?install?all-the-modules?

          現(xiàn)在你可以在一臺(tái)機(jī)器上安裝和運(yùn)行各個(gè)獨(dú)立版本的 Python。太棒了!

          WIKIPEDIA

          Wikipedia 有一個(gè)很棒的 API,它可以讓用戶通過(guò)編程訪問(wèn)到維基的詞條內(nèi)容。使用 Python 中的 wikipedia 模塊可以讓你以最便捷的方式訪問(wèn)該 API。

          import?wikipedia
          result?=?wikipedia.page('freeCodeCamp')
          print(result.summary)
          for?link?in?result.links:
          ????print(link)

          與真實(shí)站點(diǎn)一樣,該模塊支持多種語(yǔ)言、頁(yè)面消除歧義、隨機(jī)頁(yè)面檢索,甚至還有 donate() 方法。

          YAML

          YAML 是 “YAML 不是一種標(biāo)記語(yǔ)言”的外語(yǔ)縮寫(xiě)。它是一個(gè)數(shù)據(jù)格式語(yǔ)言,是 JSON 的父集。和 JSON 不同的是,它可以存儲(chǔ)更復(fù)雜的對(duì)象,并且可以引用自身的元素。你還可以寫(xiě)注釋?zhuān)@讓 YAML 特別適合于書(shū)寫(xiě)配置文件。

          PyYAML 模塊可以讓你使用 Python 調(diào)用 YAML。使用下列語(yǔ)句安裝:

          $?pip?install?pyyaml

          然后導(dǎo)入到項(xiàng)目中:

          import?yaml

          PyYAML 使你能夠儲(chǔ)存任何數(shù)據(jù)類(lèi)型的 Python 對(duì)象,以及任何用戶定義類(lèi)的實(shí)例。

          ZIP

          最后一個(gè)技巧也非???。你是否曾想要讓兩個(gè)列表中的元素逐個(gè)映射,組合成字典?那么你應(yīng)該使用 zip。

          keys?=?['a',?'b',?'c']
          vals?=?[1,?2,?3]
          zipped?=?dict(zip(keys,?vals))

          內(nèi)置函數(shù) zip() 接收若干可迭代對(duì)象,然后返回一個(gè)由多個(gè)元組組成的列表。每個(gè)元組根據(jù)輸入對(duì)象的位置索引對(duì)其元素進(jìn)行分組。還可以使用 *zip() 來(lái)“解壓”對(duì)象。

          python 大法好,掌握這些小的技巧,助你在 python 大神的道路上,披荊斬棘,所向披靡。

          各位伙伴們好,詹帥本帥搭建了一個(gè)個(gè)人博客和小程序,匯集各種干貨和資源,也方便大家閱讀,感興趣的小伙伴請(qǐng)移步小程序體驗(yàn)一下哦!(歡迎提建議)

          推薦閱讀


          牛逼!Python常用數(shù)據(jù)類(lèi)型的基本操作(長(zhǎng)文系列第①篇)

          牛逼!Python的判斷、循環(huán)和各種表達(dá)式(長(zhǎng)文系列第②篇)

          牛逼!Python函數(shù)和文件操作(長(zhǎng)文系列第③篇)

          牛逼!Python錯(cuò)誤、異常和模塊(長(zhǎng)文系列第④篇)


          瀏覽 69
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  天天操网 | 亚洲第一中文字幕网 | 99观看在线视频 | 操屄网 | 成人影音先锋AV免费电影 |