在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Python工匠是什么?變量和代碼質(zhì)量

馬哥Linux運維 ? 來源:未知 ? 作者:李倩 ? 2018-05-08 14:25 ? 次閱讀

Python 工匠』是什么?

我一直覺得編程某種意義上是一門『手藝』,因為優(yōu)雅而高效的代碼,就如同完美的手工藝品一樣讓人賞心悅目。

在雕琢代碼的過程中,有大工程:比如應(yīng)該用什么架構(gòu)、哪種設(shè)計模式。也有更多的小細節(jié),比如何時使用異常(Exceptions)、或怎么給變量起名。那些真正優(yōu)秀的代碼,正是由無數(shù)優(yōu)秀的細節(jié)造就的。

『Python 工匠』這個系列文章,是我的一次小小嘗試。它專注于分享 Python 編程中的一些偏『小』的東西。希望能夠幫到每一位編程路上的匠人。

變量和代碼質(zhì)量

作為『Python 工匠』系列文章的第一篇,我想先談?wù)?『變量(Variables)』。因為如何定義和使用變量,一直都是學習任何一門編程語言最先要掌握的技能之一。

變量用的好或不好,和代碼質(zhì)量有著非常重要的聯(lián)系。在關(guān)于變量的諸多問題中,為變量起一個好名字尤其重要。

如何為變量起名

在計算機科學領(lǐng)域,有一句著名的格言(俏皮話):

There are only two hard things in Computer Science: cache invalidation and naming things. 在計算機科學領(lǐng)域只有兩件難事:緩存過期 和 給東西起名字

— Phil Karlton

第一個『緩存過期問題』的難度不用多說,任何用過緩存的人都會懂。至于第二個『給東西起名字』這事的難度,我也是深有體會。在我的職業(yè)生涯里,度過的作為黑暗的下午之一,就是坐在顯示器前抓耳撓腮為一個新項目起一個合適的名字。

編程時起的最多的名字,還數(shù)各種變量。給變量起一個好名字很重要,因為好的變量命名可以極大的提高代碼整體可讀性。

下面幾點,是我總結(jié)的為變量起名時,最好遵守的基本原則。

1. 變量名要有描述性,不能太寬泛

在可接受的長度范圍內(nèi),變量名能把它所指向的內(nèi)容描述的越精確越好。所以,盡量不要用那些過于寬泛的詞來作為你的變量名:

GOOD:day_of_week,hosts_to_reboot,expired_cards

BAD:day,host,cards,temp

2. 變量名最好讓人能猜出類型

老司機們都知道,Python 是一門動態(tài)類型語言,它(至少在PEP 484出現(xiàn)前)沒有變量類型聲明。所以當你看到一個變量時,除了通過上下文猜測,沒法輕易知道它是什么類型。

不過,人們對于變量名和變量類型的關(guān)系,通常會有一些直覺上的約定,我把它們總結(jié)在了下面。

『什么樣的名字會被當成 bool 類型?』

布爾類型變量的最大特點是:它只存在兩個可能的值『是』或『不是』。所以,用is、has等非黑即白的詞修飾的變量名,會是個不錯的選擇。原則就是:讓讀到變量名的人覺得這個變量只會有『是』或『不是』兩種值。

下面是幾個不錯的示例:

is_superuser:『是否超級用戶』,只會有兩種值:是/不是

has_error:『有沒有錯誤』,只會有兩種值:有/沒有

allow_vip:『是否允許 VIP』,只會有兩種值:允許/不允許

use_msgpack:『是否使用 msgpack』,只會有兩種值:使用/不使用

debug:『是否開啟調(diào)試模式』,被當做 bool 主要是因為約定俗成

『什么樣的名字會被當成 int/float 類型?』

人們看到和數(shù)字相關(guān)的名字,都會默認他們是 int/float 類型,下面這些是比較常見的:

釋義為數(shù)字的所有單詞,比如:port(端口號)、age(年齡)、radius(半徑)等等

