0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一些值得玩味的python代碼

python爬蟲知識分享 ? 來源:python爬蟲知識分享 ? 作者:python爬蟲知識分享 ? 2022-03-30 17:32 ? 次閱讀

選取了 6 個自己認(rèn)為值得玩味的 python 代碼,希望對正在學(xué)習(xí) python 的你有所幫助。

1、類有兩個方法,一個是 __new__,一個是 __init__,有什么區(qū)別,哪個會先執(zhí)行呢?

classtest(object):
def__init__(self):
print("test->__init__")

def__new__(cls):
print("test->__new__")
returnsuper().__new__(cls)

a=test()

運(yùn)行結(jié)果如下:

test->__new__
test->__init__

再來看另一個例子

classtest2(object):
def__init__(self):
print("test2->__init__")

def__new__(cls):
print("test2->__new__")
returnobject()

b=test2()

運(yùn)行結(jié)果如下:

test2->__new__

這里給出官方的解釋:__init__ 作用是類實例進(jìn)行初始化,第一個參數(shù)為 self,代表對象本身,可以沒有返回值。__new__ 則是返回一個新的類的實例,第一個參數(shù)是 cls 代表該類本身,必須有返回值。很明顯,類先實例化才能產(chǎn)能對象,顯然是 __new__ 先執(zhí)行,然后再 __init__,實際上,只要 __new__ 返回的是類本身的實例,它會自動調(diào)用 __init__ 進(jìn)行初始化。但是有例外,如果 __new__ 返回的是其他類的實例,則它不會調(diào)用當(dāng)前類的 __init__。下面我們分別輸出下對象 a 和對象 b 的類型:

print(type(a))
#

print(type(b))
#'object'>'__main__.test'>

可以看出,a 是 test 類的一個對象,而 b 就是 object 的對象。

參考文檔:

https://docs.python.org/3/reference/datamodel.html?highlight=__new__#object.__new__

2、map 函數(shù)返回的對象

map()函數(shù)第一個參數(shù)是 fun,第二個參數(shù)是一般是 list,第三個參數(shù)可以寫 list,也可以不寫,作用就是對列表中 list 的每個元素順序調(diào)用函數(shù) fun 。

>>>b=map(lambdax:x*x,[1,2,3])
>>>[iforiinb]
[1,4,9]
>>>[iforiinb]
[]
>>>

有沒有發(fā)現(xiàn),第二次輸出 b 中的元素時,發(fā)現(xiàn)變成空了。原因是 map() 函數(shù)返回的是一個迭代器,并用對返回結(jié)果使用了 yield,這樣做的目的在于節(jié)省內(nèi)存。
舉個例子:

#encoding:UTF-8
defyield_test(n):
foriinrange(n):
yieldcall(i)
#做一些其它的事情

defcall(i):
returni*2

#使用for循環(huán)
x=yield_test(5)
print([iforiinx])
print([iforiinx])

執(zhí)行結(jié)果為:

[0,2,4,6,8]
[]

這里如果不用 yield,那么在列表中的元素非常大時,將會全部裝入內(nèi)存,這是非常浪費(fèi)內(nèi)存的,同時也會降低效率。

3、正則表達(dá)式中 compile 是否多此一舉?

比如現(xiàn)在有個需求,對于文本

中國

,用正則匹配出標(biāo)簽里面的“中國”,其中 class 的類名是不確定的。有兩種方法,代碼如下:

>>>importre
>>>text='中國'
>>>#方法一
...
>>>re.findall('(.*)',text)
['中國']
>>>#方法二
...
>>>regex='(.*)'
>>>pattern=re.compile(regex)
>>>re.findall(pattern,text)
['中國']
>>>

這里為什么要用 compile 多寫兩行代碼呢?原因是 compile 將正則表達(dá)式編譯成一個對象,加快速度,并重復(fù)使用。

4、[[1,2],[3,4],[5,6]]一行代碼展開該列表,得出[1,2,3,4,5,6]

>>>[jforiin[[1,2],[3,4],[5,6]]forjini]
[1,2,3,4,5,6]
>>>

5、一行代碼將字符串 "->" 插入到 "abcdefg"中每個字符的中間

>>>"->".join("abcdef")
'a->b->c->d->e->f'
>>>

這里也建議多使用 os.path.join() 來拼接操作系統(tǒng)的文件路徑。

6、zip 函數(shù)

zip() 函數(shù)在運(yùn)算時,會以一個或多個序列(可迭代對象)做為參數(shù),返回一個元組的列表。同時將這些序列中并排的元素配對。zip() 參數(shù)可以接受任何類型的序列,同時也可以有兩個以上的參數(shù);當(dāng)傳入?yún)?shù)的長度不同時,zip 能自動以最短序列長度為準(zhǔn)進(jìn)行截取,獲得元組。

>>>a=[1,2]
>>>b=(3,4)
>>>zip(a,b)

>>>foriinzip(a,b):
...print(i)
...
(1,3)
(2,4)
>>>a="ab"
>>>b="xyz"
>>>foriinzip(a,b):
...print(i)
...
('a','x')
('b','y')
>>>objectat0x000001a20201aa08>

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4237

    瀏覽量

    61969
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4671

    瀏覽量

    67766
  • python
    +關(guān)注

    關(guān)注

    53

    文章

    4753

    瀏覽量

    84078
