本文首發於知乎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編程
專欄目錄:目錄
版本說明:軟件及包版本說明