本文首發於知乎
python中下划線最常見的是,作為字符用於命名變量,但是不同於a b c
等字符,它有一些特殊的用法,有的是程序設計使然,有的是編程習慣約定俗成。
python中下划線主要使用於一下四個場景
- 表示最近輸出結果
- 表示沒用的變量
- 表示私有變量
- 前后雙下划線————類的魔術方法
1.表示最近輸出結果
在python交互模式下,_
可以表示一個特殊變量,指向最近輸出的結果
>>> a = 1
>>> a
1
>>> _
1
>>> _ + 1
2
>>> _ + 1
3
>>> c = _
>>> c
3
注意:如果_
變量被顯式賦值了,則_
就固定表示這個值,不會動態地表示最近輸出的結果
>>> a = 1
>>> a
1
>>> _
1
>>> _ = 2
>>> _
2
>>> a
1
>>> _
2
這一點可以應用與這樣的場景:寫了一段很長的代碼,一直調試得到了正確的值,最后要把這個代碼的運行結果賦值,就不用重新復制這段代碼了,只要a = _
即可。
2.表示沒用的變量
兩個元素的循環,如果只需要用一個元素,另一個元素最好用_
表示,說明這個元素不會被使用,增加代碼可讀性
i j
兩個元素都使用是這樣
>>> 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編程
專欄目錄:目錄
版本說明:軟件及包版本說明