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.py
和rest = []
,这意味着它将给我<_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/