臨近畢業,沒有一絲興奮,沒有一點失落,剩下的只有一份釋懷、一顆懷揣着’永不卑微,永不殘忍,永不虛僞‘的赤子之心。我的大學前半部分是精彩奪目的、爭名逐利,後半部分是孤獨的、高山望遠,也印證了那句話:你只有獨處時,才知道自己真正想要什麼、能幹什麼。慶幸自己真正的跳出圈子找到了一個可以爲之奮鬥,爲之拋棄所有(除親情)的目標,我必將踐行之,並永遠走下去...沒有加油,只有拼命二字!
由於這幾天回去拿畢業證書,補6.4、6.5號筆記,文件基本操作、絕對路徑和相對路徑、文件的打開模式、文件可讀可寫、控制文件指針移動、文件修改、函數的基本使用、函數的定義階段和調用階段、函數定義的三種形式
暫時沒時間,先把今天的提交,網大姨媽。
什麼是文件?
文件是操作系統爲用戶或應用程序提供的一個讀寫硬盤的虛擬單位,
文件的操作核心就是:讀、寫
即我們只要進行讀寫操作,就是對操作系統發出請求,然後由操作系統將用戶或者應用程序對文件的讀寫操作轉換成具體的硬盤指令(比如控制盤片轉動,控制機械手臂移動起來讀寫數據)
2.爲什麼要有文件?
因爲內存無法永久保存數據,但凡我們想要永久保存數據都需要保存到硬盤中,而操作文件就可以實現對硬件的操作
3.如何用文件?
1.函數的返回值
返回值是一個函數的處理結果
2.爲什麼要有返回值
如果我們需要在程序中拿到函數的處理結果做進一步的處理,則需要函數必須由返回值
3.函數的返回值的應用
函數的返回值用return定義
格式爲:
return 值
注意:
1.return是一個函數結束的標誌,函數內可以由多個return,但只要執行一次,整個函數就會結束運行
2.return的返回值無類型限制,即可以是任意數據類型
3.return的返回值無數字限制,即可以用逗號分隔開多個任意類型的值
0個:返回None,ps:不寫return默認會在函數的最後一行添加return None
1個:返回的值就是該值本身
多個:返回值是一個元組
def max2(x,y): #x=3000,y=2000 if x > y: return x #return 3000 else: return y #reuturn 2000 res=max2(3000,2000) annual_salary=res * 12 print(annual_salary) def foo(): print(1) print(2) print(3) return [1,2,3],'a',('a','b'),{1,2} print(4) print(5) print(6) res=foo() print(res) def bar(): print(1) print(1) print(1) print(1) return print(2) print(3) print(4) res=bar() print(res)
2.調用函數
1.什麼是調用函數
函數名(...)即調用函數,會執行函數體代碼,知道碰到return結束或者一直運行完畢所有代碼
2.爲何要調用函數
用函數的功能
3.函數調用分爲三種形式
def max2(x,y): if x > y: return x else: return y #形式一: max2(1,2) #形式二: res=max2(3000,2000) * 12 print(res) #形式三: res=max2(max2(1000,2000),3000) print(res)
3.函數的參數
1.形參:在函數定義階段括號內定義的參數,稱之爲形式參數,簡稱爲形參,本質就是變量名
def foo(x,y): #x=1,y=2 print(x) print(y)2.實參:在函數調用階段括號內傳入的值,稱之爲實際參數,簡稱實參,本質就是變量的值
foo(1,2)
詳細分類:
1.位置形參:在函數定義階段,按照從左到右的順序一次定義的形參,稱之爲位置形參
特點:但凡是按照位置定義的形參,都必須被傳值,多一個不行,少一個不行
def foo(x,y): print('x:',x) print('y:',y)
位置實參:在函數調用階段,按照從左到右的順序一次定義的實參,稱之爲位置實參
特點:按照位置爲對應的形參依次傳遞
foo(1,2) foo(2,1)
關鍵字實參:在調用函數時,按照key=value的形式爲指定的參數傳真,稱爲關鍵字實參
特點:可以打破位置的限制,但仍能爲指定的形參賦值
foo(y=2,x=1)
注意:可以混用位置實參與關鍵字實參,但位置實參必須放在關鍵字實參的前面
foo(1,y=2) foo(y=2,1) #SyntaxError: positional argument follows keyword argument # 語法報錯
可以混用,但不能對一個形參重複賦值
foo(1,y=2,x=10)
默認形參:在函數定義階段,就已經爲形參賦值,該形參稱爲默認形參
特點:在定義階段就已經被賦值,意味着在調用可以不用爲其賦值
def foo(x,y=10): print('x:',x) print('y:',y) foo(1) foo(1,3)
注意:位置形參必須放到默認形參的前面,否則會語法報錯
def foo(x=1,y): pass
默認形參的值只在定義階段賦值一次,即默認參數的值在函數定義階段就已經固定死了
m=10 def foo(x=m,y=11): print(x) print(y) m=1111111111111111111111111111111111111111111111111111111111 foo()
默認形參的值通常應該定義不可變類型
def register(name,hobby,hobbies=[]): hobbies.append(hobby) print('%s的愛好' %name,end=':') print(hobbies) register('egon','play') register('alex','piao') register('lxx','燙頭') # 輸出時lxx有三個愛好 def register(name,hobby,hobbies=None): if hobbies is None: hobbies=[] hobbies.append(hobby) print('%s的愛好' %name,end=':') print(hobbies) register('egon','play') register('alex','piao') register('lxx','燙頭') # 輸出時lxx只有一個愛好
總結:
形參的使用,取決於個人習慣
形參的應用:
1.位置形參:大多數情況下的調用值都不一樣,就應該將該參數定義成位置形參
2.默認形參:大多數情況下的調用值都一樣,就應該將該參數定義成默認形參
def register(name,age,sex='male'): print(name) print(age) print(sex) register('egon',18,) register('大腦門',73,'female') register('小腦門',84,) register('大高個',18,)
可變長參數:指的是在調用函數時,傳入的參數個數可以不固定
而調用函數時,傳值的方式無非兩種,一種位置實參,另一種是關鍵字實參
所以對應着,形參也必須有兩種解決方案,來分別接收溢出的位置實參(*)與關鍵字實參(**)
1.形參中的某個參數帶*
形參中的*會將溢出的位置實參全部接收,然後存儲元組的形式,然後把元組賦值給*後的變量名
def foo(x,y,*z): #x=1,y=2,z=(3,4,5,6,7) print(x) print(y) print(z) foo(1,2,3,4,5,6,7)
應用:
def my_sum(*nums): res=0 for num in nums: res+=num return res print(my_sum(1,2,3,4,5))
2.實參中的參數也可以帶*
實參中帶*,*會將該參數的值循環取出,打散成位置實參
ps:以後但凡碰到實參中帶*的,它就是位置實參,應該立馬打散成位置實參去看
def foo(x,y,z): print(x,y,z) foo(1,*[2,3]) #foo(1,2,3) foo(1,*'he') #foo(1,'h','e') foo(1,*(2,3,4)) #foo(1,2,3,4) def foo(x,y,z,*args): print(x) print(y) print(z) print(args) foo(1,2,3,4,5,6,7,*[8,9,10,11]) #foo(1,2,3,4,5,6,7,8,9,10,11)
注意:約定俗成形參中的*變量名的寫法都是:*args
1.形參中的某個參數帶**
形參中的**會將溢出的關鍵字實參全部接收,然後存儲字典的形式,然後把字典賦值給**後的變量名
def foo(x,y,**z): #x=1,y=2,z={'c':5,'b':4,'a':3} print(x) print(y) print(z) foo(1,2,a=3,b=4,c=5)
2.實參中的參數也可以帶**,該參數必須是字典
實參中帶**,**會將該參數的值循環取出,打散成關鍵字實參
ps:以後但凡碰到實參中帶**的,它就是關鍵字實參,應該立馬打散成關鍵字實參去看
def foo(x,y,z): print(x) print(y) print(z) foo(1,2,**{'a':1,'b':2,'c':3,'z':3}) #foo(1,2,c=3,b=2,a=1,z=3) foo(**{'z':3,'x':1,'y':2}) #foo(y=2,x=1,z=3)
注意:約定俗成形參中的**變量名的寫法都是:**kwargs
ef index(name,age,sex): print('welecome %s:%s:%s to index page' %(name,age,sex)) def wrapper(*args,**kwargs): #args=(1,),kwargs={'x': 1, 'y': 2, 'z': 3} index(*args,**kwargs) #index(*(1,),**{'x': 1, 'y': 2, 'z': 3}) #index(1,x=1,y=2,z=3) wrapper(name='egon',sex='male',age=18)
命名關鍵字形參:在函數定義階段,*後面的參數都是命名關鍵字參數(**不太重要)
特點:在傳值時,必須按照key=value的傳,並且key必須命名關鍵字參數指定的參數名
def register(x,y,z,**kwargs): #kwargs={'b':18,'a':'egon'} if 'name' not in kwargs or 'age' not in kwargs: print('用戶名與年齡必須使用關鍵字的形式傳值') return print(kwargs['name']) print(kwargs['age']) register(1,2,3,a='egon',b=18) def register(x,y,z,*args,name='egon',age): print(args) print(name) print(age) register(1,2,3,4,5,6,7,age=18)