使用 _id 結(jié)尾的單詞,比如:user_id、host_id

使用 length/count 開頭或者結(jié)尾的單詞,比如:length_of_username、max_length、users_count

注意:不要使用普通的復數(shù)來表示一個 int 類型變量,比如apples、trips,最好用number_of_apples、trips_count來替代。

其他類型

對于 str、list、tuple、dict 這些復雜類型,很難有一個統(tǒng)一的規(guī)則讓我們可以通過名字去猜測變量類型。比如headers,既可能是一個頭信息列表,也可能是包含頭信息的 dict。

對于這些類型的變量名,最推薦的方式,就是編寫規(guī)范的文檔,在函數(shù)和方法的 document string 中,使用 sphinx 格式(Python 官方文檔使用的文檔工具)來標注所有變量的類型。

3. 適當使用『匈牙利命名法』

第一次知道『匈牙利命名法』,是在Joel on Software 的一篇博文中。簡而言之,匈牙利命名法就是把變量的『類型』縮寫,放到變量名的最前面。

關(guān)鍵在于,這里說的變量『類型』,并非指傳統(tǒng)意義上的 int/str/list 這種類型,而是指那些和你的代碼業(yè)務(wù)邏輯相關(guān)的類型。

比如,在你的代碼中有兩個變量:students和teachers,他們指向的內(nèi)容都是一個包含 Person 對象的 list 。使用『匈牙利命名法』后,可以把這兩個名字改寫成這樣:

students ->pl_studentsteachers ->pl_teachers

pl 是person list的首字母縮寫。變量名被加上前綴后,當你看到以pl_打頭的變量時,就能知道它所指向的值類型了。

很多情況下,使用『匈牙利命名法』是一個不錯的注意,它可以改善你的代碼可讀性,尤其在那些變量眾多、同一類型多次出現(xiàn)時。注意不要濫用就好。

4. 變量名盡量短,但是絕對不要太短

在前面,我們提到要讓變量名有描述性。如果不給這條原則加上任何限制,那么你很有可能寫出這種描述性極強的變量名:how_much_points_need_for_level2。如果代碼中充斥著這種過長的變量名,對于代碼可讀性來說是個災(zāi)難。

一個好的變量名,長度應(yīng)該控制在兩到三個單詞左右。比如上面的名字,可以縮寫為points_level2。

絕大多數(shù)情況下,都應(yīng)該避免使用那些只有一兩個字母的短名字,比如數(shù)組索引三劍客i、j、k,用有明確含義的名字,比如 persion_index 來代替它們總是會更好一些。

使用短名字的例外情況

有時,不能使用短名字的原則也會有一些例外。當一些意義明確但是較長的變量名重復出現(xiàn)時,為了讓代碼更簡潔,使用短名字縮寫是完全可以的。但是為了降低理解成本,同一段代碼內(nèi)最好不要使用太多這種短名字。

比如在 Python 中導入模塊時,就會經(jīng)常用到短名字作為別名,像 Django i18n 翻譯時常用的gettext方法通常會被縮寫成_來使用(from django.utils.translation import ugettext as _)

5. 其他注意事項

其他一些給變量命名的注意事項:

同一段代碼內(nèi)不要使用過于相似的變量名,比如同時出現(xiàn)users、users1、user3這種序列

不要使用帶否定含義的變量名,用is_special代替is_not_normal

更好的使用變量

前面講了如何為變量取一個好名字,下面我們談?wù)勗谌粘J褂米兞繒r,應(yīng)該注意的一些小細節(jié)。

1. 保持一致性

如果你在一個方法內(nèi)里面把圖片變量叫做photo,在其他的地方就不要把它改成image,這樣只會讓代碼的閱讀者困惑:『image和photo到底是不是同一個東西?』

另外,雖然 Python 是動態(tài)類型語言,但那也不意味著你可以用同一個變量名一會表示 str 類型,過會又換成 list。同一個變量名指代的變量類型,也需要保持一致性。

