我正在创建一个程序,以便将特定年份与奥运会地点相匹配。
即。如果用户输入一年,它会找到当年奥运会举办地点(1904年 - 雅典,希腊......)等。
它一直告诉我我的代码中存在位置错误,但是:
Traceback (most recent call last):
File "<pyshell#29>", line 1, in <module> findLocation()
TypeError: findLocation() missing 3 required positional arguments:
'yearList', 'locList', and 'year'
这是我的计划:
def getData():
print("All the events")
print("")
yearList = []
locList = []
readFile = open('olympics.txt', 'r')
for line in readFile:
year, loc = line.split("\t")
loc = loc.replace("\n", "")
yearList.append(year)
locList.append(loc)
return yearList,locList
def findLocation(yearList, locList, year):
i=0
location=""
while i<len(locList):
if yearList[i] == year:
year = yearList[i]
elif yearList[i] !=year:
return print ("That was incorrect")
i += 1
return location
获取数据是否成功,但我的findLocation
函数似乎不合适,我不知道如何修复它。
以下是包含奥运项目的文本文件的摘录。
1896 Athens, Greece
1900 Paris, France
1904 St. Louis, Missouri USA
1906 Athens, Greece*
1908 London, England
1912 Stockholm, Sweden
1916 Not held**
1920 Antwerp, Belgium
有人能帮助我吗?
答案 0 :(得分:0)
findLocation不会产生结果的原因是因为您在所有年份/位置上进行迭代,如果第一个不正确,则从函数返回(返回打印(“这是不正确的“))
更新:包含描述如何调用函数的示例主方法
这样的事情会更好:
def getData():
print("All the events")
year_to_location = {}
with open('olympics.txt', 'r') as f:
content = f.readlines()
for line in content:
year, loc = line.split("\t")
year_to_location[year] = loc.strip()
return year_to_location
def findLocation(year_to_location, year):
if year in year_to_location:
return year_to_location[year]
else:
print("That was incorrect")
if __name__ == '__main__':
year_to_location = getData()
print(findLocation(year_to_location, "1900"))
注意:我将year_list和loc_list替换为字典year_to_location,并简化了findLocation。我还添加了一个open('olympics.txt')作为f语句,这是处理文件的一种稍好的方法(它确保文件处理程序在完成后关闭)
您也可以从返回打印(“那是不正确的”)中删除返回,您的代码应该按原样运行。
答案 1 :(得分:0)
但我的findLocation函数似乎没什么问题
你是对的。你的逻辑需要在那里改变。但是,下次请添加一些您期望的内容和所获得的内容。这将有助于我们。现在开始逻辑:
def findLocation(yearList, locList, year):
i=0
location=""
while i<len(locList):
if yearList[i] == year:
return locList[i]
elif int(yearList[i]) > int(year):
print "That was incorrect"
return
i += 1
print "Year was incorrect"
return
现在需要使用三个参数调用此函数。两个来自您的getdata,一个来自用户打印位置:
year_list,loc_list = getData() year = raw_input(“输入要搜索的年份:”) findLocation(year_list,loc_list,year)
答案 2 :(得分:0)
说过您的代码非惯用并且可以更简洁,更清晰的方式重写,让我们尝试分析您的问题。
您的错误是由于功能签名与您的使用不匹配所致,但即使它被正确调用,也无法返回正确的location
...这是您的代码
def findLocation(yearList, locList, year):
i=0
location=""
在上面的行中设置location
,它永远不会被重新分配,因此您将返回空字符串,而不管代码的其余部分
while i<len(locList):
if yearList[i] == year:
year = yearList[i]
上面的测试是同义的,如果两个物体相等(即它们的值相等),你将一个值分配给另一个物体......你没有改变任何东西
elif yearList[i] !=year:
return print ("That was incorrect")
上面的测试不是您想要的,因为1.
您不想退出您的功能,直到您测试了所有可能的Olympyc年和2.
{{ 1}}返回return print(...)
函数返回的值,ir,print
。
None
接近你的编码风格,我会这样做
i += 1
return location
如果您了解内置def find_location(y_list, l_list, year):
i = 0
while i<len(y_list):
if year == y_list[i]:
# the following statement exits the function,
# returning the Olympics location for the year
return l_list[i]
i = i+1
return ''
,则以下内容更紧凑,更具表现力
zip
你的问题的真正解决方案是使用不同的数据结构而不是配对列表,即 def f(y_l, l_l, year):
for y, l in zip(y_l, l_l):
if year==y: return l
return ""
,但在我看来你没有被介绍给它......