分享6 個值得收藏的 Python 代碼
1、類有兩個方法,一個是 new,一個是 init,有什么區(qū)別,哪個會先執(zhí)行呢?
class test(object):??? ? ?def __init__(self):??? ? ? ? ?print("test -> __init__")??? ? ?def __new__(cls):??? ? ? ? ?print("test ->__new__")??? ? ? ? ?return super().__new__(cls)?????a = test()
運行結(jié)果如下:
test ->__new__???test -> __init__
再來看另一個例子:
class test2(object):??? ? ?def __init__(self):??? ? ? ? ?print("test2 -> __init__")??? ??? ? ?def __new__(cls):??? ? ? ? ?print("test2 ->__new__")??? ? ? ? ?return object()??? ???b = test2()
運行結(jié)果如下:
test2 ->__new__
這里給出官方的解釋:init
作用是類實例進行初始化,第一個參數(shù)為 self,代表對象本身,可以沒有返回值。new 則是返回一個新的類的實例,第一個參數(shù)是 cls 代表該類本身,必須有返回值。很明顯,類先實例化才能產(chǎn)能對象,顯然是 new
先執(zhí)行,然后再 init
,實際上,只要 new 返回的是類本身的實例,它會自動調(diào)用 init 進行初始化。但是有例外,如果 new 返回的是其他類的實例,則它不會調(diào)用當(dāng)前類的 init。
下面我們分別輸出下對象 a 和對象 b 的類型:
print( type(a))???#<class '__main__.test'>? ??print( type(b))???#<class 'object'>
可以看出,a 是 test 類的一個對象,而 b 就是 object
的對象。
2、map 函數(shù)返回的對象
map()
函數(shù)第一個參數(shù)是 fun,第二個參數(shù)是一般是 list,第三個參數(shù)可以寫 list,也可以不寫,作用就是對列表中 list 的每個元素順序調(diào)用函數(shù) fun
。
>>> b=map(lambda x:x*x,[1,2,3])???>>> [i for i in b]???[1, 4, 9]???>>> [i for i in b]???[]???>>>
有沒有發(fā)現(xiàn),第二次輸出 b 中的元素時,發(fā)現(xiàn)變成空了。原因是 map()
函數(shù)返回的是一個迭代器,并用對返回結(jié)果使用了 yield,這樣做的目的在于節(jié)省內(nèi)存。
舉個例子:
#encoding:UTF-8 ????def yield_test(n): ???? ? ?for i in range(n): ???? ? ? ? ?yield call(i) ???? ? ?#做一些其它的事情 ? ? ???? ?def call(i): ???? ? ?return i*2 ???? ??#使用for循環(huán) ????x = yield_test(5)???print([i for i in x])???print([i for i in x])
執(zhí)行結(jié)果為:
[0, 2, 4, 6, 8]??? []
這里如果不用 yield
,那么在列表中的元素非常大時,將會全部裝入內(nèi)存,這是非常浪費內(nèi)存的,同時也會降低效率。
3、正則表達式中 compile 是否多此一舉?
比如現(xiàn)在有個需求,對于文本
中國,用正則匹配出標(biāo)簽里面的“中國”,其中 class 的類名是不確定的。
有兩種方法,代碼如下:
>>> import re??>>> text = '<div class="nam">中國</div>'???>>> #方法一???...???>>> re.findall('<div class=".*">(.*)</div>',text)???['中國']???>>> #方法二???...???>>> regex='<div class=".*">(.*)</div>'???>>> pattern = re.compile(regex)???>>> re.findall(pattern,text)???['中國']???>>>
這里為什么要用 compile
多寫兩行代碼呢? 原因是 compile
將正則表達式編譯成一個對象,加快速度,并重復(fù)使用。
4、[[1,2],[3,4],[5,6]]一行代碼展開該列表,得出[1,2,3,4,5,6]
>>> [j for i in [[1,2],[3,4],[5,6]] for j in i]???[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ù)在運算時,會以一個或多個序列(可迭代對象)做為參數(shù),返回一個元組的列表。同時將這些序列中并排的元素配對。zip()
參數(shù)可以接受任何類型的序列,同時也可以有兩個以上的參數(shù);當(dāng)傳入?yún)?shù)的長度不同時,zip
能自動以最短序列長度為準(zhǔn)進行截取,獲得元組。
>>> a=[1,2]???>>> b=(3,4)???>>> zip(a,b)???<zip object at 0x000001A20201AA08>???>>> for i in zip(a,b):???... ? ? print(i)???...???(1, 3
到此這篇關(guān)于分享6 個值得收藏的 Python
代碼的文章就介紹到這了,更多相關(guān)值得收藏的 Python 代碼內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。