2014-01-07 2 views
1

Я изучаю python без какого-либо предварительного опыта по кодированию, и это то, что я сейчас не понимаю.Изучите Python Hard Way ex20, как эта функция работает?

Вот весь код:

from sys import argv 

script, input_file = argv 

def print_all(f): 
    print f.read() 

def rewind(f): 
    f.seek(0) 

def print_a_line(line_count, f): 
    print line_count, f.readline() 

current_file = open(input_file) 

print "First let's print the whole file:\n" 

print_all(current_file) 

print "Now let's rewind, kind of like a tape." 

rewind(current_file) 

print "Let's print three lines:" 

current_line = 1 
print_a_line(current_line, current_file) 
current_line = current_line + 1 
print_a_line(current_line, current_file) 
current_line = current_line + 1 
print_a_line(current_line, current_file) 

Последняя часть должна печатать, как это:

Now let's rewind, kind of like a tape. 
Let's print three lines: 
1 This is line 1 
2 This is line 2 
3 This is line 3 

Часть я не понимаю, эти последние несколько строк. Как блок «current_file» понимает, что он должен сначала печатать только одну строку, а во-вторых, как он знает, что она должна быть той же строкой, что и «current_line»?

ответ

3

Файл-объект продвигается каждый раз при вызове .readline(); переменная current_line используется только для указания номера строки. Эти два не связаны друг с другом.

Попробуйте удалить current_line = current_line + 1 линии, и он будет печатать:

Now let's rewind, kind of like a tape. 
Let's print three lines: 
1 This is line 1 
1 This is line 2 
1 This is line 3 

Вы можете себе представить, current_line быть свой собственный личный блокнот ведение счета, просто чтобы убедиться, что линии действительно наступала. Если вы забудете записать следующий номер, файл не заботится и будет двигаться независимо.

Файл очень похож на ленту; каждый раз, когда вы читаете его, «голова» чтения и записи продвигается вдоль «ленты», так что следующее действие чтения или записи происходит в этом новом месте.

«Голова» - это просто номер, позиция в файле, управляемая операционной системой. Вы всегда можете запросить файл для текущей позиции с помощью file.tell() method. Если вы добавите print f.tell() строк в функцию print_a_line(), она напечатает там, где расположена головка.

Последнее, что не менее важно, поскольку функция rewind() уже показывает, file.seek() method позволяет переместить «голову» в новое место. f.seek(0) возвращает его.

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