python學習之路--day08
一、檔案處理補充
檔案內游標移動
1、f.read(n):
I.檔案開啟方式為文字模式時,代表讀取n個字元
II.檔案開啟方式為b模式時,代表讀取n個位元組
只有t模式下read(n)中n代表字元個數
2、其餘的檔案內游標移動都是以位元組為單位如seek,tell,truncate
1)seek有三種移動方式
0 :參照檔案開頭,往後數,只有其既可以在t下用,也可以在b下用
1 :參照指標當前位置往下數
2 :參照檔案末尾,往下數
其中1和2必須在b模式下進行,但無論哪種模式,都是以bytes為單位移動的
f.seek(3,0) 3--位元組,0--方式
2)f.truncate(3):截斷檔案,在第三個字元後新增內容/刪除之後的內容
其檔案的開啟方式必須可寫,但是不能用w或w+等方式開啟(直接清空檔案),所以truncate要在r+或a或a+等模式下測試效果
3)f.tell:游標移動到檔案末尾
# 小程式 import time with open('access.log',mode='rb')as f: f.seek(0,2) while True: line=f.readline() if len(line)==0: time.sleep(小程式0.1) else: print (line,decode('utf-8'),end=' ')
二、函式
1.函式的定義
函式就是在程式中具備某一功能的工具。函式的定義可以理解為事先準備好工具。函式的呼叫即可理解為遇到場景拿來用的行為
2.為什麼用函式
I.程式碼冗餘
II.程式組織結構不清晰,可讀性差
III.擴充套件性差
3.怎麼用函式(函式使用必須遵循一個原則)
I.先定義
定義語法: def 函式名(引數1,參2,參3...) """ 註釋""" 縮排程式碼塊 return 值
II.後呼叫
函式名()
#1. 定義階段: 只檢測語法,不執行程式碼 def func(): print('from func 1') #2. 呼叫階段: 開始執行函式體程式碼 func() # 定義 def func(): print('from func') bar() def bar(): print('from bar') # 呼叫 func()函式的定義與呼叫
4.定義函式的三種形式
1)無參函式
2)有參函式
3) 空函式
# 1. 無參函式 def func(): print('from func') func() # 2. 有參函式 def max2(x,y): # x=1 # y=2 if x > y: print(x) else: print(y) max2(1,2) max2(3,4) # 3. 空函式 def register(): pass定義函式三種形式
5.呼叫函式的三種形式
1)語句形式
2)表示式形式
3)函式的呼叫可以當作另外一個函式的引數傳入
# 1 語句形式 def func(): print('from func') func() # 2 表示式形式 def max2(x,y): if x > y: return x else: return y res=max2(110,220) * 12 print(res) res=len('hello') print(res) # 3 函式的呼叫可以當作另外一個函式的引數傳入 def max2(x,y): if x > y: return x else: return y res=max2(max2(7,9),2) print(res)呼叫函式的三種形式
三、函式的返回值
1.返回值定義
函式體程式碼的執行成果
2.為什麼使用返回值
需要拿到函式的處理結果做進一步處理
3.如何使用
1)返回值的特點: 返回的值沒有型別限制,也沒有個數限制
I: return或者函式沒return:返回值None
II: return 值:返回的就是該值本身
III: return 值1,值2,值3:返回元組(值1,值2,值3)
def func(): return 1,1.2,'aaa',[1,2,3] pass res=func() print(res) #(1, 1.2, 'aaa', [1, 2, 3])
2)return是函式結束執行的標誌,函式內可以有多個return,但只要執行一次函式就立即結束,並且將return後的值當作本次呼叫的結果返回
def func(): print('aaaa') return 1 print('bbb') return 2 print('ccc') return 3 func() #aaaa 只返回第一個return的值
四、函式的引數
1.形參:在定義函式時,括號內指定引數(變數名)
1)位置形參:在定義階段,按從左到右順序依次定義的形參
特點:必須被傳值
def func(x,y,z): print(x,y,z) func(1,2,3) #有且只有三個值,多少都會報錯
2) 預設形參:在定義階段,就已經為某個形參賦值
特點:在定義階段,就已經有值,意味著呼叫階段可以不用為其傳值,但若傳值,則以傳入的值為準
def func(x,y=2): #x與y此時位置不可互換 print(x,y) func(1) # 1 2 func(1,3333333) # 1 3333333 若傳值,則以傳值為準 def register(name,age,sex='male'): print(name,age,sex) register('靚仔',18,) register('花姑娘',16,'female') # 靚仔 18 male # 花姑娘 16 female預設形參
注意:位置形參必須放在預設形參的前面
3) 形參中*與**的用法
I. 形參中帶*:*會將溢位的位置實參存成元組的形式然後賦值其後變數名
def func(x,y,*args):
print(x,y,args)
func(1,2,3,4,5,6) # 1 2 (3, 4, 5, 6)
II.形參中帶**:**會溢位的關鍵字實參存成字典的格式然後賦值其後變數名
def func(x,y,**kwargs):
print(x,y,kwargs)
func(1,y=2,z=3,m=1,n=2) # 1 2 {'z': 3, 'm': 1, 'n': 2}
2.實參:在呼叫函式時,括號內傳入的值(變數值)
1)位置實參:在呼叫階段,按從左到右依次傳入的值
特點:這種傳值方式會與形參一一對應
func(2,1,3)
2) 關鍵字實參:在呼叫階段,按key=value格式傳值
特點:可完全打亂位置,但仍可為指定形參傳值
func(z=3,y=2,x=1)
注意:可以混用關鍵字實參與位置實參,但是 1. 同一個形參只能被賦值一次 2. 位置實參必須跟在關鍵字實參的前面 func(1,z=3,y=2) func(1,z=3,y=2,x=333) func(x=1,2,z=3) # 報語法錯誤
3 )實參中*與**的用法
I. 實參中帶*:先將實參打散成位置實參,然後再與形參做對應
def func(x,y,z):
print(x,y,z)
func(1,[2,3]) # 報錯
func(*[1,2,3]) # 1,2,3
func(*'hello') # 報錯,只需要三個值
func(*'hel') #h e l
II.實參中帶**:先將實參打散成關鍵字實參,然後再與形參做對應
def func(x,y,z):
print(x,y,z)
func(**{'x':1,'z':3,'y':2}) # 1 2 3