2015-02-24 2 views
-5

Я создаю программу, соответствующую конкретному году Олимпийскому местоположению.Отсутствующие позиционные аргументы? (python help)

I.e. если пользователь вводит год, он находит место, где Олимпийские игры состоялись в том же году (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

'my findLocation функция, кажется, из-за удара' не очень помогает :( – thefourtheye

+0

Что вы имеете в виду позиционные ошибки? Можете ли вы предоставить сообщение об ошибке (stacktrace)? –

+0

Traceback (самый последний вызов последнего): Файл "", строка 1, в findLocation() TypeError: findLocation() не хватает 3 необходимых позиционных аргументов: 'yearList', 'locList' и 'год' –

ответ

0

Причина findLocation не дает результата, потому что вы итерация всех лет/местах, и если первый один неверен вы вернуть из функции (возврата печати («Это было неправильно»))

UPDATE: включена в основной метод пример, описывающий, как называть функции

что-то, как это должно работать лучше:

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 совсем немного. Я также добавил с открытым («olympics.txt»), как ф утверждение, которое является немного более эффективным способом обработки файлов (это гарантирует, что обработчик файла закрывается, когда сделано)

Вы также можете просто удалить возвращения из return print («Это было неправильно»), и ваш код должен работать так, как есть.

0

but my findLocation function seems to be out of whack

Вы правы в этом отношении. Ваша логика должна быть там изменена. Однако в следующий раз, пожалуйста, добавьте немного больше информации о том, что вы ожидали, и о том, что вы получили. Это поможет нам. Теперь по логике:

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() год = raw_input ("Введите год для поиска:") findLocation (year_list, loc_list, год)

0

Сказав, что ваш код не идиоматический и что он может быть переписан короче, яснее, попробуем проанализировать вашу проблему.

Ваша ошибка мотивирована несоответствием между функцией подписью и вашим использованием, но даже если он был назван правильно, это не будет возвращать правильный location ... это ваш код

def findLocation(yearList, locList, year): 
    i=0 
    location="" 

в линия выше вы установите location, и он никогда не переназначен, так что вы собираетесь вернуть пустую строку, irrispective остальной части кода

while i<len(locList): 
     if yearList[i] == year: 
      year = yearList[i] 

тест выше тавтологично, если два объекта равны (т.е. , их значения равны) присвоить свое значение на другой объект ... ты ничего не изменил

 elif yearList[i] !=year: 
      return print ("That was incorrect") 

выше тест не то, что вы хотите, потому что 1. вы не хотите, чтобы выйти из вашей функции до вы проверили все возможные годы Олимпика и 2.return print(...) возвращает значение, возвращаемое функцией print, ir, 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 "" 

Реальное решение вашей проблемы заключается в использовании другой структуры данных вместо парного списка s, а именно dict, но мне кажется, что вы не познакомились с ним ...