2. 盡量不要用 globals()/locals()

也許你第一次發(fā)現(xiàn) globals()/locals() 這對內(nèi)建函數(shù)時很興奮,迫不及待的寫下下面這種極端『簡潔』的代碼:

def render(request, user_id, trip_id): user = User.objects.get(id=user_id) trip = get_object_or_404(Trip, pk=trip_id) is_suggested = is_suggested(user, trip) # 利用 locals() 節(jié)約了三行代碼,我是個天才! return render(request, 'trip.html', locals())

千萬不要這么做,這樣只會讓讀到這段代碼的人(包括三個月后的你自己)痛恨你,因為他需要記住這個函數(shù)內(nèi)定義的所有變量(想想這個函數(shù)增長到兩百行會怎么樣?),更別提 locals() 還會把一些不必要的變量傳遞出去。

更何況,The Zen of Python(Python 之禪)說的清清楚楚:Explicit is better than implicit.(顯式優(yōu)于隱式)。還是老老實實把代碼改成這樣吧:

return render(request, 'trip.html', { 'user': user, 'trip': trip, 'is_suggested': is_suggested })

3. 變量定義盡量靠近使用

這個原則屬于老生常談了。很多人(包括我)在剛開始學習編程時,會有一個習慣。就是把所有的變量定義寫在一起,放在函數(shù)或方法的最前面。

def generate_trip_png(trip): path = [] markers = [] photo_markers = [] text_markers = [] marker_count = 0 point_count = 0 ... ...

這樣做只會讓你的代碼『看上去很整潔』,但是對提高代碼可讀性沒有任何幫助。

更好的做法是,讓變量定義盡量靠近使用。那樣當你閱讀代碼時,可以更好的理解代碼的邏輯,而不是費勁的去想這個變量到底是什么、哪里定義的?

4. 合理使用 dict 來讓函數(shù)返回多個值

Python 的函數(shù)可以返回多個值:

def latlon_to_address(lat, lon): return country, province, city # 利用多返回值一次定義多個變量country, province, city = latlon_to_address(lat, lon)

但是,這樣的用法會產(chǎn)生一個小問題:如果某一天,latlon_to_address函數(shù)需要返回『城區(qū)(District)』時怎么辦?

如果是上面這種寫法,你需要找到所有調(diào)用latlon_to_address的地方,補上多出來的這個變量,否則ValueError: too many values to unpack就會找上你:

country, province, city, district = latlon_to_address(lat, lon)# 或者忽略多出來的返回值country, province, city, _ = latlon_to_address(lat, lon)

對于這種多返回值可能會變動的情況,使用 dict 作為返回值會更方便一些,當你新增返回值時,不會對之前的函數(shù)調(diào)用產(chǎn)生任何破壞性的影響:

def latlon_to_address(lat, lon): return { 'country': country, 'province': province, 'city': city } addr_dict = latlon_to_address(lat, lon)

這樣做的壞處也有,代碼兼容性雖然增加了,但是你不能繼續(xù)用之前x, y = f()的方式一次定義多個變量了。取舍在于你自己。

5. 控制單個函數(shù)內(nèi)的變量數(shù)量

人腦的能力是有限的,研究表明,人類的短期記憶只能同時記住不超過十個名字。所以,當你的某個函數(shù)過長(一般來說,超過一屏的的函數(shù)就會被認為有點過長了),包含了太多變量時。請及時把它拆分為多個小函數(shù)吧。

6. 及時刪掉那些沒用的變量

這條原則非常簡單,也很容易做到。但是如果沒有遵守,那它對你的代碼質(zhì)量的打擊是毀滅級的。會讓閱讀你代碼的人有一種被愚弄的感覺。

def fancy_func(): # 讀者心理:嗯,這里定義了一個 fancy_vars fancy_vars = get_fancy() ... ...(一大堆代碼過后) # 讀者心理:這里就結(jié)束了?之前的 fancy_vars 去哪了?被貓吃了嗎? return result

