python 函數(shù)和文件

2021-09-15 14:47 更新

練習(xí)20. 函數(shù)和文件

回憶一下函數(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)前的行號信息的。

你看到的結(jié)果

$ 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

附加題

  1. 通讀腳本,在每行之前加上注解,以理解腳本里發(fā)生的事情。
  2. 每次print_a_line運行時,都傳遞了一個叫current_line的變量。在每次調(diào)用函數(shù)時,打印出current_line的值,跟蹤一下它在print_a_line中是怎樣變成line_count的。
  3. 找出腳本中每一個用到函數(shù)的地方。檢查def一行,確認(rèn)參數(shù)沒有用錯。
  4. 上網(wǎng)研究一下file中的seek函數(shù)是做什么用的。試著運行pydoc file看看能不能學(xué)到更多。
  5. 研究一下+=這個簡寫操作符的作用,寫一個腳本,把這個操作符用在里邊試一下。

常見問題

Q:函數(shù)print_all中的f是什么?

f 就是一個變量,就好像在練習(xí)18中其他的變量一樣,只不過這次它代表了一個文件。 Python中的文件就好像老舊的磁帶驅(qū)動器,或者是像現(xiàn)在的DVD播放器。它有一個 "磁頭",你可以在文件中"查找"到這個磁頭的位置,并且從那個位置開始運行。你每執(zhí)行一次 f.seek(0),就靠近文件的開頭一點。每執(zhí)行一次f.readline()你就從文件中讀取一行內(nèi)容,并且把“磁頭”移動到文件末尾,換行符\n的后面。繼續(xù)學(xué)習(xí)本書,你會看到更多的解釋。

Q: 文件中為什么有3個空行?

函數(shù) readline() 返回一行以\n結(jié)尾的文件內(nèi)容, 在你調(diào)用print函數(shù)的最后增加一個逗號',',用來避免為每一行添加兩個換行符\n。

Q:為什么seek(0)方法沒有把current_line的值修改為0?

首先,seek()方法是按字節(jié)而不是按行為處理單元的。代碼seek(0)重新定位在文件的第0位(第一個字節(jié)處)。再次,current_line是一個變量,在文件中沒有真正的意義可言。我們是在手動的增加它的值。

Q:+=是什么?

你應(yīng)該知道在英語里我們可以簡寫 "it is" 為 "it's",簡寫 "you are" 為 "you're"。在英語里我們把這種寫法稱為縮寫,同樣的,+==+兩個操作符的縮寫. 比如x = x + y可以縮寫為x += y.

Q:readline()怎么知道每一行的分界在哪里?

readline()內(nèi)部代碼是掃描文件的每一個字節(jié),直到找到一個\n字符代碼,然后停止閱讀,并返回到此之前獲得的所有內(nèi)容。代碼中f的責(zé)任是在每次調(diào)用readline()之后,維護“磁頭”在文件中的位置,以保證繼續(xù)讀后面的每一行。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號