收藏 人收藏

    評論

    相關(guān)推薦

    提高嵌入式代碼質(zhì)量的一些方法

    的事情搞復(fù)雜,我希望這些文字能給迷惑中的人們指出一些正確的方向,讓他們少走一些彎路,基本做到一分耕耘一分收獲。
    的頭像 發(fā)表于 11-30 09:15 ?348次閱讀

    python軟件IDLE怎么打多行代碼

    用于編寫、編輯和運(yùn)行Python代碼的編輯器窗口。在IDLE中編寫多行代碼有幾種方法可以實現(xiàn)。 使用括號與換行符: 在IDLE中編寫多行代碼
    的頭像 發(fā)表于 11-29 15:00 ?3182次閱讀

    python shell怎么用

    Python Shell的使用方法、功能和一些常見的操作技巧。 Python Shell的啟動: Python Shell可以通過在命令行中輸入 p
    的頭像 發(fā)表于 11-29 14:36 ?863次閱讀

    python調(diào)用windows命令

    Windows命令,提供一些實際的示例和代碼。 首先,我們需要了解一些基本概念。Windows命令是種命令行界面(CLI),它允許用戶通過鍵入命令來與操作系統(tǒng)進(jìn)行交互。
    的頭像 發(fā)表于 11-29 14:34 ?827次閱讀

    python軟件怎么運(yùn)行代碼

    Python種高級編程語言,它被廣泛用于開發(fā)各種類型的應(yīng)用程序,從簡單的腳本到復(fù)雜的網(wǎng)絡(luò)應(yīng)用和機(jī)器學(xué)習(xí)模型。要運(yùn)行Python代碼,您需要
    的頭像 發(fā)表于 11-28 16:02 ?745次閱讀

    python如何換行而不運(yùn)行代碼

    和可讀性。 在Python中,可以使用兩個主要的方法進(jìn)行換行:使用反斜杠()和使用圓括號(())。 第種方式是使用反斜杠()來表示換行。在Python中,反斜杠是個轉(zhuǎn)義字符,它可以
    的頭像 發(fā)表于 11-24 09:50 ?2751次閱讀

    python代碼寫完后點(diǎn)哪個運(yùn)行

    當(dāng)你完成了編寫Python代碼后,你可以選擇多種方式來運(yùn)行它。下面是幾種常見的運(yùn)行代碼的方式: Python解釋器:Python
    的頭像 發(fā)表于 11-24 09:28 ?2806次閱讀

    python如何直循環(huán)代碼

    Python中,有幾種方法可以實現(xiàn)代碼的循環(huán)執(zhí)行。下面我將詳盡、詳實、細(xì)致地介紹這些方法和它們的使用情況。 使用while循環(huán): 在Python中,可以使用while循環(huán)來重復(fù)執(zhí)行
    的頭像 發(fā)表于 11-23 15:54 ?1596次閱讀

    python如何換行而不運(yùn)行代碼

    Python中,換行是種用來增加代碼的可讀性和組織性的方式。當(dāng)你在編寫Python代碼時,換行通常用于分隔不同的
    的頭像 發(fā)表于 11-22 10:52 ?1980次閱讀

    python怎樣運(yùn)行代碼

    討論Python代碼的運(yùn)行方式,包括解釋器、交互式環(huán)境和命令行。 Python代碼可以通過兩種主要的方式運(yùn)行:解釋執(zhí)行和編譯執(zhí)行。解釋執(zhí)行是指將源
    的頭像 發(fā)表于 11-22 10:31 ?987次閱讀

    分享一些SystemVerilog的coding guideline

    本文分享一些SystemVerilog的coding guideline。
    的頭像 發(fā)表于 11-22 09:17 ?579次閱讀
    分享<b class='flag-5'>一些</b>SystemVerilog的coding  guideline

    Vulture 可在Python程序中查找未使用的代碼

    一些無效代碼,此外,可能會將僅被隱式調(diào)用的代碼標(biāo)記為未使用。 盡管如此,Vulture對于提升代碼質(zhì)量來說可能是個非常有用的工具。 1.功
    的頭像 發(fā)表于 10-21 10:28 ?377次閱讀

    TinyDB :個純Python編寫的輕量級數(shù)據(jù)庫

    TinyDB 是個純 Python 編寫的輕量級數(shù)據(jù)庫,共只有1800行代碼,沒有外部依賴項。 TinyDB的目標(biāo)是降低小型 Python
    的頭像 發(fā)表于 10-21 10:22 ?730次閱讀

    單片機(jī)C代碼嵌套匯編的一些方法

    單片機(jī)C代碼嵌套匯編的一些方法
    的頭像 發(fā)表于 10-18 16:39 ?423次閱讀
    單片機(jī)C<b class='flag-5'>代碼</b>嵌套匯編的<b class='flag-5'>一些</b>方法

    Yapf:個格式化 Python 代碼的好幫手

    大部分人使用Python中的代碼格式化工具時都會選擇autopep8之類的工具,這些工具可能有定的局限性,比如不會重新格式化已經(jīng)符合 PEP8 的代碼。 而本文即將介紹的 Yapf,
    的頭像 發(fā)表于 10-17 11:08 ?631次閱讀
    Yapf:<b class='flag-5'>一</b>個格式化 <b class='flag-5'>Python</b> <b class='flag-5'>代碼</b>的好幫手