2013-06-12 36 views
1

這可能是一個非常愚蠢的問題,但我會問無論如何。簡稱幾項功能 - 指南?

有兩種方式來呈現這個代碼:

file = "picture.jpg" 
pic = makePicture(file) 
show(pic) 

show(makePicture("picture.jpg")) 

這只是如何可以簡寫,我已經與其它功能看到了一個例子。但是當我需要這樣做時,它總是讓我感到困惑。組合這樣的功能時有沒有什麼經驗法則?在我看來,您可以隨時選擇功能,然後選擇文件或選擇文件的功能(即pickAFile())。這聽起來正確嗎?

請保持簡單的解釋,聰明的狗可以理解。

+2

你到底在問什麼?第二個規則是「從內到外」 - 首先評估最深括號內的內容,然後評估最外層的內容。這與你在第一種情況下所做的完全相同。 (另外,你在第二個例子中錯過了右括號。) – BrenBarn

+0

我不確定你在問什麼@Danrex。 – brice

+2

無論如何,避免命名變量'file',因爲這是一個內置的Python類。 :) – EOL

回答

1

當你寫:

pic = makePicture(file) 

你叫makePicturefile作爲參數,並將該函數的輸出入變量pic。如果您使用pic所做的全部操作都將其用作show的參數,則根本不需要使用pic。這只是一個臨時變量。你的第二個例子就是這樣做的,並將makePicture(file)的輸出直接作爲show的第一個參數傳遞,而不使用像pic這樣的臨時變量。

現在,如果您在其他地方使用pic,那麼真的沒有辦法避開它。如果您不重用臨時變量,請選擇您喜歡的任何方式。只要確保它是可讀的。

+0

這是有道理的,一個非常明確的解釋。但是我猜想,如果我將來要縮寫其他功能(以類似的方式,第一個功能在第二個功能中縮寫),我想知道更多是否存在一些我會遵循的一般規則。 – Danrex

+0

@Danrex:它不是縮寫。它只是沒有使用臨時變量。 – Blender

+0

我只是不知道該怎麼說。 – Danrex

1

這一切都由程序員自行決定,如果您打算製作一個更大的程序,您可能希望將這些語句分開,以便您可以引用該文件。

如果你和一羣程序員一起工作,可讀性總是很重要,但如果這只是你自己做的事情,那麼做一些最舒服的事。

+1

雖然我尊重這個觀點,但我必須說我不同意。 'show(makePicture(「picture.jpg」)'是完全可讀的並且完成它的工作;通過添加變量來改變它,以防萬一需要「引用文件」使代碼變得不清晰:這是一個信號該文件在代碼後面已經被需要;這對於任何人閱讀代碼的工作記憶,包括原作者都是不必要的負擔,我也認爲即使是一個單獨完成的項目, – EOL

4

在尋找,因爲我認爲風格確實很重要。如果您不再重複使用"picture.jpg"makePicture(…),我肯定會選擇show(makePicture("picture.jpg"))。原因是:

  • 這完全是易讀
  • 這使得代碼更快地閱讀不需要花費比它需要更多的時間)。
  • 如果你使用變量,你發送一個信號給讀取代碼的人(包括你,在一段時間之後)變量是重複使用代碼中的某處,並且他們應該更好地在工作中長期)記憶。 (在20世紀60年代,實驗表明,一次可以記住大約7條信息,一次,一些現代實驗的數字較小)。所以,如果這些變量不會在任何地方重複使用,他們通常應該被刪除,以免污染讀者的短期記憶。

我認爲你的問題很有效,你應該絕對不能在這裏使用的中間變量,除非它們是必要(因爲它們被重用,或者因爲它們有助於打破直接理解部分複雜表達式)。這種做法會使你的代碼更清晰,並會給你良好的習慣。

PS:正如Blender指出的,有許多嵌套函數調用可以使代碼難以閱讀。如果是這種情況,我建議考慮使用中間變量來保存有意義的信息,以便函數調用不包含太多的嵌套級別。

PPS:由於pcurry指出,嵌套函數調用,也可以很容易地分解成許多行,如果他們變得太長,它可以使有關代碼清晰,就好像使用中間變量,以造福不使用任何:

print_summary(
    energy=solar_panel.energy_produced(time_of_the_day), 
    losses=solar_panel.loss_ratio(), 
    output_path="/tmp/out.txt" 
) 
+0

這裏我會反對人類的記憶方面,如果你使用清晰的變量名,'show(picture)'是不言自明的,你不需要跳到定義'picture'來找出代碼的作用 – Blender

+0

@Blender:我明白你的意思,如果你的意思是「picture」真的沒有進入工作記憶,我會爭辯說它實際上一般*有*去那裏至少部分:圖片是*特定*圖片e(例如與特定文件相關聯),以及它可能必須記住的具體內容;文件名變量出現同樣的問題。不使用變量完全消除了這種問題(「我應該記住關於變量內容的一些細節,或者我應該不在意嗎?」),這使得代碼更快解析並更清晰。 – EOL

+0

我個人覺得很難瀏覽許多嵌套函數調用的行,並立即看到它的功能。對於你的答案中的兩個函數,當然,這非常好,但是說臨時變量使代碼難以閱讀是我難以置信的事情。 – Blender

0

show(makePicture("picture.jpg"))是比在其他的答案中討論的原因,更長的版本更易讀。我還發現,嘗試消除中間變量通常會產生更好的解決方案。但是,有些情況下,複雜中間結果的描述性命名會使代碼更具可讀性。