[英]How to return the contents of the file as a list of messages
该参数表示一个已打开以供阅读的消息文件,并且每行包含一个消息。
读取消息的内容并将其作为消息列表返回,并按照消息在文件中出现的顺序排列。 从每行中删除换行符。
def read_messages(file):
"""
"""
message = []
for line in file:
new_line = line.strip()
message.append(new_line)
return message
好吧,我知道这不是正确的答案,但是我不知道该如何解决。
让我们逐步了解您的功能:
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.strip()
始终会得到相同的结果,而不管调用它的时间如何,给定该line
是相同的)。 所以...
return [ line.strip() for line in file ]
您可以使用它,或者如果您不想在一开始就失去空白,那么...
return [ line.rstrip() for line in file ]
rstrip()
与strip()
相同,但rstrip()
不会删除字符串开头的空格。
因此,您的功能变为...
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
东西? 好吧,碰巧的是,lambda只能包含一个表达式,并且它们隐式返回该表达式。 因此,例如, lambda x: x + 1
是一个函数,它接受单个参数x
并返回x + 1
。
现在,我们有了三个新功能: map
, filter
和all
:
map(f, list)
:获取函数f
并为list
每个x
调用f(x)
,创建另一个保存该结果的列表。 等效于[ f(x) for x in list ]
。 filter(f, list)
:使用函数f
并从list
创建一个新list
。 对于list
任何x
,如果f(x)
为True
,则x
进入新列表。 否则,将其丢弃。 等效于[ x for x in list if f(x) ]
。 all(list)
:接受一个列表,并返回True
如果列表中的所有元素都是True
, False
否则。 最后, string.whitespace
是所有空白字符的列表。
那么,这个新结构可以用简单的英语说吗? 当然!
如果该行不为空并且该行中的所有字符都不都是空格字符,则返回一个新列表,该列表由文件中的每一行组成,并删除了其尾随空格。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.