缺少位置参数? (python帮助)

时间:2015-02-24 07:01:42

标签: python

我正在创建一个程序,以便将特定年份与奥运会地点相匹配。

即。如果用户输入一年,它会找到当年奥运会举办地点(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 

有人能帮助我吗?

3 个答案:

答案 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 "" ,但在我看来你没有被介绍给它......