先選取了 6 個自己認為值得玩味的 python代碼颂砸,希望對正在學習 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()
運行結果如下:
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 先執(zhí)行,然后再 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]
[]
>>>
有沒有發(fā)現锦爵,第二次輸出 b 中的元素時,發(fā)現變成空了奥裸。原因是 map() 函數返回的是一個迭代器险掀,并用對返回結果使用了 yield,這樣做的目的在于節(jié)省內存湾宙。
舉個例子:
#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í)行結果為:
[0, 2, 4, 6, 8]
[]
這里如果不用 yield樟氢,那么在列表中的元素非常大時冈绊,將會全部裝入內存,這是非常浪費內存的埠啃,同時也會降低效率死宣。
3、正則表達式中 compile 是否多此一舉碴开?
比如現在有個需求毅该,對于文本<div class="nam">中國</div>,用正則匹配出標簽里面的“中國”潦牛,其中 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 函數
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)
(2, 4)
>>> a="ab"
>>> b="xyz"
>>> for i in zip(a,b):
... print(i)
...
('a', 'x')
('b', 'y')
本次分享就到這啦俱尼,看到點個贊再走吧