所以,請打開 IDE 的智能提示,及時清理掉那些定義了但是沒有使用的變量吧。

7. 能不定義變量就不定義

有時候,我們定義變量時的心理活動是這樣的:『嗯,這個值未來說不定會修改/二次使用』,讓我們先把它定義成變量吧!

def get_best_trip_by_user_id(user_id): user = get_user(user_id) trip = get_best_trip(user_id) result = { 'user': user, 'trip': trip } return result

其實,你所想的『未來』永遠不會來,這段代碼里的三個臨時變量完全可以去掉,變成這樣:

def get_best_trip_by_user_id(user_id): return { 'user': get_user(user_id), 'trip': get_best_trip(user_id) }

沒有必要為了那些可能出現(xiàn)的變動,犧牲代碼當前的可讀性。如果以后有定義變量的需求,那就以后再加吧。

結(jié)語

碎碎念了一大堆,不知道有多少人能夠堅持到最后。變量作為程序語言的重要組成部分,值得我們在定義和使用它時,多花一丁點時間思考一下,那樣會讓你的代碼變得更優(yōu)秀。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3682

    瀏覽量

    94881
  • 變量
    +關(guān)注

    關(guān)注

    0

    文章

    614

    瀏覽量

    28827
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4825

    瀏覽量

    86211

