首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >澄清作者的意思(学习Python第5版)

澄清作者的意思(学习Python第5版)
EN

Stack Overflow用户
提问于 2017-08-15 09:31:27
回答 2查看 70关注 0票数 1
代码语言:javascript
复制
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)作为输入参数的变量不能处理文件,但在对其进行实验之后,我发现它确实有效。

代码语言:javascript
复制
# 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'>,因为[]不是真的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-15 09:41:35

作者希望一个函数以一个可迭代的(例如列表、元组等)作为输入,并返回和,例如:

代码语言:javascript
复制
mysum(open("script1.py"))

当你写

代码语言:javascript
复制
mysum(*open("script1.py"))

这大致相当于

代码语言:javascript
复制
f = open("script1.py").readlines()
mysum(f[0], f[1], ..., f[n])

请注意,这里您的代码不接受可交互的输入,而是使用几个独立的参数,这不是作者想要的。

票数 2
EN

Stack Overflow用户

发布于 2017-08-15 10:49:43

用元组来解释发生了什么。*sequence语法用于解压缩。

代码语言:javascript
复制
numbers = (1, 2, 3)

mysum(*numbers)   # this happens: mysum(1, 2, 3)

等于mysum(1, 2, 3)。成员从可迭代性中提取,并作为参数输入函数。使用*open('path/to/file')会打开文件并将其内容作为参数传递给mysum(L)。这相当于mysum(open('path/to/file').read())

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45690186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档