一 文件處理補充
控制文件中光標移動
1 f.read(n):
l.文件打開方式為文本模式的時,代表讀取N個字符
ll.文件打開方式為b模式時,讀取N個字節
強調:只有在read(n)模式下 N代表字符個數,除此之外的是以字節為單位
2 f.seek():
光標移動是以字節為單位的整數移動.
三種模式:(分別為0 1 2 代表)
0(默認模式):參照文件開頭 往后數 該模式既可以在t下用 也可以在b下用
1模式:參照光標當前位置往下數
2模式:參照文件末尾往下數
其中1和2必須在b模式下進行,但無論哪種模式,都是以bytes為單位移動的
? ? ? ?f.seek(3,0)? ?3--字節,0--方式
4 f.truncate(3):截斷文件,在第三個字符后添加內容/刪除之后的內容
其文件的打開方式必須可寫,但是不能用w或w+等方式打開(直接清空文件),所以truncate要在r+或a或a+等模式下測試效果
5 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=' ')
二 函數
l 什么是函數
在程序中具備某一功能的工具==>函數
實現準備好工具==>函數的定義
遇到應用場景 拿來就用==>函數的作用
?函數分兩類:內置函數 ?自定義函數
ll 為何要用函數
1 代碼冗余
2 程序的組織結構不清晰 可讀性差
3 擴展性差
lll 如何用函數: 函數的使用必須遵循一個原則
1 先定義
先定義
def 函數名(參數1 參數2 參數3)
"""
文檔注釋
"""代碼1代碼2代碼3
return(返回)值
2 后引用?
? ? 函數名()
#1. 定義階段: 只檢測語法,不執行代碼def func():print('from func 1')#2. 調用階段: 開始執行函數體代碼func()# 定義
def func():print('from func')bar()def bar():print('from bar')# 調用
func()函數的定義與調用
三 定義函數的三種形式
l 無參函數
ll 有參函數
lll 空函數
1. 無參函數
def func():print('from func')func()# 2. 有參函數
def max2(x,y):# x=1# y=2if x > y:print(x)else:print(y)max2(1,2)
max2(3,4)# 3. 空函數
def register():pass
四 調函數的三種形式
l 語句形式
ll 表達式形式
lll 函數的調用可以當作另外一個函數的參數傳入
# 1 語句形式
def func():print('from func')func()
# 2 表達式形式
def max2(x,y):if x > y:return xelse:return yres=max2(110,220) * 12
print(res)res=len('hello')
print(res)# 3 函數的調用可以當作另外一個函數的參數傳入
def max2(x,y):if x > y:return xelse:return yres=max2(max2(7,9),2)
print(res)調用函數的三種形式
五 函數的返回值
1 什么是函數的返回值
?返回值是函數體代碼的運行成果
2 為何要有返回值
?需要拿到函數的處理結果做進一步的處理,則函數必須有返回值
3 如何用:return返回值特點
注: 返回的值沒有類型限制,也沒有個數限制
l return或者函數沒return:返回值為None
ll?return:返回的就是該值本身
lll?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])
lV?return是函數結束運動的標志,函數內可以有多個return,但只要執行一次函數就立即結束,并且將return后的值當作本次調用的結果返回.
def func():print('aaaa')return 1print('bbb')return 2print('ccc')return 3func() #aaaa 只返回第一個return的值
?
四、函數的參數
1.形參:在定義函數時,括號內指定參數(變量名)
1)位置形參:在定義階段,按從左到右順序依次定義的形參
特點:必須被傳值
def func(x,y,z):print(x,y,z)func(1,2,3) #有且只有三個值,多少都會報錯
??
2)? 默認形參:在定義階段,就已經為某個形參賦值
特點:在定義階段,就已經有值,意味著調用階段可以不用為其傳值,但若傳值,則以傳入的值為準?

??注意:位置形參必須放在默認形參的前面?
?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
?
?
?
?
?
?
?