原文標題:Python 工匠:善用變量來改善代碼質(zhì)量

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦
    熱點推薦

    python環(huán)境變量的配置pip

    Python環(huán)境變量的配置和使用是每個Python開發(fā)者都需要了解和掌握的基本技能之一。在本文中,我們將詳細介紹如何正確配置Python環(huán)境變量
    的頭像 發(fā)表于 12-15 15:41 ?2982次閱讀

    python環(huán)境變量設(shè)置

    安裝python之后,我們往往面臨這樣一個問題,在命令行輸入“python”,竟然出錯,難道是沒有安裝成功嗎?非也,其實是你的系統(tǒng)環(huán)境變量沒有設(shè)置好。今天,小編就來帶大家學學python
    發(fā)表于 11-20 11:47 ?2465次閱讀
    <b class='flag-5'>python</b>環(huán)境<b class='flag-5'>變量</b>設(shè)置

    Python的常量與變量基礎(chǔ)知識詳解

    Python是一門強類型的動態(tài)語言。 字面常量,變量沒有類型,變量只是在特定的時間指向特定的對象而已,變量所指向的對象是有類型的。 變量
    發(fā)表于 12-14 05:31 ?1918次閱讀

    python設(shè)置環(huán)境變量

    我們想要運行python,需要安裝Python,還要設(shè)置一些環(huán)境變量1,此電腦,右鍵屬性2、高級系統(tǒng)設(shè)置-> 環(huán)境變量3、在系統(tǒng)變量中找到p
    發(fā)表于 11-10 14:49 ?977次閱讀

    Python私有變量的定義方法

    學過編程語言的人員,都知道私有變量在編程中必不可少,與Java和C語言用private關(guān)鍵字定義私有變量不同,Python是在變量前面加上雙橫杠(例如:__test)來標識,
    發(fā)表于 02-13 16:49 ?1764次閱讀

    使用Python實現(xiàn)水質(zhì)量接口調(diào)用的代碼實例免費下載

    本文檔的主要內(nèi)容詳細介紹的是使用Python實現(xiàn)水質(zhì)量接口調(diào)用的代碼實例免費下載
    發(fā)表于 03-10 16:42 ?10次下載

    Python變量類型詳細資料說明

    Python 中的變量賦值不需要類型聲明。每個變量在內(nèi)存中創(chuàng)建,都包括變量的標識,名稱和數(shù)據(jù)這些信息。每個變量在使用前都必須賦值,
    發(fā)表于 08-24 16:47 ?3次下載
    <b class='flag-5'>Python</b>的<b class='flag-5'>變量</b>類型詳細資料說明

    90條關(guān)于寫Python 程序的建議

    自己寫 Python 也有四五年了,一直是用自己的“強迫癥”在維持自己代碼質(zhì)量。都有去看Google的Python代碼規(guī)范,對這幾年的工作
    的頭像 發(fā)表于 05-31 10:12 ?1723次閱讀

    深入了解python常量與變量

      Python變量和常量不需要事先聲明類型,這是根據(jù)Python的動態(tài)語言特性而來。
    的頭像 發(fā)表于 02-16 18:22 ?2132次閱讀
    深入了解<b class='flag-5'>python</b>常量與<b class='flag-5'>變量</b>

    Python-無處不在的變量

    Python中,每個變量在使用前都必須賦值,變量賦值以后,該變量才會被創(chuàng)建
    的頭像 發(fā)表于 02-16 14:51 ?801次閱讀

    淺析python變量類型

    python不需要事先聲明變量python變量類型是在運行過程中自動決定的,不需要代碼聲明類型。
    的頭像 發(fā)表于 03-10 10:11 ?979次閱讀
    淺析<b class='flag-5'>python</b>的<b class='flag-5'>變量</b>類型

    如何配置Python環(huán)境變量

    配置Python環(huán)境變量是在安裝Python解釋器后的一項重要步驟,它允許您在任何位置都可以通過命令行或腳本運行Python解釋器,使Python
    的頭像 發(fā)表于 04-14 12:16 ?2.1w次閱讀

    python循環(huán)創(chuàng)建變量并賦值

    循環(huán)是Python編程中非常重要的一個概念,它可以讓我們輕松地重復執(zhí)行某些代碼塊,從而簡化編程過程并提高代碼的效率。在循環(huán)中,我們經(jīng)常需要創(chuàng)建變量并賦值,這是非常常見的操作。接下來,我
    的頭像 發(fā)表于 11-23 14:51 ?2099次閱讀

    python變量命名規(guī)則

    的規(guī)則和約定。本文將詳盡、詳實、細致地探討Python變量的命名規(guī)則,幫助讀者了解如何正確命名變量并在編程中遵循最佳實踐。 一、變量命名規(guī)則的重要性 合適的
    的頭像 發(fā)表于 11-23 15:44 ?2137次閱讀

    python軟件怎么運行代碼

    理解的機器代碼。 在本文中,我們將詳細介紹如何運行Python代碼。我們將探討以下幾個方面:安裝Python,設(shè)置環(huán)境變量,選擇一個集成開發(fā)
    的頭像 發(fā)表于 11-28 16:02 ?1314次閱讀
    主站蜘蛛池模板: 天天干小说 | 久青草久青草高清在线播放 | 色婷婷777 | 亚洲国产成人最新精品资源 | 久草资源网站 | 天天干夜夜艹 | 性生交大片免费一级 | 免费永久欧美性色xo影院 | 久久大香线蕉综合爱 | 在线免费看片a | 午夜在线观看cao | 亚洲小视频 | 国产日韩精品一区二区三区 | 免费澳门一级毛片 | 黄网站播放 | 啪啪免费观看 | 手机成人在线视频 | 色综合久久综合欧美综合图片 | 亚洲电影一区二区三区 | a级毛片网 | 久久久午夜精品理论片 | 永久黄色免费网站 | 男女一进一出抽搐免费视频 | 在线观看的黄网 | 国产福利萌白酱喷水视频铁牛 | 久久天天躁狠狠躁夜夜爽蜜月 | 欧美性视频一区二区三区 | 欧美性猛交xxxx免费看久久 | 可以免费看黄的网站 | 六月丁香激情网 | 黄色网址大全免费 | aaa一级 | 91美女在线播放 | h小视频在线 | 一级一级女人18毛片 | 国产三级精品视频 | 又黄又爽又猛午夜性色播在线播放 | 综合五月婷婷 | 美女很黄很黄是免费的·无遮挡网站 | 免费三级网站 | 天天爱夜夜爽 |