Exercise 20: 函數和文件

原文鏈接:http://learnpythonthehardway.org/book/ex20.html

       記住檢查函數所列的檢查列表,然後做下面這個練習,密切注意怎樣用函數和文件一起來寫一些有用的東西。

from sys import argv

scirpt ,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 liners:"

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函數時向其傳遞當前行數的。

輸出結果如下:

c:\>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 liners:
1 This is line 1

2 This is line 2

3 This is line 3

研究訓練:

1、通過給每一行代碼寫一個註釋來理解腳本做了什麼操作。
2、每次運行print_a_line 函數的時候你都傳遞了一個current_line變量給它。寫出在它的每一個函數調用中current_line等於什麼值,並且追尋這個值是怎麼成爲了print_a_line中line_count的值。
3、查找每一處函數調用的地方,檢查用def定義了函數的地方來確保你傳遞給這個函數的參數都在正確的。
4、在網上搜索files文件操作中seek函數是起什麼作用。可以用 pydoc file命令來查看其用法看看你在這裏是否能把它弄明白。
5、查找簡寫 += 的用法,然後用它來重寫腳本。

學生遇見的常見問題:

在print_all函數和其它函數中 f 是什麼?

答:這個 f 就像你在 Exercise 18裏面函數中的一個變量一樣,只是這裏這個變量是一個文件句柄。一個文件句柄就像一種在主機上被驅動的老式磁帶,或者像一個DVD播放器。它是一個文件的“讀取的頭”,你可以用 "seek"來讀取文件中指定的位置,然後在這個位置做相應操作。你如果每次調用 f.seek(0) 函數,那麼讀取文件的位置將移動到文件開始的地方。每次調用 f.readline()你就將從文件中讀取一行數據,並且將讀取的頭將會移動到這一行最後結尾的\n的右邊。你往下學習的過程會有更多關於這個的解釋。

爲什麼在文件中的行之間有空行?

答:readline() 函數返回了讀取的哪一行最後的 \n 字符。這就意味着由readline()函數讀取返回得到的\n將被打印出來。要改變這種情況很簡單,只要在打印的這一行最後面加上一個逗號(,)它就不會打印出它自己的 \n 了。

爲什麼 seek(0)函數沒有把 current_line 重置爲 0?

答:首先,seek()函數是處理字節的,不是行數。那麼它的作用就是就是讓讀取的頭指向第 0 個字節(文件的第一個字節)。其次,current_line 只是一個變量,跟文件完全沒有任何關聯。我們只是手動的將其遞增操作而已。

+= 是什麼?

答:你知道英語裏面可以將”it is" 簡寫成“it's"嗎?或者我可以將”you are"寫成“you're"?這種寫法叫做縮寫,那麼 += 就是 = 和 + 兩個操作符的一種縮寫形式。x += y 就等同於 x = x+y 。

readline()怎麼知道在哪一行?

答:readline()函數裏面會去掃描文件中的每一個字節知道找到一個 \n 字符,然後停止讀取文件返回此時讀取到的所有數據。而文件句柄 f 在每次調用完readline()函數後負責保持目前讀到的當前位置,這樣的話就可以保證下次繼續調用readline()的時候繼續讀取文件的下一行。

發佈了23 篇原創文章 · 獲贊 7 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章