python中下劃線的使用

本文首發於知乎python

python中下劃線最多見的是,做爲字符用於命名變量,可是不一樣於a b c等字符,它有一些特殊的用法,有的是程序設計使然,有的是編程習慣約定俗成。 編程

python中下劃線主要使用於一下四個場景ruby

  • 表示最近輸出結果
  • 表示沒用的變量
  • 表示私有變量
  • 先後雙下劃線————類的魔術方法

1.表示最近輸出結果app

在python交互模式下,_能夠表示一個特殊變量,指向最近輸出的結果函數

>>> a = 1
>>> a
1
>>> _
1
>>> _ + 1
2
>>> _ + 1
3
>>> c = _
>>> c
3
複製代碼

注意:若是_變量被顯式賦值了,則_就固定表示這個值,不會動態地表示最近輸出的結果spa

>>> a = 1
>>> a
1
>>> _
1
>>> _ = 2
>>> _
2
>>> a
1
>>> _
2
複製代碼

這一點能夠應用與這樣的場景:寫了一段很長的代碼,一直調試獲得了正確的值,最後要把這個代碼的運行結果賦值,就不用從新複製這段代碼了,只要a = _便可。設計

2.表示沒用的變量調試

兩個元素的循環,若是隻須要用一個元素,另外一個元素最好用_表示,說明這個元素不會被使用,增長代碼可讀性code

i j兩個元素都使用是這樣orm

>>> l = ['a', 'b', 'c']
>>> for i, j in enumerate(l):
... print(i, j)
...
0 a
1 b
2 c
複製代碼

若是咱們只要用索引i,而j不用,正常是這樣

>>> l = ['a', 'b', 'c']
>>> for i, j in enumerate(l):
... print(i)
...
0
1
2
複製代碼

可是j不使用最好不要命名爲j,而是用_代替

>>> l = ['a', 'b', 'c']
>>> for i, _ in enumerate(l):
... print(i)
...
0
1
2
複製代碼

這種用法的更多例子以下

(1)

>>> l = ['a', 'b', 'c']
>>> # 打印和 l 相同長度數量的 1
... for _ in enumerate(l):
... print(1)
...
1
1
1
複製代碼

(2)

>>> a = [1,2,3,4]
>>> _, *b, _ = a
>>> b
[2, 3]
複製代碼

(3)

>>> a, _ = 'abc,mn'.split(',')
>>> a
複製代碼

_其實只是一個變量,你能夠爲本身規定一個專門用來當垃圾桶的變量,好比用__。讓_仍然能夠表示最近輸出變量值(第一條),固然也能夠用a之類的,只是_是你們都能看懂的,a就只有本身能看懂。

3.表示私有變量

上面兩點都是_做爲變量單獨使用,這裏是_做爲變量名第一個字符出現,表示私有變量,不但願被訪問

>>> class Dog:
... def _walk(self):
... print('i am walking')
...
... def __sleep(self):
... print('i am sleeping')
...
... def run(self):
... self._walk()
... print('i am running')
... self.__sleep()
...
>>> a = Dog()
>>> a.run()
i am walking
i am running
i am sleeping
>>> a._walk()
i am walking
>>> a.__sleep()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Dog' object has no attribute '__sleep'
複製代碼

在類中帶有_或者__前綴的函數(屬性也是)是私有的,最好只在類中其餘函數裏面調用,不要讓實例直接調用。___的差異在於,_前綴的最好不要調用,可是想調用也沒什麼問題,而__前綴的則不能調用。

這一點在模塊中也有體現,好比導入模塊中全部變量

from somemodule import *
複製代碼

不會把以_開頭的變量導入,具體例子見這裏

4.先後雙下劃線————類的魔術方法

定義類時,一些帶有雙下劃線開頭且結尾的方法是特殊的,它們能夠用於實現特殊的功能,舉例以下

>>> class Myclass:
... def __init__(self, name, age):
... self.name = name
... self.age = age
...
... def __len__(self):
... return self.age
...
>>> bob = Myclass('Bob', 20)
>>> bob.name
'Bob'
>>> len(bob)
20
>>> bob.__dict__
{'name': 'Bob', 'age': 20}
複製代碼

類裏定義的__init____len__都是魔術方法,這些名稱都是特殊的,前者專門用於定義類的屬性,而定義後者則指定了len函數做用於這個對象會返回什麼樣的結果,對字符串使用len會返回字符數量就是由於字符串這個類裏定義了__len__。另外,還有一些沒有定義的變量如__dict__也是能夠調用的,魔術方法的詳情見這裏

歡迎關注個人知乎專欄

專欄主頁:python編程

專欄目錄:目錄

版本說明:軟件及包版本說明

相關文章
相關標籤/搜索