溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python代碼怎么寫

發(fā)布時間:2022-01-05 13:31:23 來源:億速云 閱讀:192 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“Python代碼怎么寫”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

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)用當前類的 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)在有個需求,對于文本

中國,用正則匹配出標簽里面的“中國”,其中 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() 來拼接操作系統(tǒng)的文件路徑。

6、zip 函數(shù)

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

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

“Python代碼怎么寫”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI