W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
回憶一下函數(shù)的要點,然后一邊做這節(jié)練習(xí),一邊注意一下函數(shù)和文件是如何在一起協(xié)作發(fā)揮作用的。
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)
特別注意一下,每次運行print_a_line
時,我們是怎樣傳遞當(dāng)前的行號信息的。
$ python ex20.py test.txt
First let's print the whole file:
This is line 1
This is line 2
This is line 3
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
- 通讀腳本,在每行之前加上注解,以理解腳本里發(fā)生的事情。
- 每次
print_a_line
運行時,都傳遞了一個叫current_line
的變量。在每次調(diào)用函數(shù)時,打印出current_line
的值,跟蹤一下它在print_a_line
中是怎樣變成line_count
的。- 找出腳本中每一個用到函數(shù)的地方。檢查
def
一行,確認(rèn)參數(shù)沒有用錯。- 上網(wǎng)研究一下
file
中的seek
函數(shù)是做什么用的。試著運行pydoc file
看看能不能學(xué)到更多。- 研究一下
+=
這個簡寫操作符的作用,寫一個腳本,把這個操作符用在里邊試一下。
print_all
中的f
是什么?
f
就是一個變量,就好像在練習(xí)18中其他的變量一樣,只不過這次它代表了一個文件。 Python中的文件就好像老舊的磁帶驅(qū)動器,或者是像現(xiàn)在的DVD播放器。它有一個 "磁頭",你可以在文件中"查找"到這個磁頭的位置,并且從那個位置開始運行。你每執(zhí)行一次f.seek(0)
,就靠近文件的開頭一點。每執(zhí)行一次f.readline()
你就從文件中讀取一行內(nèi)容,并且把“磁頭”移動到文件末尾,換行符\n
的后面。繼續(xù)學(xué)習(xí)本書,你會看到更多的解釋。
函數(shù)
readline()
返回一行以\n
結(jié)尾的文件內(nèi)容, 在你調(diào)用print函數(shù)的最后增加一個逗號',',用來避免為每一行添加兩個換行符\n
。
seek(0)
方法沒有把current_line
的值修改為0?首先,
seek()
方法是按字節(jié)而不是按行為處理單元的。代碼seek(0)
重新定位在文件的第0位(第一個字節(jié)處)。再次,current_line
是一個變量,在文件中沒有真正的意義可言。我們是在手動的增加它的值。
+=
是什么?你應(yīng)該知道在英語里我們可以簡寫 "it is" 為 "it's",簡寫 "you are" 為 "you're"。在英語里我們把這種寫法稱為縮寫,同樣的,
+=
是=
和+
兩個操作符的縮寫. 比如x = x + y
可以縮寫為x += y
.
readline()
怎么知道每一行的分界在哪里?
readline()
內(nèi)部代碼是掃描文件的每一個字節(jié),直到找到一個\n
字符代碼,然后停止閱讀,并返回到此之前獲得的所有內(nèi)容。代碼中f的責(zé)任是在每次調(diào)用readline()
之后,維護“磁頭”在文件中的位置,以保證繼續(xù)讀后面的每一行。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: