轉載請注明出處️
作者:測試蔡坨坨
原文鏈接:caituotuo.top/7417a7f0.html
大家好,我是測試蔡坨坨。
今天,我們來聊一下Python命名那些事兒。
名為萬物之始,萬物始於無名,道生一,一生二,二生三,三生萬物。
“怎麼給變量命名?”
看似是一個非常基礎的內容,但還是有很多人在這個部分有一點迷茫。
命名常常被認為是編程中的細節問題,其重要性往往被低估。而所謂的工匠精神,往往體現在細節之處。
程序員在工作中有80%的時間都在閱讀和理解代碼,好的命名可以提高代碼的可讀性和表達力,詞不達意的命名則會讓人摸不著頭腦,增加不必要的思維開銷。
學好Python,從變量命名開始。
什麼是合法的變量名?
所謂合法的變量名就是Python解釋器能夠認識的變量名。
也是在編碼過程中必須遵循的規則,假設不遵守規則,程序就會報錯。
在Python中,一個合法的變量名是由字母
、下劃線
和數字
組成,並且第一個字符不能為數字。
在Python3中,對字母的定義其實是廣義的,你可以寫一個中文的變量名,也就是說你可以認為中文的這個字也算一種字母,但是一般來說不推薦使用中文變量名,因為有時候可能會由於一些編碼的原因產生一些莫名其妙的bug。
caituotuo_666 = "測試蔡坨坨" # √
# 666caituotuo_666 = "測試蔡坨坨" # × 數字開頭不合法
蔡坨坨 = "測試蔡坨坨" # √ 不推薦
合法的變量名顯然給了我們很大的操作空間,我們可以給變量取各式各樣、千奇百怪的名字。
什麼是好的變量名?
好的變量名是一種命名規范
,雖然不遵循命名規范,程序仍然可以運行,但是使用命名規范可以更加直觀地了解代碼所代表的含義,因此和Python開發人員用同一套命名系統就顯得很重要。
我們可以從內容和形式上判斷一個變量名的好壞。
從內容的角度就是這個變量名傳遞了多少有效信息,是否是一個有意義的變量名。有意義的變量名可以達到代碼即文檔的效果,有較高的可讀性,不需要借助注釋和文檔,代碼本身就能顯性地表達開發者的意圖。
例如以下三個變量:
n = "測試蔡坨坨"
name = "測試蔡坨坨"
username = "測試蔡坨坨"
但是,是不是有效信息越多越好,顯然並不是,我們還需要在有效信息和變量名長度上做取捨(這二者之間的平衡取決於項目本身和經驗積累),不應該為了展示更多的信息把變量名整的無限長,並不是一寸長一寸強,例如下面這個變量名就顯得過長了
student_system_login_username = "測試蔡坨坨"
在編碼過程中,一個變量名有時候需要用到兩個及以上的單詞,當這些單詞擠在一起時,我們很難去分清誰是誰。所以在形式上我們又有四種不同的變量名寫法:
lower_underscore = "測試蔡坨坨"
UPPER_UNDERSCORE = "測試蔡坨坨"
CamelCase = "測試蔡坨坨"
mixedCase = "測試蔡坨坨"
Naming Convention 命名規范
在PEP8裡面就有比較詳細的描述,原文地址:https://peps.python.org/pep-0008/#naming-conventions
Naming Convention的核心就是consistency
(一致性)
官方的意思大概是:
當你看到一個變量名的時候,如何快速分辨出是變量 or 常量 or 類 or 函數 or …?
就需要有一致性,也就是說好的變量不僅僅是讓你的程序變得好看,同時也能提高編程效率。
在Python中用到的格式有三種:lower_underscore、UPPER_UNDERSCORE、CamelCase,不會用到mixedCase。
lower_underscore:小寫字母跟下劃線(除了常量和類名,剩下的所有名字都是小寫下劃線,包括:module模塊
、variable變量
、function函數
、method方法
,他們在Python中通常被看做是一個變量被使用、被傳遞,所以他們的命名方式是一致的)
UPPER_UNDERSCORE:大寫字母跟下劃線,只用來表示常量
(其實在Python中並沒有真正的常量,更多的是一種約定,你別動我也別動,因此當你要表示常量的時候就可以用大寫下劃線,同時在Python標准庫中你看到大寫下劃線也就知道它是個常量)
CamelCase:駝峰命名中的大駝峰,通過首字母大寫的方式來區別單詞,只用來表示類
mixedCase:駝峰命名中的小駝峰,與大駝峰的區別就是第一個字母為小寫(不會在Python中使用)
_
在Python解釋器中,對單下劃線是有特殊感情的。
單下劃線也是Python中一個合法的變量名,通常被當做占位符使用
for _ in range(5):
print("測試蔡坨坨")
for i in range(5):
print("測試蔡坨坨")
從上面的程序可以看出,使用“_”比使用“i”表達出更多的信息,就是顯性地告訴別人這個變量是沒有用的。
_ 會指向你最後一次執行的表達式
使用單個下劃線來格式化變量的值,例如金額,通過這樣的寫法我們能夠更加易讀
total_value = 8_000_000_000
print(total_value) # 8000000000
在Python中,前置下劃線在語義和功能上都有可能對變量本身造成一定的影響。
_xx
單下劃線在Python中叫弱私有(weak “internal use” ),在語義上表達的是private性質,也就是友好給告訴別人這並不是開放的接口,當你使用from module import * 的時候它是不會import單下劃線開頭的變量的,但是如果你強制使用它還是可以使用的,因此叫做弱私有。
class MyClass:
def _get_name(self):
print("測試蔡坨坨")
def get_name(self):
print("測試蔡坨坨")
__xx
與弱私有相對應的就是強私有,在Python的class definition裡面用雙前置下劃線表示強私有,強行引用就會報錯,可以防止被子類重寫。
class MyClass:
def __get_name(self):
print("測試蔡坨坨")
其實強私有也是有辦法使用的,也就是防君子不妨小人,Python實際上是在class definition裡面對雙下劃線開頭的變量進行一個重命名,就是在雙下劃變量的前面加一個_class名
,如果打印的是obj._MyClass__get_name(),還是能正常運行的
xx_
我們知道Python中有很多關鍵詞,例如:class、def、return、pass……,他們都有特殊的定義和意義,所以我們在定義變量或方法的時候不可以使用它們來命名,比如以下代碼就是錯誤的:
# 錯誤示范
def my_func(pass):
class = 1
return class
如果我們就是想這樣定義名稱,為了區分,可以在後面添加一個下劃線(不過不建議這樣命名,雖然它是合法的,但是有那麼多名稱何必去定義關鍵詞相關的名稱呢)
def my_func(pass_):
class_ = 1
return class_
__xx__
dunderscore:double underscore
專門表示Python中的魔術函數magic method,都是一些Python內置好的一些函數,我們可以拿來就使用,例如:類的初始化方法__init__
、__call__
等
對於Python使用者來說就是不要用,自己定義的方法永遠不要用到這種形式(Never invent such names; only use them as documented.)
在起名的時候不要覆蓋Python中內置的方法(builtin method)
# 錯誤示范
list = [1, 2, 3, 4] # ×
dict = {"username": "測試蔡坨坨"} # ×
str = "測試蔡坨坨" # ×
在給文件起名的時候,也不要跟內置的module重名,例如:os.py、selenium.py、turtle.py,都是不可取的。
一.浮點數的計算 思考1:打印結果是什麼? a = 0.1 b = 0.2 c = 0.3 print(b == a + a) 思考2:打印結果是什麼? a = 0.1 b = 0.2 c = 0.3 ...
前言 我這個博客一直都是一些技術分享,show code的地方,我從來沒有寫過個人生活或者情感雜談,當然我也從來沒有談論過我對什麼東西的喜惡. 很多人喜歡噴XX語言,喜歡談論XX和YY的優缺,甚至湊了 ...
文件名全小寫,可使用下劃線 包應該是簡短的.小寫的名字.如果下劃線可以改善可讀性可以加入.如mypackage. 模塊與包的規范同.如mymodule. 類總是使用首字母大寫單詞串.如MyClass. ...
理解Python命名機制 本文最初發表於戀花蝶的博客(http://blog.csdn.net/lanphaday),歡迎轉載,但必須保留此聲明且不得用於商業目的.謝謝. 引子 我熱情地邀請大家猜測下 ...
python中雙下劃線的作用(1)所有以雙下劃線開頭的成員是私有的(2)python對於私有變量是會進行扎壓(mangling)的,扎壓規則是原始定義:class A(): __function ...
摘要: 你真的懂Redis的5種基本數據結構嗎?這些知識點或許你還需要看看. 本文分享自華為雲社區<你真的懂Redis的5種基本數據結構嗎?這些知識點或許你還需要看看>,作者:李子捌. 一 ...
你真的懂異常(Exception)嗎? 目錄 異常介紹 異常的特點 怎樣使用異常 處理異常的 try-catch-finally 捕獲異常的 Catch 塊 釋放資源的 Finally 塊 一.異常介 ...
你真的理解Python中MRO算法嗎? MRO(Method Resolution Order):方法解析順序. Python語言包含了很多優秀的特性,其中多重繼承就是其中之一,但是多重繼承會引發很多 ...
文件名全小寫,可使用下劃線 包應該是簡短的.小寫的名字.如果下劃線可以改善可讀性可以加入.如mypackage. 模塊與包的規范同.如mymodule. 類總是使用首字母大寫單詞串.如MyClass. ...
原文網址:http://www.jianshu.com/p/ad80d9443a92 支持原創,如需轉載, 請注明出處你是不是以為你真的懂For...in... ??哈哈哈哈, 我也碰到了這個報錯 . ...
本次筆記主要記錄LoadRunner腳本設計.場景設計和結果分析 1. 腳本設計 錄制模式 手工模式:插入步驟.手動編寫 1.1 腳本增強: ...
事件是特殊的委托 委托:第一個方法注冊用“=”,是賦值語法,因為要進行實例化,第二個方法注冊則用的是“+=” 修飾符應該public的時候public,應該private的時候private 事件 ...
Pinball xfause (命題人) 基准時間限制:1 秒 空間限制:262144 KB 分值: 20 Pinball的游戲界面由m+2行.n列組成.第一行在頂端.一個球會從第一行的某一列出發 ...
近期看一個音頻傳輸代碼時,對方采用了LinkedBlockingQueue為生產者.消費者模式,來支撐讀寫線程. 個人感覺非常不錯,因此也對這種方式進行總結,並梳理了一個基本的功能框架備用.主要兩點: ...
linux bin & sbin different flutter & $PATH http://blog.taylormcgann.com/2014/04/11/differenc ...
查看:tail -f /tmp/jack.txt 一:tee方法一.配置文件在服務器上的/etc/my.cnf中的[client]加入 tee =/tmp/client_mysql.log即可. 方法 ...
https://www.ludou.org/win7-ie-11-f12-bug.html 32位win7下載補丁:http://www.microsoft.com/zh-CN/download/de ...
給定 n 個非負整數 a1,a2,...,an,每個數代表坐標中的一個點 (i, ai) .在坐標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 (i, ai) 和 (i, 0).找出其中的兩條線, ...
1.skype通訊錄原理 對於skype客戶端的通訊錄同步,首先說說原理,通訊簿信息是從AD同步的skype前端服務器(每天1:30),在從前端服務器同步的客戶端(大概1小時內同步一次). skype ...
前言 最近在進行apache性能優化設置.在修改apache配置)文件之前需要備份原有的配置文件夾conf,這是網站架設的好習慣.以下的apache配置調優均是在red had的環境下進行的. htt ...