分享6 個值得收藏的 Python 代碼

1、類有兩個方法,一個是 new,一個是 init,有什麼區別,哪個會先執行呢?

class test(object):​​​    def __init__(self):​​​        print("test -> __init__")​​​    def __new__(cls):​​​        print("test ->__new__")​​​        return super().__new__(cls)​​​​​a = test()

運行結果如下:

test ->__new__​​​test -> __init__

再來看另一個例子:

class test2(object):​​​    def __init__(self):​​​        print("test2 -> __init__")​​​ ​​​    def __new__(cls):​​​        print("test2 ->__new__")​​​        return object()​​​ ​​​b = test2()

運行結果如下:

test2 ->__new__

這裡給出官方的解釋:init 作用是類實例進行初始化,第一個參數為 self,代表對象本身,可以沒有返回值。new 則是返回一個新的類的實例,第一個參數是 cls 代表該類本身,必須有返回值。很明顯,類先實例化才能產能對象,顯然是 new 先執行,然後再 init,實際上,隻要 new 返回的是類本身的實例,它會自動調用 init 進行初始化。但是有例外,如果 new 返回的是其他類的實例,則它不會調用當前類的 init。

下面我們分別輸出下對象 a 和對象 b 的類型:

print( type(a))​​​#<class '__main__.test'>​ ​​print( type(b))​​​#<class 'object'>

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

2、map 函數返回的對象

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

>>> b=map(lambda x:x*x,[1,2,3])​​​>>> [i for i in b]​​​[1, 4, 9]​​​>>> [i for i in b]​​​[]​​​>>>

有沒有發現,第二次輸出 b 中的元素時,發現變成空瞭。原因是 map() 函數返回的是一個迭代器,並用對返回結果使用瞭 yield,這樣做的目的在於節省內存。

舉個例子:

#encoding:UTF-8  ​​​def yield_test(n):  ​​​    for i in range(n):  ​​​        yield call(i)  ​​​    #做一些其它的事情      ​​​ ​def call(i):  ​​​    return i*2  ​​​ ​​#使用for循環  ​​​x = yield_test(5)​​​print([i for i in x])​​​print([i for i in x])

執行結果為:

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

這裡如果不用 yield,那麼在列表中的元素非常大時,將會全部裝入內存,這是非常浪費內存的,同時也會降低效率。

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

比如現在有個需求,對於文本

中國,用正則匹配出標簽裡面的“中國”,其中 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 將正則表達式編譯成一個對象,加快速度,並重復使用。

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() 來拼接操作系統的文件路徑。

6、zip 函數

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

>>> a=[1,2]​​​>>> b=(3,4)​​​>>> zip(a,b)​​​<zip object at 0x000001A20201AA08>​​​>>> for i in zip(a,b):​​​...     print(i)​​​...​​​(1, 3

到此這篇關於分享6 個值得收藏的 Python 代碼的文章就介紹到這瞭,更多相關值得收藏的 Python 代碼內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: