1. 程式人生 > >python學習第三個坑

python學習第三個坑

cat 自定義函數 min 類型 一個 默認參數 變長參數 是個 分隔

##########################python 第三章 ################################
這一章呢,主要是文件的操作,還有涉及到函數的一部分.

PS:整理博客很是費事,這就是我寫的筆記,本來在線下挺好看的。拿到這裏就成這熊樣了,沒辦法。。。湊活著看吧


文件操作:


文件操作一般用open,或者用file,
格式如下:
變量名 = open(‘文件路徑‘,‘模式‘,‘字符編碼‘)

讀取文件需要操作硬件,用戶是無法直接操作硬件的,一般操作系統才有這個功能去調用硬件,所以當你告訴你
操作系統去讀取a.txt 這個文件的時候,操作系統會返回一個文件的標識,這個標識就是文件句柄,你只有
拿到了這個文件的句柄你才可以去進行操作.操作完成之後一定要關閉它,不要老是占著茅坑不拉屎.別人還得用
呢.

文件操作從大的方向來說,無非就是兩種: 讀 寫.然後這兩個下面就開始分化了.
1.讀
讀根據需求又分:
只讀: r 只能讀,不能寫
讀寫: r+ 可以讀,也可以寫,但是
二進制讀: rb(r+b) 這個是安照二進制的格式讀取.(比如讀取非文本的時候,就必須用到b)

#####註意#######

1. 如果一個文件不存在,讀的時候會報錯

###### ####################################
讀的一些操作:
f = open(‘a.txt‘,‘r‘,encoding=‘utf-8‘) #獲取文件句柄
data = f.read()
f.close() #關閉文件
print(data) #大打印文件內容

讀文件的幾個方法:
read() : 讀取文件的所有內容到內存,如果文件過大,不要這樣.
readlines(): 讀取文件的所有內容到內存,返回的是一個列表
readline() : 讀取文件,但是不會全部讀取,而是一行行 的讀取.栗子如下:
f = open(‘a.txt‘,‘r‘,encoding=‘utf-8‘)
f.seek(0)
data = f.readline()
while data:
print(data.strip())
data = f.readline().strip()
f.close()
readable() : 檢查文件是否可讀,返回bool值.

##這個是讀取一個圖片的例子
import os
with open(‘sb.jpg‘,‘rb‘) as read_f,open(‘new_sb.jpg‘,‘wb‘) as write_f:
write_f.write(read_f.read())
os.remove(‘sb.jpg‘)
os.rename(‘new_sb.jpg‘,‘sb.jpg‘)

關閉文件的參數:
close() : 關閉文件
closed() : 是否關閉了文件

2.寫
寫根據需求又分:
只寫: w 只能寫,不能讀
寫讀: w+ 可以寫,也可以讀
二進制寫: wb(w+b) 這個是安照二進制的格式寫.(比如寫非文本的時候,就必須用到b)


########### 註意 #########

1. 使用write的時候,是把文件給清空,然後在寫入,原有的文件內容不存在
2. 如果文件不存在,則創建

####################################


寫的操作方法:
write(): 寫入內容
writelines() : 寫的是可以叠代的對象,他會對這個東西進行逐個的叠代.然後寫入文件
writeable() : 檢測是否可寫


這裏出現了一個新的寫------追加
追加: a 這個只追加,
讀寫: a+ 這個可以寫,可以讀
二進制追加: ab(a+b) 這個是安照二進制的格式追加.(比如寫非文本的時候,就必須用到b)

追加的操作方法:
和寫的操作方法,一樣,不過是在內容的結尾增加

文件其他的操作方法:
seek(): 光標到內容的任意地方,不過是按照字節來的.有三個數字 0 1 2
0 ---> 文章的開頭
1 ---> 當前光標的位置
2 ---> 文章的結尾

seek(p,0) 移動當文件第p個字節處,絕對位置
seek(p,1) 移動到相對於當前位置之後的p個字節
seek(p,2) 移動到相對文章尾之後的p個字節

truncate(): 截斷,也是按照字節來的,只保留前面的,後面的不要
flush(): 刷新到磁盤上


操作文件的另個一個方法叫 上下文管理,如果這麽寫了的話,就不不需要在寫close()這個方法了.
with open(‘a.txt‘,‘r‘,encoding=‘utf-8‘) as f1,open(‘b.txt‘,‘w+‘,encoding=‘utf-8‘) as f2:
print(f1.readlines())
print(f2.readlines())

一個簡單tail -f 功能
import time
with open(‘access.log‘,‘r‘,encoding=‘utf-8‘) as read_f:
read_f.seek(0,2)
while True:
data = read_f.read().strip()
if data:
print(‘新增一行數據: ‘,data)
time.sleep(0.5)

########################## 函數 ################################

函數使用的原因:
1. 方便管理
2. 減少了代碼冗余,
3. 有結構性,可讀性高


在python 函數分為兩類: 一個是內置函數, 一個是自定義函數
內置函數:
這種的最常見了,字符串常見的方法就是一個個的函數
比如說list中的 max min reserve sort 等等
自定義函數:
顧名思義,自己定義的函數,至於為啥定義,還不是系統中的函數滿足不了自己的需求
格式:
def 函數名():
函數體
......

函數的參數:
從大的角度來分,有兩種分為實參和形參,實參一在函數調用的時候,形參在函數創建的時候

###定義階段
def print_new(x,y,z): ##這裏的x,y就是形參,形參起站位的作用,而且在調用的時候必須傳值.
print(y) ## 傳的值必須對應
print(y)
print(z)

###調用階段
print_new(1,2,3) ##這裏的1和2就是實參 ,有兩種方法來傳值,如果是明確指定的話,可以不用
print_new(y=2,x=2222,z=666)##理會參數的順序


繼續細分的話有以下幾種參數:
位置參數,關鍵字參數,默認參數,可變長參數(*args,**kwargs),命名關鍵字參數


位置參數: 不在解釋,上面的例子就是位置參數

關鍵字參數: key=value這種情況,就是在函數調用的時候輸入的東西,print_new(y=2,x=1111),這種的就
就叫關鍵字參數
####註意事項###
1:關鍵字實參必須在位置實參後面
print_new(1,y=222,z=6666)
2: 不能重復對一個形參數傳值
print_new(2,x=2,z=666,y=222) ###這個是錯誤的

默認參數: 之所以會出現這個東西,就是因為減少了重復的操作.
例子:
def new_foo (name,sex,age=18):
a=‘{}的性別是{},他的年齡是{}‘
print(a.format(name,sex,age))
new_foo(‘劉康‘,‘男
如果用戶不輸入age,將自動使用函數裏面的值,如果用戶輸入了值,則使用戶輸入的值

#####註意事項#####
1. 在定義默認參數的時候,一定要寫在位置參數後面,
2. 默認參數只在定義階段定義,且只定義一次(也就是說,
即使你在外面聲明了變量,還是改變不了結果)
age=20
def new_foo (name,sex,age=18):
a=‘{}的性別是{},他的年齡是{}‘
print(a.format(name,sex,age))
age = 16
new_foo(‘劉康‘,‘男‘) ##age的結果仍是18
3. 默認參數的值通常定義成不可變類型


可變長參數: 這個參數分為兩種一個是 *args 另一個是 **kwargs

1. *args :
*會把溢出的按位置定義的實參都接收,以元組的形式賦值給args
def test_foo (x,y,*args):
print(x,y)
print(args) ###這個地方打印的其實是元組
test_foo(111,222,333,444,555)
>>> 111 222
(333,444,555)


2. **kwarges: 這個會把溢出的默認參數都接受,以字典的形式給kwargs
def test_foo2 (x,y,**kwargs):
print(x,y)
print(kwargs) ###這個地方打印的其實是個字典
test_foo2(‘liu‘,‘kang‘,name=‘liukang‘,age=18)

def foo (name,age,**kwargs):
print(name,age)
if ‘sex‘ in kwargs:
print(kwargs[‘sex‘])
if ‘height‘ in kwargs:
print(kwargs[‘height‘])

foo(‘liukagn‘,18,sex=‘男‘,height=188)

命名關鍵字參數:很奇葩的一個,用"*" 號分隔

def foo_name (name,age,*,sex=‘男性‘,height):
print(name,age)
print(sex,height)
foo_name(‘liukang‘,18,height=188)
# 調用的時候*號後面的參數就是命名關鍵字參數,這類參數必須傳值,而且必須以關鍵字
# 實參的方式去傳值


一個小例子,說了*args和**kwargs的關系,另外,如果用了*args 和**kwargs那麽可以接受所有的參數
def foo(x,y,z):
print(‘from foo: ‘,x,y,z)
def foo2(*args,**kwargs):
print(args) #(1,)
print(kwargs) #{‘z‘:2,‘y‘:3}
foo(*args,**kwargs) #foo(*(1,),z=2,y=3)
foo2(1,z=2,y=3)
##上面的效果和下面的一樣
foo(*(1,),z=2,y=3)

python學習第三個坑