def mysum(L):
    return 0 if not L else L[0] + mysum(L[1:])

def mysum(L):
   return L[0] if len(L) == 1 else L[0] + mysum(L[1:])

def mysum(L):
    first, *rest = L
    return first if not rest else first + mysum(rest)



后两个也可以处理单个字符串参数,例如mysum('spam'),因为字符串是一个单字符字符串的序列。
第三个变体适用于任意可迭代对象,包括打开的输入文件mysum(open(name)),但其他变体不适用,因为它们使用索引。
函数头文件def mysum(first *rest)尽管与第三个变体相似,但因为它期望单个参数不是单个可迭代的。


作者似乎在暗示以(first, *rest)作为输入参数的变体不适用于文件,但是在对其进行试验后,我发现它确实可以工作。

# Code I tried:
def mysum(first, *rest):
    return first if not rest else first + mysum(*rest)


mysum(*open("script1.py"))正常工作。

我认为mysum(open("script1.py"))不起作用,因为python然后看到的是first = open("script1.pyrest = [],这意味着它将给我<_io.TextIOWrapper name='script1.py' mode='r' encoding='cp1252'>,因为不是[]是真的。

最佳答案

作者希望有一个函数以可迭代的形式(例如列表,元组等)作为输入并返回总和,例如像这样:

mysum(open("script1.py"))


当你写

mysum(*open("script1.py"))


这大致相当于

f = open("script1.py").readlines()
mysum(f[0], f[1], ..., f[n])


请注意,这里的代码不接受互变量作为输入,而是采用了几个单独的参数,这不是作者想要的。

关于python - 澄清作者的意思(学习Python第5版),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45690186/

10-12 22:31