01/10/2018, 10:17

Functions and Files in python

mình đang học cuốn “Learn Python The Hard Ways” cho mình hỏi: " đoạn code này làm gì dậy?":
from sys import argv

1.script, input_file = argv
2.
3.def print_all(f):
4. print f.read()
5.
6.def rewind(f):
7. f.seek(0)
8.
9.def print_a_line(line_count, f):
10. print line_count, f.readline()
11.
12.current_file = open(input_file)
13.
14.print “First let’s print the whole file: ”
15.
16.print_all(current_file)
17.
18.print “Now let’s rewind, kind of like a tape.”
19.
20.rewind(current_file)
21.
22.print “Let’s print three lines:”
23.
24.current_line = 1
25.print_a_line(current_line, current_file)
26.
27.current_line = current_line + 1
28.print_a_line(current_line, current_file)
29.
30.current_line = current_line + 1
31.print_a_line(current_line, current_file)
giai thich tung dong cho minh voi? Cam on

HK boy viết 12:18 ngày 01/10/2018
  • Format lại code bạn ơi. Thêm 3 dấu ` (bên cạnh phím 1 trên bàn phím) vào đầu và cuối code.
  • Lần sau không up code có line number.
Henry viết 12:27 ngày 01/10/2018

1

script, input_file = argv

Như mình đã từng giải thích. script sẽ nhận giá trị là tên của file mà bạn sử dụng và input_file sẽ là một argument nữa khi bạn chạy chương trình.
Ví dụ file của bạn là file.py và bạn chạy chương trình với command

python file.py text.txt

Thì script = 'file.py', input_file = 'text.txt'
2

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

Ở hàm này, parameter f sẽ nhận giá trị biến lưu giá trị liên quan đến file. Ví dụ

# input_file = 'text.txt' khi chạy command
file = open(input_file)
print_all(file)

Tất cả nội dung trong file text.txt sẽ được in ra màn hình console (powershell)
3

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

về parameter f thì là như function print_all(). Còn seek(offset) là một method giúp cho chúng ta đưa vị trí về offset. Giống như việc bạn đang viết bài, thế là bạn nhảy lại dòng đầu để ghi tựa bài thì đó có nghĩa là seek(0). Dòng đầu coi là 0. Do đó ở đây function rewind() dịch tiếng Việt là tua lại. Nó sẽ bảo Python đưa mắt trở về dòng đầu tiên của file.
4

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

Thật ra ở đây nếu nói rõ ràng vấn đề thì rất khó hiểu. Đây chỉ là một dạng sắp đặt sẵn thôi.
Khi bạn mở một file và sử dụng readline() thì nó sẽ lấy từng dòng ra. Ví dụ

>>> file = open(input_file)
>>> print(file.readline())
Dòng một trong file text.txt

>>> print(file.readline())
Dòng hai trong file text.txt

>>> print(file.readline())
Dòng ba trong file text.txt

Còn cái line_count mình sẽ nó sau.
5

current_file = open(input_file)

mở file text.txt và gán giá trị file đó vào cho biến current_file

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

Một thông báo từ tác giả nói sẽ in toàn bộ nội dung file (text.txt) ra

print_all(current_file)

Truyền argument current_file cho parameter f nhận. Và trong function print_all()print(f.read()) tương tự như việc print(current_file.read())

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

Sau khi sử dụng read() Python đã lướt hết mọi dòng của file text.txt do đó mắt nó đang nhìn dưới dòng cuối cùng. Nên giờ nếu current_file.read() sẽ không ra nội dung gì. Do đó tác giả muốn tua lại

rewind(current_file)

Sử dụng function rewind(current_file). Nó cũng tương đương như current_file.seek(0). Nói với Python là đưa mắt lên dòng đầu tiên.

print "Let's print three lines:"

Thông báo in 3 dòng. Nên nhớ là giờ Python đang nhìn ở dòng đầu tiên rồi

current_line = 1
print_a_line(current_line, current_file)

ở đây khi dùng call function print_a_line() thì các parametersline_count=1, f=current_file
Nên trong function sẽ hoạt động như sau

print line_count, f.readline()
sẽ tương tự với
print 1, f.readline()

Chú ý là bây giờ Python đang nhìn ở dòng đầu tiên. Method readline sẽ đọc dòng mà nó đang nhìn. Do đó kết quả sẽ được là
1 Dòng đầu tiên trong file text.txt
Sau khi đọc xong dòng đầu thì mắt Python nhìn xuống dòng 2

current_line = current_line + 1 # current_line now is 2
print_a_line(current_line, current_file)

Kết quả
2 Dòng thứ hai trong file text.txt
Và cứ thế tới lần 3. và được kết quả
3 Dòng thứ ba trong file text.txt
Nếu như lần 4 bạn call function theo cách sau đây print_a_line(5, current_file) thì kết quả là
5 Dòng thứ tư trong file text.txt
Vì sao lại thế. Đó là vì mắt Python chỉ mới nằm ở dòng 4 nên nó chỉ đọc duy nhất dòng 4 chưa nhảy qua dòng 5 được.

Bài liên quan
0