一混弥、文件修改的兩種方法:
with open('a.txt',mode='r+t',encoding='utf-8') as f:
print(f.writable())
f.seek(7,0)
f.write('SB')
with open('a.txt',mode='r+t',encoding='utf-8') as f:
f.seek(3,0)
f.write('h')
'''
由上例得出結論:硬盤都是用新內容覆蓋舊內容钟些,沒有修改的概念吮螺,但是內存是可以修改的
如何修改文件:
思路:把硬盤的內容先讀入內存洗鸵,然后在內存中修改完畢后斩跌,再覆蓋到硬盤
方式一:如我們常使用的word,notpad++都是此方法
步驟:
1、先將硬盤中文件的內容全部讀入內存淤堵,然后在內存中修改完畢得到一個修改好的結果
2寝衫、將修改的結果覆蓋回原文件
優(yōu)點: 不耗費硬盤
缺點:耗費內存
'''
with open('a.txt',mode='rt',encoding='utf-8') as f1:
data=f1.read()
res=data.replace('lxx','SB')
with open('a.txt',mode='wt',encoding='utf-8') as f2:
f2.write(res)
'''
方式二:
步驟:
1、循環(huán)讀取源文件內容拐邪,一行行修改一行行寫入一個新的臨時文件
2慰毅、刪除源文件
3、將臨時文件重命名為源文件名
優(yōu)點:節(jié)省內存
缺點:耗費硬盤空間
'''
import os
with open('a.txt',mode='rt',encoding='utf-8') as f1,\
open('.a.txt.swp',mode='wt',encoding='utf-8') as f2:
for line in f1:
res=line.replace('SB','lxx')
f2.write(res)
os.remove('a.txt')
os.rename('.a.txt.swp','a.txt')
二扎阶、函數基礎
'''
1汹胃、什么是函數
具備某一功能的工具===》函數
工具的使用:
事先準備好工具==========》函數的定義
遇到應用場景拿來就用====》函數的調用
2、為何要有函數
1东臀、程序的組織結構不清晰着饥,可讀性差
2、如果要用到重復的功能惰赋,只能拷貝功能的實現代碼=》代碼冗余
3宰掉、可擴展性差
3、如何用函數
函數的使用原則:先定義赁濒,后調用
定義函數:
def 函數名(參數1,參數2,參數3,...):
"""文檔注釋"""
代碼1
代碼2
代碼3
...
return 返回值
調用函數:
函數名(值1轨奄,值2,值3,...)
'''
'''
一:函數的基本使用
1拒炎、定義函數:申請內存空間把函數體代碼保存下來挪拟,然后把內存地址綁定給函數名-》函數名=函數的內存地址'''
def sayhi():
print('*'*10)
print('hello')
print('*'*10)
print(sayhi)
'''2、調用函數: 函數名()=> 函數的內存地址()击你,會觸發(fā)函數體代碼的運行'''
sayhi()
sayhi()
sayhi()
'''二:定義函數的三種格式
2.1: 無參函數'''
def login():
inp_name=input("your name: ").strip()
inp_pwd=input("your pwd: ").strip()
if inp_name == "yang" and inp_pwd == "123":
print('login successful')
else:
print('login error')
login()
def sayhi():
print('='*100)
print('hello')
print('='*100)
sayhi()
'''2.2: 有參函數'''
def sayhi(s,n):
print(s*n)
print('hello')
print(s*n)
sayhi('-',20)
sayhi('*',10)
def max2(x,y):
if x > y:
print(x)
else:
print(y)
max2(10,20)
max2(11,22)
'''2.3: 空函數,空函數在項目初期玉组,有些功能還沒做完時,可以先用空函數頂替果漾,防止程序不發(fā)運行'''
def func():
pass
'''三:函數的調用
return:
函數內可以有多個return球切,但只要執(zhí)行一次函數就立刻結束谷誓,并會把return后的值當作本次調用的結果返回
函數可以有三種形式的返回值
1绒障、return 值:返回的就是該值本身
2、return 值1,值2,值3:返回一個元組
3捍歪、沒有return:默認返回None
'''
def max2(x,y):
if x > y:
return x
else:
return y
res=max2(1.1,3.3)
print(res * 12 )
'''
四:函數調用的三種格式
4.1 語句形式:單純地調用一下函數就完了
'''
def sayhi(s,n):
print(s*n)
print('hello')
print(s*n)
sayhi('*',30)
'''4.2 表達式形式:'''
def max2(x,y):
if x > y:
return x
else:
return y
res=max2(11,22) * 12
print(res)
'''4.3 可以把函數的調用當作值傳給另外一個函數'''
print(max2(11,22))
'''
總結:
函數的使用一定要分兩個階段去看:
1户辱、定義階段:只檢測語法,不執(zhí)行代碼
2糙臼、調用階段:執(zhí)行函數體代碼
如果發(fā)生的語法錯誤庐镐,定義階段就會立馬檢測出來'''
def func():
print("hello" # 直接報錯
'''如果發(fā)生的不是語法錯誤,而是邏輯錯誤变逃,只能在調用階段檢測到'''
def func():
xxx
func()
'''示范1:'''
def bar():
print('from bar')
def foo():
print('from foo')
bar()
foo()
'''示范2:'''
def foo():
print('from foo')
bar()
def bar():
print('from bar')
foo()
三必逆、函數參數
'''一:函數的參數分為兩大類:
1、形參:在定義函數時,括號內定義的變量名名眉,稱之為形式參數粟矿,簡稱形參=》變量名'''
def func(x,y):
x=1
y=2
print(x)
print(y)
'''2、實參:在調用函數時损拢,括號內傳入的值陌粹,稱之為實際參數,簡稱實參=》變量值
func(1,2)'''
'''
二:在python中參數的種類
1福压、位置參數:
(1)位置形參:在函數定義階段按照從左到右的順序依次定義形參(變量名)掏秩,稱之為位置形參
特點:必須被傳值
'''
def func(x,y):
print(x,y)
func(1,2)
func(1) # 少一個不行
func(1,2,3) # 多一個也不行
'''
(2)位置實參:在函數調用階段按照從左到右的順序依次定義實參(傳入的變量值),稱之為位置實參
特點:按照位置傳值荆姆,一一對應
'''
def func(x1,x2,x3,x4,x5,x6):
print(x1,x2,x3,x4,x5,x6)
func(1,2,3,4,5,6)
'''
2蒙幻、關鍵字實參:在函數調用階段按照key=value的形式為指定的形參名傳值,該形式稱之為關鍵字實參
特點:在傳值時可以完全打亂順序胆筒,但是仍然能夠指名道姓地為指定的形參傳值
'''
def func(name, age, ):
print(name, age, )
func("yang",18)
func(18,"yang")
func(age=18,name="yang")
'''
注意:可以混用位置實參與關鍵字實參,但是
1 位置實參必須放在關鍵字實參的前面
2 不能為同一個形參重復賦值
'''
def func(name, age, salary):
print(name)
print(age)
print(salary)
func('yang',salary=3.1,age=18)
func('yang',salary=3.1,18) # 錯誤
func('yang', 18, salary=3.1) # 錯誤
func('yang',18,age=19,salary=3.3)
'''
3杆煞、默認形參:在函數定義階段就已經為某個形參賦值,該形參稱之為有默認值的形參,簡稱默認形參
特點: 定義階段就已經被賦值意味著在函數調用階段可以不用為其賦值
'''
def func(x,y=2):
print(x,y)
func(1)
func(1,33333)
'''
注意:
1 默認形參應該放在位置形參的后面
'''
def func(y=2,x): # 錯誤
pass
'''
2 默認形參的值通常應該是不可變類型,因為若值是可變類型,我們獲取到的是一個id地址腐泻,傳入值的時候也是通過id决乎,就會導致傳的每個值都通過這個id存值,使得所有值都放在了一起
'''
def func(name,hobby,hobbies=[]):
hobbies.append(hobby)
print("%s 的愛好是:%s" %(name,hobbies))
func("yang",'play')
func('yang','music')
func("tank",'read')
---------------------------------------
yang 的愛好是:['play']
yang 的愛好是:['play', 'music']
tank 的愛好是:['play', 'music', 'read']
'''
要實現以上單獨存的功能派桩,應該把hobbies放到函數里面定義
'''
def func(name,hobby,hobbies=None):
if hobbies is None:
hobbies=[]
hobbies.append(hobby)
print("%s 的愛好是:%s" %(name,hobbies))
func("yang",'play')
func('yang','music')
func("tank",'read')
------------------------------------
yang 的愛好是:['play']
yang 的愛好是:['music']
tank 的愛好是:['read']
'''
3 默認形參的值只在函數定義階段被賦值一次,函數定義之后的改變對默認形參沒有影響
'''
m=333
def func(x,y=m): # y=333
print(x,y)
m=444
func(1)
def register(name,age,gender='male'):
print(name)
print(age)
print(gender)
register('yang',18,)
register('jack',20,)
register('mary',18,'female')