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第五版),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45690186/