下劃線(_)在Python語言中有特殊作用,
在大多數編程語言中,下劃線是命名變數或者函式名稱時的連字符,但是,在Python語言中,不僅如此,如果你是一名Python程式員,對于諸如 _ in range(10) , __init__(self) 之類的下發肯定熟知,
本文將詳述下劃線(_)的使用方法,幫助初學者理解它,
在Python語言中,下劃線主要應用在如下5個方面:
- 在互動模式中,保存最近一個運算式的值
- 忽略某個值(“我不重要”)
- 給變數或者函式名稱賦予特殊含義
- 作為國際化或本地化的函式命名
- 在數字組成的值中作為分隔符
注意:不管你是為了Python就業還是興趣愛好,記住:專案開發經驗永遠是核心,如果你缺新專案練習或者沒有python精講教程,可以去小編的Python交流.裙 :七衣衣九七七巴而五(數字的諧音)轉換下可以找到了,里面很多新python教程專案,還可以跟老司機交流討教!
下面逐一闡述,
用在互動模式中
在Python互動模式總,如果呼叫_,會顯示最近的運算式的值,這個功能在標準的互動模式中都有,你也可以在其它Python互動式決議器中使用,
>>> 10
10
>>> _
10
>>> _ * 3
30
>>> _ * 20
600
復制代碼
表示忽略某個值
下劃線也可以用于表示要忽略某個值,如果你不需要某個值或者該值沒什么用,可以用下劃線作為相應的變數,
# Ignore a value when unpacking
x, _, y = (1, 2, 3)
# x = 1, y = 3
# Ignore the multiple values. It is called "Extended Unpacking" which is available in only Python 3.x
x, *_, y = (1, 2, 3, 4, 5)
# x = 1, y = 5
# Ignore the index
for _ in range(10):
do_something()
# Ignore a value of specific location
for _, val in list_of_tuple:
do_something()
復制代碼
給變數或者函式名稱賦予特殊含義
下劃線,最多的用途還是在命名中,PEP8是Python開發的公約,它約定了4中命名方式,
單下劃線開始
以單下劃線開始的變數、函式、方法、類名稱,意在宣告該物件私有化,按照此預訂,使用from module import *則無法將相應物件匯入,
然而,Python并不支持真正的私有化,所以我們不能強制某物件私有化,從其他模塊中也能直接呼叫它,有時候,我們會說這種私有化的物件是“內部使用的弱指示器”,
_internal_name = 'one_nodule' # private variable
_internal_version = '1.0' # private variable
class _Base: # private class
_hidden_factor = 2 # private variable
def __init__(self, price):
self._price = price
def _double_price(self): # private method
return self._price * self._hidden_factor
def get_double_price(self):
return self._double_price()
復制代碼
單下劃線結尾
為了避免與Python關鍵詞和其他內置物件名稱沖突,常常用這種命名方式,你可以不用它,
Tkinter.Toplevel(master, class_='ClassName') # Avoid conflict with 'class' keyword
list_ = List.objects.get(1) # Avoid conflict with 'list' built-in type
復制代碼
雙下劃線開始
這個超越一般約定的語法,當程式運行的時候,Python決議器會對以雙下劃開始的類中的屬性、方法名稱重命名,從而避免不同的類中同樣名稱之間的沖突,基本規則是在雙下劃線開始的名稱前面增加形如“_ClassName”樣式的前綴,
例如在類中有名為__method的方法,這個名字會被更名為_ClassName__method形式,
class A:
def _single_method(self):
pass
def __double_method(self): # for mangling
passclass B(A):
def __double_method(self): # for mangling
pass
復制代碼
如上面所述,以雙下劃線為開始命名的屬性和方法,我們不能用ClassName.__method方式呼叫,因此,有人把這作為真正的私有化,但是,這里不推薦這種私有化方式,依據就是Python的命名規則,
譯者注: 此處作者的觀點,僅供參考,_namne這種方式私有化,是約定的私有化,不是真正的私有化;__name這種方式真正實作了“私有化”,但在編程中是否采用,有不同的觀點,或者說對于“私有化”,在Python中是有不同理解的,
雙下劃線開始和結尾
這種約定用于特殊的變數或者方法——稱為“魔法方法”(譯者想:“magic method”,是不是翻譯成“魔幻方法”更好呢?這些特殊方法本來就讓學習者感到很“魔幻”,),比如__init__, __len__,這些方法提供了一些特殊的功能,比如__file__宣告本地的Python檔案,__eq__實作了運算式a == b,
一般的開發者,很少定義這些方法,但是,在定義類的時候__init__常常在實體化是被執行,
class A:
def __init__(self, a): # use special method '__init__' for initializing
self.a = a
def __custom__(self): # custom special method. you might almost do not use it
pass
復制代碼
作為國際化或本地化函式命名
這僅僅是一個約定,不是函式中的語法,因此,下劃線并不意味著國際化(i18n)或本地化(l10n),僅僅是因為這種習慣來自C語言中的習慣,
內置標準庫的模塊gettext,可以用于演示i18n/l10n,Python中的web開發框架Django也支持i18n/l10n,并應用此約定,
# see official docs : https://docs.python.org/3/library/gettext.html
import gettext
gettext.bindtextdomain('myapplication','/path/to/my/language/directory')
gettext.textdomain('myapplication')
_ = gettext.gettext
# ...
print(_('This is a translatable string.'))
復制代碼
數字之間的分隔符
這個功能是在Python3.6中加入的,用下劃線作為數字的分隔符,
dec_base = 1_000_000
bin_base = 0b_1111_0000
hex_base = 0x_1234_abcdprint(dec_base) # 1000000
print(bin_base) # 240
print(hex_base) # 305441741
復制代碼
結論
本文總結了Python中下換線的使用方法,有的方法或許對你是比較新鮮的,比如i18n/l10n,此前我就不知道,另外要注意:不管你是為了Python就業還是興趣愛好,記住:專案開發經驗永遠是核心,如果你缺新專案練習或者沒有python精講教程,可以去小編的Python交流.裙 :七衣衣九七七巴而五(數字的諧音)轉換下可以找到了,里面很多新python教程專案,還可以跟老司機交流討教!
本文的文字及圖片來源于網路加上自己的想法,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/158902.html
標籤:Python
上一篇:python學習筆記(三)
下一篇:python PEP8規范
