python學(xué)習(xí)筆記 | 了解Python的下劃線

下劃線(_)是特殊的Python編寫(xiě)

雖然下劃線(_)僅用于大多數(shù)語(yǔ)言中的蛇狀變量和函數(shù)(當(dāng)然,并非全部),但它在Python中有特殊含義。如果你是Python程序員,for _ in range(10) ,__init__(self)像語(yǔ)法可能很熟悉。

本文將解釋何時(shí)以及如何使用下劃線(_)并幫助您理解它。

在Python中使用下劃線有5種情況。

1、用于存儲(chǔ)解釋器中最后一個(gè)表達(dá)式的值。

2、為了忽略具體的值。(所謂的“我不在乎”)

3、賦予特殊的含義和功能以指稱易變的或功能的名稱。

4、用作'國(guó)際化(i18n)'或'本地化(l10n)'功能。

5、分開(kāi)數(shù)字字面值的數(shù)字。

我們來(lái)看看每個(gè)案例。

用于存儲(chǔ)解釋器中最后一個(gè)表達(dá)式的值

Python解釋器將最后一個(gè)表達(dá)式值存儲(chǔ)到名為'_'的特殊變量中。此功能首先在標(biāo)準(zhǔn)的CPython解釋器中使用,您也可以在其他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()

賦予變量和函數(shù)名稱的特殊含義

該下劃線可能是“命名”最常用的。作為Python約定指南的PEP8引入了以下4個(gè)命名案例。

_single_leading_underscore

該約定用于在模塊中聲明私有變量,函數(shù),方法和類。任何有這種慣例的東西都會(huì)被忽略from module import *。

但是,Python不支持真正的私有屬性,所以我們不能強(qiáng)制私有屬性,也可以直接從其他模塊中調(diào)用它。所以有時(shí)候我們會(huì)說(shuō)它是“內(nèi)部弱用指標(biāo)”。

_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()

single_trailing_underscore_

這個(gè)約定可以用來(lái)避免與Python關(guān)鍵字或內(nèi)建的沖突。你可能不會(huì)經(jīng)常使用它。

Tkinter.Toplevel(master, class_='ClassName') # Avoid conflict with 'class' keyword

list_ = List.objects.get(1) # Avoid conflict with 'list' built-in type

__double_leading_underscore

這是關(guān)于語(yǔ)法而不是約定。雙下劃線將 破壞類的屬性名稱以避免類之間的屬性名稱沖突。(所謂的“mangling”,這意味著編譯器或解釋

器用一些規(guī)則修改變量或函數(shù)名稱,而不是按照原樣使用) Python的mangling規(guī)則是將“_ClassName”添加到屬性名稱的前面用double

聲明下劃線。 也就是說(shuō),如果您在類中編寫(xiě)名為“__method”的方法,則名稱將以“_ClassName__method”格式變形。

class A:

????????def _single_method(self):

????????????????pass

????????def __double_method(self): # for mangling

????????????????pass

class B(A):

????????def __double_method(self): # for mangling

????????????????pass

由于使用雙下劃線命名的屬性會(huì)像上面那樣受到損壞,所以我們無(wú)法使用“ClassName .__ method”訪問(wèn)它。有時(shí)候,有些人會(huì)像使用這些功能的真正的私人用戶一樣使用它,但它不是私人的,也不是為此而推薦的。有關(guān)更多詳細(xì)信息,請(qǐng)閱讀Python命名。

__double_leading_and_trailing_underscore__

該約定用于特殊變量或方法(所謂的“魔術(shù)方法”),例如__init__,__len__。這些方法提供了特殊的語(yǔ)法功能或做特殊的事情。例如,__file__指示Python文件的位置,__eq__在執(zhí)行a == b表達(dá)式時(shí)執(zhí)行。

用戶當(dāng)然可以定制特殊的方法,這是非常罕見(jiàn)的情況,但往往可能會(huì)修改一些內(nèi)置的特殊方法。(例如,你應(yīng)該初始化這個(gè)類,__init__這個(gè)類將在一個(gè)類的實(shí)例被創(chuàng)建時(shí)首先執(zhí)行。)

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

隨著國(guó)際化(i18n)/本地化(l10n)的發(fā)揮

這只是約定,沒(méi)有任何語(yǔ)法功能。也就是說(shuō),下劃線并不意味著i18n / l10n,它只是一個(gè)將i18n / l10n綁定到下劃線變量的約定來(lái)自C約定。

內(nèi)置的庫(kù)gettext這是國(guó)際化/本地化采用了這種約定,并且Django的是Python的Web框架支持國(guó)際化/本地化還引入和采用了這種約定。

# 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.'))

分開(kāi)數(shù)字字面值的數(shù)字

該功能是在Python 3.6中添加的。它用于使用下劃線來(lái)分隔數(shù)字的數(shù)字以提高可讀性。

dec_base = 1_000_000

bin_base = 0b_1111_0000

hex_base = 0x_1234_abcd

print(dec_base) # 1000000

print(bin_base) # 240

print(hex_base) # 305441741

結(jié)論

到目前為止,我們已經(jīng)介紹了Python 的下劃線。雖然我是一名Python程序員,但在寫(xiě)這篇文章之前,我并不了解他們中的一些東西。尤其是,i18n / l10n對(duì)我來(lái)說(shuō)是非常新的。

和我一樣,我希望你能從這篇文章中獲得關(guān)于下劃線的一些有用的知識(shí)。


python一起學(xué)習(xí)

接下來(lái),我將介紹更多關(guān)于Python的有趣內(nèi)容。謝謝。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容