選取了 6 個自己認為值得玩味的 python 代碼,希望對正在學習 python 的你有所幫助。
1、類有兩個方法,一個是 __new__,一個是 __init__,有什么區別,哪個會先執行呢?
classtest(object):
def__init__(self):
print("test->__init__")
def__new__(cls):
print("test->__new__")
returnsuper().__new__(cls)
a=test()
運行結果如下:
test->__new__
test->__init__
再來看另一個例子
classtest2(object):
def__init__(self):
print("test2->__init__")
def__new__(cls):
print("test2->__new__")
returnobject()
b=test2()
運行結果如下:
test2->__new__
這里給出官方的解釋:__init__ 作用是類實例進行初始化,第一個參數為 self,代表對象本身,可以沒有返回值。__new__ 則是返回一個新的類的實例,第一個參數是 cls 代表該類本身,必須有返回值。很明顯,類先實例化才能產能對象,顯然是 __new__ 先執行,然后再 __init__,實際上,只要 __new__ 返回的是類本身的實例,它會自動調用 __init__ 進行初始化。但是有例外,如果 __new__ 返回的是其他類的實例,則它不會調用當前類的 __init__。下面我們分別輸出下對象 a 和對象 b 的類型:
print(type(a))
#
print(type(b))
#'object'>'__main__.test'>
可以看出,a 是 test 類的一個對象,而 b 就是 object 的對象。
參考文檔:
https://docs.python.org/3/reference/datamodel.html?highlight=__new__#object.__new__
2、map 函數返回的對象
map()函數第一個參數是 fun,第二個參數是一般是 list,第三個參數可以寫 list,也可以不寫,作用就是對列表中 list 的每個元素順序調用函數 fun 。
>>>b=map(lambdax:x*x,[1,2,3])
>>>[iforiinb]
[1,4,9]
>>>[iforiinb]
[]
>>>
有沒有發現,第二次輸出 b 中的元素時,發現變成空了。原因是 map() 函數返回的是一個迭代器,并用對返回結果使用了 yield,這樣做的目的在于節省內存。
舉個例子:
#encoding:UTF-8
defyield_test(n):
foriinrange(n):
yieldcall(i)
#做一些其它的事情
defcall(i):
returni*2
#使用for循環
x=yield_test(5)
print([iforiinx])
print([iforiinx])
執行結果為:
[0,2,4,6,8]
[]
這里如果不用 yield,那么在列表中的元素非常大時,將會全部裝入內存,這是非常浪費內存的,同時也會降低效率。
3、正則表達式中 compile 是否多此一舉?
比如現在有個需求,對于文本
中國
,用正則匹配出標簽里面的“中國”,其中 class 的類名是不確定的。有兩種方法,代碼如下:
>>>importre
>>>text='中國'
>>>#方法一
...
>>>re.findall('(.*)',text)
['中國']
>>>#方法二
...
>>>regex='(.*)'
>>>pattern=re.compile(regex)
>>>re.findall(pattern,text)
['中國']
>>>
這里為什么要用 compile 多寫兩行代碼呢?原因是 compile 將正則表達式編譯成一個對象,加快速度,并重復使用。
4、[[1,2],[3,4],[5,6]]一行代碼展開該列表,得出[1,2,3,4,5,6]
>>>[jforiin[[1,2],[3,4],[5,6]]forjini]
[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)
>>>foriinzip(a,b):
...print(i)
...
(1,3)
(2,4)
>>>a="ab"
>>>b="xyz"
>>>foriinzip(a,b):
...print(i)
...
('a','x')
('b','y')
>>>objectat0x000001a20201aa08>
審核編輯:湯梓紅
-
函數
+關注
關注
3文章
4363瀏覽量
63770 -
代碼
+關注
關注
30文章
4875瀏覽量
69952 -
python
+關注
關注
56文章
4821瀏覽量
85779
發布評論請先 登錄
相關推薦
在i.MX RT 1176上正常運行代碼時與使用IAR調試代碼時存在一些奇怪的差異,為什么?
創建了用于OpenVINO?推理的自定義C++和Python代碼,從C++代碼中獲得的結果與Python代碼不同是為什么?
使用Python實現xgboost教程
華為云 Flexus X 實例下的場景體驗——小企業使用 Python 語言——超迅速搭建簡單公網 API 接口服務

Python中dict支持多個key的方法
使用Python進行串口通信的案例
一些常見的動態電路

分享一些常見的電路

評論