我试图找出用户输入的文件中有多少名称以用户输入的字符串开头。提示会很好,这是为了上课。
我可以打开文件并读取文件,打印出其中有多少个名称,然后询问用户想要查找什么子字符串。一切正常,直到我尝试遍历列表中的名称以查找其中有多少名称包含子字符串。忽略我正在研究的奇怪格式。
它说找不到
n_list
,我在第一个函数中返回了它,并尝试在下面的第二个函数中使用它,但我不确定如何或是否做得正确。这是我的主要问题。我不确定使用什么值来循环列表。
def main():
read_File(file_name)
sub = input("What name (or substring) are you interested in searching for? ")
begins_with(n_list, sub)
def read_File(file_name):
while True:
try:
with open(file_name, "r") as file:
lines = file.readlines()
n_list = [line.strip() for line in lines]
length_list = len(n_list)
for line in file:
n_list.append(line)
print(f"The list has {length_list} names")
return n_list
except FileNotFoundError:
print(f"The file {file_name} was not found.")
break
def begins_with(n_list, sub):
i = 0
begins_with_num = 0
for i in range(len(n_list)):
if n_list[i].startswith(sub):
begins_with_num += 1
i += 1
print (f"{begins_with_num} names begin with {sub}")
return n_list
else:
print("too bad")
break
file_name = input("What file do you want to open? ")
main()
当方法返回值时,需要将其分配给调用范围内的变量。在这种情况下,你会这样做:
read_File(file_name)
即使该方法确实尝试返回您的列表,该列表也会丢失/被忽略。
你想要更多类似的东西:
n_list = read_File(file_name)
现在
n_list
在 main()
中有一个值,可以使用/传递给 begins_with()
在编写代码时,您还可以解决一些其他机会。第一个是在
read_File(file_name)
中,您不想要 while True
循环。您要么能够读取该文件,要么不能读取该文件,所以我们可以简化它。
我要查看的第二件事是
begins_with()
的返回值。目前您返回列表,但我可能会返回计数,因为这就是该方法的作用。
最后,一般来说,我会尝试创建不要求也不提供用户数据的实用方法。因此,我会将打印语句从实用程序方法移至 main。
这里有一些值得深思的地方。
def read_File(file_name):
try:
with open(file_name, "r", encoding="utf-8") as file:
return [line.strip() for line in file]
except FileNotFoundError:
return []
def begins_with(n_list, sub):
return sum(name.startswith(sub) for name in n_list)
def main():
file_name = input("What file do you want to open? ")
sub = input("What name (or substring) are you interested in searching for? ")
n_list = read_File(file_name)
print(f"The list has { len(n_list) } names")
begins_with_num = begins_with(n_list, sub)
print (f"{ begins_with_num } names begin with { sub }")
main()