Python EAFP循环练习

时间:2014-11-11 03:06:05

标签: python python-2.7

我正在学习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甚至值得在各地实施吗?

3 个答案:

答案 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,这会引发错误。

相关问题