<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>

          6 個值得玩味的 Python 代碼

          共 2489字,需瀏覽 5分鐘

           ·

          2022-06-06 17:20

          ↑?關(guān)注 + 星標(biāo)?,每天學(xué)Python新技能

          后臺回復(fù)【大禮包】送你Python自學(xué)大禮包

          先選取了 6 個自己認(rèn)為值得玩味的 python 代碼,希望對正在學(xué)習(xí) 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()

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

          test?->__new__
          test?->?__init__

          再來看另一個例子

          class?test2(object):
          ????def?__init__(self):
          ????????print("test2?->?__init__")

          ????def?__new__(cls):
          ????????print("test2?->__new__")
          ????????return?object()

          b?=?test2()

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

          test2?->__new__

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

          print(?type(a))
          #

          print(?type(b))
          #

          可以看出,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(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)存,這是非常浪費(fèi)內(nèi)存的,同時也會降低效率。

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

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

          中國

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


          >>>?import?re
          >>>?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]

          >>>?[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ù)在運(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)
          0x000001A20201AA08>
          >>>?for?i?in?zip(a,b):
          ...?????print(i)
          ...
          (1,?3)
          (2,?4)
          >>>?a="ab"
          >>>?b="xyz"
          >>>?for?i?in?zip(a,b):
          ...?????print(i)
          ...
          ('a',?'x')
          ('b',?'y')
          >>>



          1. 知乎熱問:國家何時整治程序員的高薪現(xiàn)象?

          2. 最新泛955不加班的公司名單

          3. 10個有趣的 Python 高級腳本,建議收藏!

          4. 最有用的25個 Matplotlib圖(含Python代碼模板)


          瀏覽 41
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(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>
                  久久精品伦理 | 99久久精品免费看国产四区 | 国产精品拍拍视频 | 可以看的免费黄色片 | 国产精品第八页 |