2013-03-28 2 views
0

Итак, я пытаюсь написать сценарий, который позволяет пользователю записывать заметки в разных категориях, а затем печатать эти заметки в выходной файл. Посмотрите на примерный код.Как написать повторяемый raw_input?

def notes(): 
    global text 
    text = raw_input("\nPlease enter any notes.\n>>> ") 
    print "\Note added to report." 
    notes_menu() 

def print_note(): 
    new_report.write("\nNotes: \n%r" % text) 

Мой вопрос состоит из двух частей:

  1. Что я могу использовать, чтобы сделать это так, что если метод ноты вызывается еще раз (с текстом уже назначен на строку) он создает новая переменная, называемая text1, и будет продолжать делать это столько раз, сколько вызывается метод notes, а текст назначен?

  2. Как я могу заставить метод печати продолжать проверять и печатать как можно больше текстовых^nths?

+2

Используйте «list» и добавьте ввод. Итерации над ним для печати. http://docs.python.org/2/tutorial/datastructures.html – Jared

ответ

0

Вы должны использовать list S для этого:

texts = [] 
def notes(): 
    global texts 
    txt = raw_input("\nPlease enter any notes.\n>>> ") 
    texts.append(txt) # Add the entered text inside the list 
    print "\Note added to report." 
    notes_menu() 

def print_note(): 
    for txt in texts: 
     new_report.write("\nNotes: \n%r" % txt) 

Я надеюсь, что это то, что вы хотели.

EDIT: Так как я уверен, что я получил downvoted, потому что я использовал global, я хотел бы уточнить: я использовал global потому что ОП используется global, а не потому, что это хорошее решение.

+0

Это прекрасно поработало. –

+0

Почему голос? – AkiRoss

+1

@hedge_funder в любом случае, я хотел бы предложить, чтобы мой ответ был настроен, чтобы вы поняли, что происходит (т. Е. Сохраняя его похожим на ваш код), но * это не * хороший способ сделать это. В общем, * избегайте * использования глобалов, потому что они вводят побочные эффекты, которые могут быть неприятными. – AkiRoss

1

Думаю, вы захотите использовать цикл для чтения нескольких строк заметок, добавив их в список. Вот пример того, как это может работать:

def notes(): 
    lines = [] 
    print "Please enter any notes. (Enter a blank line to end.)" 
    while True: # loop until breaking 
     line = raw_input(">>> ") 
     if not line: 
      break 
     lines.append(line) 

    return lines 
2

Использование

ITER (вызываемые, дозорные) -> итератор

>>> list(iter(raw_input, '')) 
apple 
1 2 3 
foo bar 

['apple', '1 2 3', 'foo bar'] 

Настройка его:

>>> list(iter(lambda: raw_input('Enter note: '), '')) 
Enter note: test 
Enter note: test 2 
Enter note: 
['test', 'test 2'] 
+0

Это, безусловно, самый питонический способ сделать это – msvalkon

+0

@msvalkon Удивительно, что этот способ многим неизвестен – jamylak

+0

Я знаю, я сам это узнал. Раймонд Хеттингер рассказывает об этом в этом довольно удивительном [видео] (http://pyvideo.org/video/1780/transforming-code-into-beautiful-idiomatic-pytho) с этого года pycon. – msvalkon

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