python中下划線的使用


本文首發於知乎

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編程

專欄目錄:目錄

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM