加分練習
通讀腳本,在每一行以前加註解,以理解腳本里發生的事情。
每次 print_a_line 運行時,你都傳遞了一個叫 current_line 的變量,在每次調用時,打印出 current_line 的值,跟蹤一下他在 print_a_line 中是怎樣變成 line_count 的。
找出腳本中每個用到函數的地方。檢查 def 一行,確認參數沒有用錯。
上網研究一下 file 中的 seek 函數是作什麼用的。試着運行 pydoc file 看看能不能學到更多。
研究一下 += 這個簡寫的做用,寫一個腳本,把這個操做用在裏邊試試。
python
1 # 本練習經過腳本的參數獲取被打印的文件名 2 # 所以須要 argv 獲取腳本參數。 3 from sys import argv 4 5 # 第一個函數,打印整個文檔。 6 def print_all(f): 7 print(f.read()) 8 9 # 第二個函數,用來重置指針(至關於光標)到文件開頭的位置 10 def rewind(f): 11 f.seek(0) 12 13 # 函數:打印一個數字表明行號後,打印打印一行文件 14 def print_a_line(line_count, f): 15 print(line_count, f.readline()) 16 17 # 運用以上函數把腳本參數中的文件打印一遍。 18 19 # 獲取腳本參數 20 script, input_file = argv 21 22 # 從函數能夠看出其中對參數 f 使用的方法都是 23 # Py2 的 file 對象(在15題中得知在 Py3中是 TextIOWrapper) 24 # 它們都是被 open 後纔出現的,全部咱們須要打開文件已被被函數調用 25 current_file = open(input_file) 26 27 # 首先打印全文 28 print("First let's print the whole file:\n") 29 print_all(current_file) 30 31 # 打印全文以後指針已經移動到了文檔的末尾,想要作其餘打印須要復位一下。 32 # Zed 比喻這個過程像倒帶同樣 33 print("Now let's rewind, kind of like a tape.") 34 rewind(current_file) 35 36 # 而後指針已經回到起始位置了(0的位置) 37 # 逐行打印 38 print("Let's print three lines:") 39 # 設置一個表明航好的變量,打印第一行 40 current_line = 1 41 print_a_line(current_line, current_file) 42 43 # 變動行號,打印第二行(這裏設置行號並不會改變 44 # f.readline 的行,這個被打印的行號只是給人看的,寫100 也行 45 # 打印過一行以後,指針其實已經在第二行開頭等着了) 46 current_line = current_line + 1 47 print_a_line(current_line, current_file) 48 49 # 重複上一步在打印一行 50 current_line = current_line + 1 51 print_a_line(current_line, current_file)
20.2 current_line 是怎麼變成 line_count 的
這裏其實 line_count 要叫作 位置參數,之因此調用時的參數 current_line 成爲了函數定義時的 line_count 就是由於它們在定義與被調用時所處的位置是同樣的。
若是咱們把函數定義時兩個參數的位置對調,並保持調用的順序不變。或者,函數定義時不變,調用時對調。都會由於行號這個整數(int) 麼有 readline() 這個方法而致使錯誤發生
cookie
20.4 使用 pydoc file 學習 seek 的做用
咱們在 15.讀取文件 提到了 Py3 已經沒有 file 這個東西了,不過咱們利用同樣的方法能夠了解到 seek 的用途。app
仔細看了註釋的同窗能夠發現,seek 是用來設置被 open 打開的文件對象指針。這個指針我愛想象它是打字的光標,read() 的時候光標會從當前位置逐字移動到末尾,每移動一個字就打印這個字( open的打開方式 'r' 'w' 'r+' 'w+' 等影響光標默認位置)。而 readline() 的時候則從當前位置移動到行末至下一行起始位置。函數
另外 seek 還有一個可選參數 whence
學習
它一個可能有三種值 0,1,2spa
默認時是 0 ,表示從文件開始位置計算指針移動多少個 cookie 字節。
1,表示以當前爲開始移動。
2,表示從末尾開始移動。
Python3 VS. Python2
在 Py3 環境中,若是 seek(cookie[,whence]) 面對的是文本文件,而 whence 填寫 1 或 2 時,則 cookie 必須爲 0.net
在 Py2 中,則沒有這樣的條件。指針
20.5 += 操做符(賦值運算符)
+= 這個符號其實和 = 一類,通常都叫作賦值運算符,它還有幾個兄弟姐妹。其意義是:code
左邊已存在的變量,與右邊的值進行運算後,從新賦值給左邊的變量。對象
假設已經有一個變量 a = 6 和一個 b = 2
運算符 描述 等價於 打印結果 print(a)
a = b 賦值 a = b 2
a += b 相加後賦值 a = a + b 8
a -= b 相減後賦值 a = a - b 4
a *= b 相乘後賦值 a = a * b 12
a /= b 相除後賦值 a = a / b 3.0
a %= b 取模後賦值 a = a % b 0
a **= b 冪運算後賦值 a = a ** b 36
a //= b 整除後賦值 a = a // b 3
---------------------
做者:哈哈餐館
來源:CSDN
原文:https://blog.csdn.net/aaazz47/article/details/79594097
版權聲明:本文爲博主原創文章,轉載請附上博文連接!
常見問題回答
print_all 和其它函數裏的 f 是什麼?
和 Ex 18 裏的同樣, f 只是一個變量名而已,不過在這裏它指的是一個文件。Python 裏的文件就和老式磁帶機,或者 DVD 播放機差很少。它有一個用來讀取數據的「磁頭」,你能夠經過這個「磁頭」來操做文件。每次你運行 f.seek(0) 你就回到了文件的開始,而運行 f.readline() 則會讀取文件的一行,而後將「磁頭」移動到 \n 後面。後面你會看到更詳細的解釋。
問什麼文件裏會有間隔空行?
readline() 函數返回的內容中包含文件原本就有的 \n,而 print 在打印時又會添加一個 \n,這樣一來就會多出一個空行了。解決方法是在 print 語句結尾加一個逗號 ,,這樣 print 就不會把它本身的 \n 打印出來了。
python 3x,在結尾加上,end =""。
爲何 seek(0) 沒有把 current_line 設爲 0?
首先 seek() 函數的處理對象是 字節 而非行,因此 seek(0) 只是轉到文件的 0 byte,也就是第一個 byte 的位置。其次, current_line 只是一個獨立變量,和文件自己沒有任何關係,咱們只能手動爲其增值。
+= 是什麼?
英語裏邊 「it is」 能夠寫成 「it’s」,」you are」 能夠寫成 「you’re」,這叫作簡寫。而這個操做符是吧 = 和 + 簡寫到一塊兒了。 x += y 的意思和 x = x + y 是同樣的。
readline() 是怎麼知道每一行在哪裏的?
readline() 裏邊的代碼會掃描文件的每個字節,直到找到一個 \n 爲止,而後它中止讀取文件,而且返回此前的文件內容。文件 f 會記錄每次調用 readline() 後的讀取位置,這樣它就能夠在下次被調用時讀取接下來的一行了。
readline() 函數返回的內容中包含文件原本就有的\n,而 print 在打印時又會添加一個\n, 這樣一來就會多出一個空行了。解決辦法時在print函數中多加一個參數 end="",這個print就不會爲每一行多打印\n出來了
從Python中readline()函數讀取的一行內容中含有換行符\n,不少時候咱們須要處理不含有換行符的字符串,此時就要去掉換行符\n。
方法是使用strip()函數。
例子以下:
1 file = open('test.txt') 2 3 line = readline(file) 4 5 while line: 6 line = line.strip('\n') 7 line = readline(file) 8 9 file.close()