我正在学习Udacity Python课程,虽然我知道如何在“传统”意义上编写代码,但我一直试图通过练习EAFP来编写像Python Developer一样的代码( Easier要求宽恕而不是允许的权限)方法。以下是提供的提示:
# Define a procedure, union, that takes as inputs two lists.
# It should modify the first input list to be the set union of the two
# lists. You may assume the first list is a set, that is, it contains no
# repeated elements.
def union(list1, list2):
try:
[list1.append(x) for x in list2 if list1.index(x) < 0]
except:
print 'Nope'
# To test, uncomment all lines
# below except those beginning with >>>.
a = [1,2,3]
b = [2,4,6]
union(a,b)
print a
#>>> [1,2,3,4,6]
print b
#>>> [2,4,6]
相反,我收到的结果是“Nope”并且打印将返回[1,2,3](绝对不会合并列表)。
我没有做任何回复,因为列表可能会发生变异。
我想知道我的错误与我列出的代码在哪里? EAFP甚至值得在各地实施吗?
答案 0 :(得分:1)
我在这里看到两个问题:
第一个问题与Python异常的工作方式有关。如果我执行以下操作:
a = [1,2,3]
b = [2,4,6]
[a.append(x) for x in b if a.index(x) < 0]
我在列表中得到ValueError
,因为它不是4。联合将永远不会完成,因为第一次未命中将导致代码错误。
如果您反对使用set()
,我建议使用不会导致错误的搜索,count()
方法:
[a.append(x) for x in b if a.count(x) > 0]
我看到的第二个问题是使用EAFP作为一般设计原则的想法。我将注意力转向PEP 8,其中指出:
...知道何时不一致 - 有时候是 风格指南不适用。如有疑问,请使用您的最佳判断。 查看其他示例并确定最佳效果。并且不要犹豫 问!
虽然PEP 8涉及代码风格,但在谈到解决Python问题时,这些词的精神是很好的指导 - 在合理的范围内坚持规则。
EAFP是其中一项宽松的规则。如果您正在使用稳定的系统,那么API格式正确且明确,并且可能出现的异常数量是可管理的,那么EAFP运行良好。代码很干净,而且速度很快。
但是,有些情况并不总是有效。例如,如果您使用来自外部来源的数据作为生产系统的供稿,您将永远不会100%确定数据不会被破坏,损坏或格式错误。作为设计师,您可以决定在EAFP合理工作之前需要达到什么级别的LBYL妄想症。
答案 1 :(得分:0)
使用set:set可以为你做这个
>>> def union(a,b):
... return list(set(a)|set(b))
...
>>> union([1,2,3,4],[2,3,7,8])
[1, 2, 3, 4, 7, 8]
在此处阅读有关设置:set
答案 2 :(得分:0)
由于@Marius指针
,我找到了一个很好的解决方案def union(list1,list2):
for x in list2:
try:
list1.index(x)
except ValueError:
list1.append(x)
我意识到问题在于索引,除了我应该的方式,我没有使用它。例如,当a.index(x)返回一个Error时,我只返回了Nope。事实上,甚至启动错误的原因是因为列表a中不存在变量x,这会引发错误。