2010-07-01 3 views
2

ниже код используется в функции:None Возвращаемое значение

def print_query(x): 
    h = open('/home/rv/data.txt', 'r') 
    read = h.readlines() 
    for line in read: 
     return line 

Когда значение «линия» является retunred он должен напечатать, но вместо этого я получаю значение «None»

+1

print_query на самом деле ничего не печатает. И это наименьшая из проблем этого кода. –

+0

Ваш оператор возврата будет достигнут один раз, что означает, что первая строка в «прочитанном» списке строк будет возвращена, а остальные будут потеряны. –

ответ

2

Вы не проверка если «прочитанная» переменная фактически содержит любые строки - если это не так, то функция будет проходить через цикл for и возвращает None.

Использование цикла for также глупо - зачем вам читать все строки и возвращать только первый, особенно в цикле for? Что происходит, когда файл не может быть открыт?

+0

Я уверен, что цикл будет выполняться только один раз, но он по-прежнему является причудливым анти-шаблоном для получения первой строки файла. Там должно быть соревнование, чтобы найти странные способы сделать это, чем это. –

+0

Файл is not empty, ах, я didnt relise, как бы я retuen все линии? – Liam

+0

Вы хотите вернуть строку к вызывающему коду или просто распечатать их? Если вы хотите вернуть их, просто верните h.readlines() –

8

Попробуйте это:

with open('/home/rv/data.txt','r') as fh: 
    for line in fh: 
     print line 

Если вы на Python 2.5, вам может понадобиться from __future__ import with_statement на вершине.

Также: почему вы return линии, если вы хотите print?

+0

Похоже на то, что вы запустили фактическое намерение OP и поставили разумный код Python для его реализации. –

+0

+1 для невероятно простого и эффективного кода. – Brian

1

Я не уверен, почему вы беспокоитесь о петле в своей функции, так как она все равно вернется после первой итерации. Что именно вы пытаетесь достичь? Похоже, здесь есть более глубокая концептуальная проблема, помимо простых вопросов реализации.

0

Когда вы пишете:

def f: 
    return 1 
    return 2 

функция возвращает 1.

если вы хотите вернуть несколько значений вы можете вернуть его в списке:

def f: 
    ans = [] 
    ans.append(1) 
    ans.append(2) 
    return ans 

другой вариант является использовать «доходность». google, когда вы будете готовы к этому

0

Еще одна проблема с функцией: вы повторяете неправильный объект , являющийся более подробным, чем вам нужно. Чтобы перебрать строки в файле, просто выполните следующие действия:

for line in open(file, "r"): 
    print line 
+0

readlines() возвращает список, содержащий все строки в файле. Хотя это явно более многословно, чем необходимо (и будет использовать немного больше памяти), нет ничего «неправильного» в том, что вы используете readlines, чтобы явно перечислить список строк. –

+0

readlines() и более поздние xreadlines() часто использовались в старые времена, прежде чем файловые объекты были итерабельными –

+0

О, моя ошибка. Я оставлю это здесь, так как это все еще полезно. –

Смежные вопросы