Python中下劃線的作用-_.
ofollow,noindex">智慧決策上手系列教程索引
下劃線_是很神奇的一個符號,在Python裡有很多特殊作用。
表示剛才輸出的內容
用下劃線表示 最近一次輸出的內容 ,這個在很多教程問答中出現,請認真看下面這個:

image.png
使用 python3
命令進入python的直譯器狀態:
- 第一行輸入
s='a,b,c,d'
然後就回車第二行輸入_
,報錯not defined
未定義,說明剛才什麼也沒輸出(不是嗎?)。 - 然後輸入單個的
s
回車,輸出了字串'a,b,c,d'
,然後再執行s.split(',')
用逗號分割成為列表,成功! - 然後輸入
a=99
,再換行輸入_
,得到的仍然是剛才輸出的列表(不是字串啦!) - 再輸入
a
,回車輸出99
,這也把'_'變成了99
,然後+1
就會累加上去。 - 後來我們又建立了列表c,並輸出它,也就指定到了
_
,並且可以使用_[0:1]
取得第一個元素,說明下劃線不僅僅可以表示輸出的字串和數字,還可以是更復雜的東西。
注意:這種用法只能在命令列中使用,禁止在.py檔案或者Notebook中使用。
“我不在乎這個東西”
下劃線還可以當做 毫無意義的佔位符號 ,比如for迴圈的格式是 for n in range(0,100):
這裡的n有些時候根本沒有用,但又不能省略,那麼就可以用下劃線鄙視它一下:
for _ in range(10): print('哈')
這裡只是大笑十聲,那麼如果用n也毫無用處,但是下面這個情況就還是需要n的:
for n in range(10): print('第'+str(n)+'聲大笑')
這個用法可以擴充套件到元組構成的列表:
li=[('a',99),('b',100)] for _,v in li: print(v)
輸出99和100。如果變成 for v,_ in li:
就會輸出a和b。如果變成 for v in li
就會輸出兩個完整的元組('a',99)和('b',100)。
還有一些其他情況也可以用下劃線表示佔位:
a=(101,102,103,104,105) x,_,z,_,_=a print(x,z)
直接建立xz兩個變數,輸出101和103,我們不在乎其他的。
下面是更厲害的佔位:
a = (101, 102, 103, 104, 105) x, *_, m = a print(x, m)
星號是乘法,在這裡就把中間的幾個都佔位了,輸出101和105。
_abc 單下劃線開頭,表示私有不被匯出
單個下劃線開頭的名稱只能在當前檔案使用,不能匯出到其他檔案呼叫。
比如下面的gongkai物件可以在被別的檔案 import
這個檔案後呼叫,但 _siyou
卻不能被使用:
#a.py檔案 class gongkai(): _hide=99 vis=100 def _hideMethod(self): print('...') def visMethod(self): print('>>',self._hide,self.vis) class _siyou(): vv=88
#b.py檔案 from a import * print(gongkai) c=gongkai() print(c._hide,c.vis) c.visMethod() #print(_siyou)
把a.py和b.py放在一個檔案,命令列進入這個資料夾,執行 python3 b.py
會發現gongkai的都能正常顯示, _hide
的下劃線根本沒用,一樣可以輸出。但是整個 _siyou
都不能使用了。
下劃線開頭的頂級名稱會被import禁用。但其他的下劃線開頭的名稱作為私有,這就只是一種慣例而已。
但其實python根本不存在私有這個概念的,即使上面的__siyou也可以通過 from a import __siyou
正常匯入,只是*星號會忽略它。如果你再a.py裡面新增一行 __all__=['_siyou']
那麼 import *
之後,_siyou可以用,gongyou卻不可以用了。
abc_ 下劃線結尾,只是避免和系統自帶關鍵字重名
這也是一個慣例,比如不能 from=100
因為from是關鍵字,只能改為 from_=100
(如果你非要堅持用from這個詞的話)。
再比如下面這個s類是對str字串的擴充套件,避免了split命名重複:
class s(str): def split_(self): return 100 aa=s('a,b,c') print(aa.split_(),aa.split(','))
輸出100和 ['a', 'b', 'c']。
__abc 雙下劃線開頭,表示碾壓子類同樣的名稱
上面我們用s(str)擴充套件了str類,避免了split方法混淆,但如果真的混淆了,那麼該聽誰的呢?
如果在class a裡面使用了雙下劃線的名稱開頭,那麼不管以後怎麼擴充套件,都是它說了算,比如:
class A: __v=100 v=200 def p(self): print(self.__v,self.v) class B(A): __v=99 v=199 b=B() b.p() #輸出100,199
輸出100和199。v被子類B覆蓋了,但A把子類的__v給碾壓了。
abc雙下劃線開頭又結尾,表示這是系統需要的功能
這樣的名稱一般不會用到,但也不要去修改。比如 __init__
用來初始化類。
gettext的_是一個用於i18n/l18n的方法
i18n就是Internationalization(i+18個字母+n組成)國際化;l就是Localization本地化。
如果你 import getext
那麼就會有下劃線這個方法,其實就是 gettext.gettext
的縮寫。
1_000_000 分割數字,相當於數字中的千分位逗號
a=1_000_000
就是100萬, 1_0_0
就是100。
參考文章
智慧決策上手系列教程索引
每個人的智慧決策新時代
如果您發現文章錯誤,請不吝留言指正;
如果您覺得有用,請點喜歡;
如果您覺得很有用,歡迎轉載~
END