我正在学习Python,并对PEP 20 The Zen of Python中的以下几点感兴趣:
应该有一种-最好只有一种-显而易见的方法。尽管除非您是荷兰人,否则一开始这种方式可能并不明显。
谁能提供这个格言的具体例子?我对与其他语言(例如Ruby)的对比特别感兴趣。Ruby设计哲学的一部分(我认为起源于Perl?)是实现它的多种方法。任何人都可以提供一些示例来说明每种方法的利弊。请注意,我不是在寻找哪个更好的答案(这可能是主观的,无法回答),而是两种风格的公正对比。
我正在学习Python,并对PEP 20 The Zen of Python中的以下几点感兴趣:
应该有一种-最好只有一种-显而易见的方法。尽管除非您是荷兰人,否则一开始这种方式可能并不明显。
谁能提供这个格言的具体例子?我对与其他语言(例如Ruby)的对比特别感兴趣。Ruby设计哲学的一部分(我认为起源于Perl?)是实现它的多种方法。任何人都可以提供一些示例来说明每种方法的利弊。请注意,我不是在寻找哪个更好的答案(这可能是主观的,无法回答),而是两种风格的公正对比。
Answers:
与Perl之类的语言相比,Python的控件构造数量有限:
if
而没有unless
,for
在序列上进行迭代,并且没有no foreach
或C样式for
,while
这样才能在每个循环中检查条件,并且没有do-while
,if-elif
而没有switch
,#
并且,无需查看前几行,您就可以知道每一行是否被注释掉。而且,几乎有一种方法可以使您的源代码缩进。从句法上讲,大多数创意缩进都被排除在外。
这使人类更容易解析Python源。
尝试将内置类型和标准库的内容减到最少,但要完整。
list
类型;大多数操作为O(1),而您不必选择正确的实现,tuple
类型,dict
在大多数情况下非常有效的内置函数,而无需考虑使用哪种实现。Python 3将其扩展为整数:不管整数有多大,您都使用相同的类型,并且从不关心强制。
Python尝试避免语法糖。但是有时它添加语法糖只是为了使显而易见的方式变得明显。您可以写if foo is not None
而不是if not (foo is None)
因为“ is not”是特殊情况。仍然foo is not None
易于阅读,不会被误解,您不必思考,您只需写显而易见的东西。
当然,Python中大多数更复杂的事情都可以通过几种方法来完成。您可以通过声明或通过简单的插槽分配将方法添加到类中,也可以通过许多创造性的方式将参数传递给函数,等等。这仅仅是因为该语言的内部大部分都公开了。
关键在于,总有一种情况是最好的一种方法。如果存在其他方式,则不会将它们作为相等的替代项(例如if
和unless
)添加,而只是公开内部工作原理。通过增强已知的最佳机制,这种替代方法逐渐但稳定地被淘汰(未消除!)。
装饰器包装AOP函数调用。在2.6之前,您必须使用__metaclass__
magic成员声明类的元类;现在,您也可以为此使用相同的装饰器语法。在3.0之前,您有两种字符串,面向字节的字符串和Unicode,您可能会无意间将它们混合使用。现在,您拥有唯一的Unicode str
和唯一的二进制透明的bytes
,您不能将其错误混合。
__doc__
属性访问。但是字符串是Python绝对提供许多“正确方法”的领域:使用单引号,双引号或三引号,隐式联接相邻的文字,r
用于原始文字等
在C语言中,有许多种方法可以将变量的值增加一:
i++ // Post-increment, returns the number before the increment
++i // Pre-increment, returns the number after the increment
i += 1
每个最终都会增加i
by 的值1
,但是每个都略有不同。
在Python中,实际上只有一种方法。只需添加一个。
i += 1
尽管有多种语法上有效的方法可以做到这一点(例如i = i + 1
),但是您在做同样的事情却具有相同的副作用。
i = i + 1
是分配,而不是增量。在python中,增量为i += 1
。在C风格的语言,你可以写i++
,++i
和i += 1
。
i += 1
,BTW)都会产生完全相同的结果。我唯一一次看到人们感到困惑的是,他们在一个较大的表达式中对变量进行预增或后增,通常可以通过阅读语言参考的相应章节来快速纠正。就我个人而言,我会选择一个事实,即您可以通过str[4]
或来引用字符串的第五个字符*(str+4)
,但这也许太容易了……
max(i++, ++i)
无法迅速纠正。C有很多“未定义”和“依赖实现”的行为案例,这都是有充分理由的,但是每个案例都会带来一个陷阱。
另一种可能是列表理解。在Python中,您可以这样做:
new_list = []
for item in list_of_items:
if item < 10:
new_list.append(item)
但是,这样做的“明显”方式(如果您是荷兰人或更熟悉Python)将与列表理解有关:
new_list = [item for item in list_of_items if item < 10]
它更短,只需一步就可以创建new_list,我相信它运行得更快,而且优雅。不利的一面是,人们可能会认为它不太明确,但我认为,一旦您习惯了它,它就会变得同样明确。
"""
注释(文档字符串)。这些跨越多行。