2013-06-12 20 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"))是比在其他的答案中讨论的原因,更长的版本更易读。我还发现,尝试消除中间变量通常会产生更好的解决方案。但是,有些情况下,复杂中间结果的描述性命名会使代码更具可读性。