我的第一个猜测是,您的代码不会打印任何没有错误的内容,因为您从未实际执行过 process_airports() 或 menu()。
您必须在脚本末尾这样称呼它们:
something = process_airports(airport_data1)
menu()
不过,这现在会引发一些错误。所以让我们解决它们。
menu() 函数将引发错误,因为 name 和 number 均未定义,并且您尝试将 range 函数应用于字符串 (airport_data1) 而不是整数。
首先修复范围错误:您在 for 循环中混合了两个想法:迭代列表中的元素 airport_data1 和迭代列表中元素的索引。
你必须选择一个(我们稍后会看到你可以同时做这两个),在这个例子中,我选择遍历列表的索引。
那么,由于name 和number 都不存在于任何地方,它们将引发错误。您总是需要在某处声明变量,但是,在这种情况下,它们根本不需要,所以让我们删除它们:
def menu(data):
for i in range(len(data)):
print(f'{i + 1} {data[i]}')
processed_airports = process_airports(airport_data1)
menu(processed_airports)
考虑到data是process_airports()的输出
现在提供一些一般性建议和改进。
首先,全局变量。
请注意如何在 menu() 函数中访问 airport_data1
请注意,在我上面提出的函数中,每个变量都在函数本身中声明,没有来自更高范围的信息。同样,这不是强制性的,但会使代码更易于使用和理解。
airport_data = """
Alexandroupoli 40.855869°N 25.956264°E
Athens 37.936389°N 23.947222°E
Chania 35.531667°N 24.149722°E
Chios 38.343056°N 26.140556°E
Corfu 39.601944°N 19.911667°E"""
airports = []
import re
airport_data1 = re.sub("[°N@°E]", "", airport_data)
def process_airports(string):
airports_temp = string.split()
airports = [(airports_temp[x], float(airports_temp[x + 1]), float(airports_temp[x + 2])) for x in
range(0, len(airports_temp), 3)]
return airports
def menu(data):
for i in range(len(data)):
print(f'{i + 1} {data[i]}')
# I'm adding the call to the functions for clarity
data = process_airports(airport_data1)
menu(data)
打印出来的菜单现在看起来像这样:
1 ('Alexandroupoli', 40.855869, 25.956264)
2 ('Athens', 37.936389, 23.947222)
3 ('Chania', 35.531667, 24.149722)
4 ('Chios', 38.343056, 26.140556)
5 ('Corfu', 39.601944, 19.911667)
其次,这主要是供参考,但是您可以通过循环访问 enumerate() 来访问可迭代的索引和元素本身,这意味着,以下函数将打印与 range(len(data)) 完全相同的内容。如果您需要同时使用元素本身和它的索引,这会很方便。
def menu(data):
for the_index, the_element in enumerate(data):
print(f'{the_index + 1} {the_element}')