该参数表示已打开以供阅读的消息文件,每行包含一条消息。
按照文件在文件中出现的顺序,以文件的顺序读取并返回文件内容。从每一行中删除换行符。
return res.json({
votes : ++nom.votes
});
嗯,我知道这不是正确的答案,但我不知道如何解决它。
答案 0 :(得分:1)
让我们一步一步看到您的功能:
def read_messages(file):
函数read_messages
只使用一个参数file
;开始运作。
message = []
让变量message
成为空列表([]
)。
for line in file:
对于file
中的每一行,让变量line
成为这样的一行。
new_line = line.strip()
让变量new_line
成为line
变量,并在其开头和结尾处删除所有空格。
message.append(new_line)
将new_line
附加到message
。
return message
返回变量message
;结束功能。
算法是正确的(为什么你说不然?),但可以简化,首先,模式......
x = []
for ...:
something = ...
x.append(something)
doSomething(x) # Can be `return` too
可以简化为列表理解。列表推导是一种在简单易读的表达式中构建列表的方法,无需创建列表,添加并返回列表的所有麻烦。根据之前的模式,你可以做类似的事情......
doSomething([ something for ... ])
这与上面的模式相同!现在,应用于您的代码:
return [ ??? for line in file ]
我们应该在那里放什么代替???
?那么,你必须把计算new_line
(line.strip()
)的代码当然放在!这是因为new_line
可以作为line.strip()
的同义词,因为line.strip()
没有副作用(执行line.strip()
将始终给出相同的结果,无论它被调用的时间,因为line
是相同的)。所以......
return [ line.strip() for line in file ]
您可以使用它,或者如果您不想在开头丢失空白,那么......
return [ line.rstrip() for line in file ]
rstrip()
与strip()
的作用相同,只是它不会删除字符串开头的空格。
所以,你的功能变成......
def read_messages(file):
return [ line.rstrip() for line in file ]
这完全符合您的要求,但让我们做一些更优化!
如果任何行为空,或者只包含空格,您是否希望该行进入列表?我至少没赢过。那你怎么解决这个问题呢?我会采用列表理解,并过滤掉所有空行或由空白行组成的空行。事情就变成......
import string
def read_messages(file):
return filter(lambda x: not all(map(lambda y: y in string.whitespace, x)), [ line.rstrip() for line in file ])
现在,那是什么?首先,lambda
就像一个函数,你可以在任何地方声明为一个表达式。格式为lambda parameters...: return_value
。你注意到了return_value
的东西吗?好吧,发生lambdas只能包含一个表达式,并且它们隐式返回该表达式。因此,例如,lambda x: x + 1
是一个函数,它接受一个参数x
并返回x + 1
。
现在,我们有三个新功能:map
,filter
和all
:
map(f, list)
:为f
中的每个f(x)
取一个函数x
并调用list
,创建另一个包含该结果的列表。它相当于[ f(x) for x in list ]
。filter(f, list)
:使用函数f
并从list
创建一个新列表。对于x
中的任何list
,如果f(x)
为True
,则x
会进入新列表。否则,它被丢弃。它相当于[ x for x in list if f(x) ]
。all(list)
:如果列表中的所有元素都是True
,则True
采用列表并返回False
。最后,string.whitespace
是所有空白字符的列表。
那么,这个新结构可以说是普通英语吗?当然!
返回一个由文件中每一行组成的新列表,如果该行不为空,并且该行中的所有字符都不是空白字符,则删除其尾部空格。