<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 技巧分享

          共 6368字,需瀏覽 13分鐘

           ·

          2020-06-12 23:20

          用它 5 分鐘以后,我放棄用了四年的 Flask

          閱讀本文大概需要 3 分鐘。


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

          ALL OR ANY

          Python 之所以成為這么一門受歡迎的語言一個(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ù)類型,但是有時(shí)候他們并不會(huì)像你所希望的那樣發(fā)揮作用。

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

          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ì)象,你是否曾想過可以直接看到其屬性?你也許可以試試以下的代碼:

          >>>?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ì)的,你沒看錯(cuò)!

          106572c9a1a33e0fc861aade2c2f8f3f.webp
          $?pip?install?emoji

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

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

          ?

          FROM_FUTURE_IMPORT

          Python 非常受歡迎,這也就導(dǎo)致了它的版本更新非常快,新的版本往往會(huì)有很多新特性。你不更新,就無法使用。

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

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

          GEOPY

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

          $?pip?install?geopy

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

          這里面同時(shí)還包含一個(gè)有用的“距離”類別。它能使用你選定的度量去計(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è)編程問題,覺得自己之前明明見過它的解決方法,但是卻記不起來具體是怎么樣的了。于是你想要去 StackOverflow 上找,但又不想離開這個(gè)終端。這個(gè)時(shí)候,你需要下面這個(gè)工具——howdoi

          $?pip?install?howdoi

          你所遇到的任何問題都可以問它,它會(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ì)象的信息,可以獲取類或函數(shù)的參數(shù)的信息,源碼,解析堆棧等等

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

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

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

          JEDI

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

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

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

          **KWARGS

          無論你學(xué)習(xí)那種語言,在這條學(xué)習(xí)之路上總有那么一些里程碑。在 Python 的編程學(xué)習(xí)中,理解神秘的 **kwargs 語法應(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ù),它需要能處理事先沒有定義過的參數(shù),那么就要用到前面提到的技巧了。

          LIST COMPREHENSIONS

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

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

          你可以通過這個(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, 如果你還沒有見過它,那么你可能會(huì)被這個(gè) Python newspaper 模塊所驚艷到。

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

          OPERATOR OVERLOADING(操作符重載)

          Python 支持操作符重載。“操作符重載”其實(shí)是個(gè)簡(jiǎn)單的概念,你是否曾經(jīng)想過為什么 Python 可以讓你使用“+”操作符來同時(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ù)打印出來的內(nèi)容會(huì)很丑陋。

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

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

          QUEUE(隊(duì)列)

          Python 支持多線程,它是通過標(biāo)準(zhǔn)庫中的 Queue 模塊來實(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ì)象的順序來檢索他們。“后進(jìn)先出”(LIFO)隊(duì)列可以讓你首先訪問最近添加的對(duì)象。最后,優(yōu)先隊(duì)列可以讓你根據(jù)他們排序的順序進(jìn)行檢索。

          __repr__

          當(dāng)你定義一個(gè)類的時(shí)候,提供一個(gè)方法可以返回用來表示該類對(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 庫讓你像調(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(類型提示)

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

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

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

          你還可以定義類型的別名:

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

          UUID

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

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

          UUID 是128位的全局唯一標(biāo)識(shí)符,通常由32字節(jié)的字符串表示。它可以保證時(shí)間和空間的唯一性,也稱為 GUID,全稱為:UUID —— Universally Unique IDentifier,Python 中叫 UUID。它通過 MAC 地址、時(shí)間戳、命名空間、隨機(jī)數(shù)、偽隨機(jī)數(shù)來保證生成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)境來滿足不同的版本需求。

          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,它可以讓用戶通過編程訪問到維基的詞條內(nèi)容。使用 Python 中的 wikipedia 模塊可以讓你以最便捷的方式訪問該 API。

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

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

          YAML

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

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

          $?pip?install?pyyaml

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

          import?yaml

          PyYAML 使你能夠儲(chǔ)存任何數(shù)據(jù)類型的 Python 對(duì)象,以及任何用戶定義類的實(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() 來“解壓”對(duì)象。

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


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




          推薦閱讀

          1

          用它 5 分鐘以后,我放棄用了四年的 Flask

          2

          流量就是這么省出來的

          3

          如何用 Hook 實(shí)時(shí)處理和保存 Ajax 數(shù)據(jù)

          4??

          教你輕松截獲 Selenium 中的 Ajax 數(shù)據(jù)


          瀏覽 55
          點(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>
                  天天射免费视频 | av手机久久久久久 | 2018天天日天天色 | 日本伦理一区二区三区 | 手机亚洲午夜成人网 |