python 基礎(chǔ) 4
1.遞歸
1.遞歸就是函數(shù)自己調(diào)用自己,遞歸必須設(shè)置彈出條件。就是結(jié)束條件
2.每次進(jìn)入更深一層的遞歸,問(wèn)題規(guī)模必須比上一次小
def calc(n):
print(n)
if int(n/2)==0:
return n
res = calc(int(n/2))
return res
calc(10)
a = calc(10)
print(a)
2.文件
# 要知道文件的路徑 path
# 文件的打開(kāi)方式 r w
# 編碼方式 encoding decode
#文件
'''
文件操作:
1.打開(kāi)文件
2.對(duì)文件句柄進(jìn)行操作
3.關(guān)閉文件
報(bào)錯(cuò)原因:
UnicodeDecodeError: 創(chuàng)建文件時(shí)使用的編碼方式和打開(kāi)文件的解碼方式對(duì)不上
SyntaxError: 一般就是windows 路徑上的 '\' 沒(méi)改成 '\\';文件名不能用單獨(dú)的數(shù)字
'''
#絕對(duì)路徑
#f1 = open(r'D:\programming_with_python\043從零開(kāi)始學(xué)python\day04\文件的讀.txt',encoding='utf-8',mode='r')
#相對(duì)路徑
# 讀打開(kāi)模式
'''
r, rb, r+, r+b
rb:非文本文件
r:文本文件
'''
# 文本文件
# read 全讀出來(lái) **
f = open('文件的讀.txt',encoding='utf-8')
content = f.read()
print(content,type(content))
f.close()
# read(n) 按照字符讀取
f = open('文件的讀.txt',encoding='utf-8')
content = f.read(5)
print(content)
f.close()
# readline() 按行讀取
f = open('文件的讀.txt',encoding='utf-8')
print(f.readline())
print(f.readline())
print(f.readline())
f.close()
# readlines() 返回一個(gè)列表,列表中的每個(gè)元素時(shí)原文件的每一行
f = open('文件的讀.txt',encoding='utf-8')
l1 = f.readlines()
print(l1)
f.close()
# for 讀取 適合大文件的讀取 ***
f = open('文件的讀.txt',encoding='utf-8')
for line in f:
print(line)
f.close()
# 非文本文件 rb
f = open('美女.jpg',mode='rb')
content = f.read()
print(content)
f.close()
#r+ 文件
#r+ 讀并追加,先讀到全文再寫(xiě),就是追加
f = open('文件的讀.txt',encoding='utf-8',mode='r+')
content = f.read()
print(content)
f.write('人的一切痛苦,本質(zhì)上都是對(duì)自己無(wú)能的憤怒')
f.close()
#先寫(xiě)再讀,就會(huì)從寫(xiě)完的部分之后開(kāi)始都到末尾
'''
文件的寫(xiě)
四種模式
w wb w+ w+b
'''
#文件不存在,就可以新建
f = open('文件的寫(xiě)',encoding='utf-8',mode='w')
f.write('隨便寫(xiě)點(diǎn)啥')
f.close()
#如果文件存在,先清空源文件內(nèi)容,再寫(xiě)入新內(nèi)容
f = open('文件的寫(xiě)',encoding='utf-8',mode='w')
f.write('一山最帥')
f.close()
#wb 非文本
f = open('美女.jpg',mode='rb')
content = f.read()
f.close()
f1 = open('美女2.jpg',mode='wb')
f1.write(content)
f1.close()
'''
a ab a+ a+b
'''
#當(dāng)文件不存在,就創(chuàng)建一個(gè)
f = open('.\\文件的追加',encoding='utf-8',mode='a')
f.write('太白最帥。。。')
f.close()
#有文件,就可以再后邊去追加字符
f = open('文件的追加',encoding='utf-8',mode='a')
f.write('大壯,舒淇,b哥,學(xué)費(fèi)')
f.close()
'''
對(duì)文件句柄操作的功能
read() readline() readlines() write()
'''
#tell() 告訴你光標(biāo)的位置,代為字節(jié)
f = open('文件的讀.txt',encoding='utf-8')
print(f.tell())
content = f.read()
print(f.tell())
f.close()
#seek() 調(diào)整光標(biāo)位置
f = open('文件的讀.txt',encoding='utf-8')
print(f.seek(7))
content = f.read()
print(f.tell())
f.close()
#flush() 強(qiáng)制刷新,保存
f = open('文件的其他功能.txt',encoding='utf-8',mode='w')
f.write('sdfsfjsofjsdfj')
f.flush()
f.close()
'''
修改:
1.以讀的方式打開(kāi)原文件
2.以寫(xiě)的方式創(chuàng)建一個(gè)新文件
3.將原文件內(nèi)容讀出來(lái)修改成新內(nèi)容,寫(xiě)入新文件
4.將原文件刪除
5.將新文件重命名為原文件
'''
# LOW 版
import os
# 1.
# 2.
# with open('alex自述.txt',encoding='utf-8') as f1,\
# open('alex自述back.txt',encoding='utf-8',mode='w') as f2:
# #3.
# old_content = f1.read()
# new_content = old_content.replace('alex','SB')
# f2.write(new_content)
# #4.
# os.remove('alex自述.txt')
# os.rename('alex自述back.txt','alex自述.txt')
# 進(jìn)階版
with open('alex自述.txt', encoding='utf-8') as f1, \
open('alex自述back.txt', encoding='utf-8', mode='w') as f2:
# 3.
for line in f1:
new_line = line.replace('SB', 'alex')
f2.write(new_line)
# 4.
os.remove('alex自述.txt')
os.rename('alex自述back.txt', 'alex自述.txt')
# 有關(guān)清空的問(wèn)題
# 關(guān)閉文件句柄,再次以 'w' 模式打開(kāi)次文件,才會(huì)清空,
# 如果,沒(méi)關(guān)閉文件呢,連續(xù)寫(xiě)入不會(huì)清空文件
with open('文件的讀.txt', encoding='utf-8', mode='w') as f1:
for i in range(9):
f1.write("快還貸款!")
3. 迭代器
#判斷一個(gè)對(duì)象是不是可迭代對(duì)象,可以用 dir() 函數(shù) 來(lái)獲取這個(gè)對(duì)象的所有方法,如果里邊#有 "___iter__",他就是可迭代對(duì)象
s1 = 'fjdskd'
#print(dir(s1))
print('__iter__' in dir(s1)) #返回的布爾值為T(mén)rue就是可迭代的
# 可迭代對(duì)象有 str list tuple dict set range 文件句柄等
# 可迭代對(duì)象優(yōu)點(diǎn)
# 1.存儲(chǔ)的數(shù)據(jù)直接可以顯示,比較直觀
# 2.擁有的方法比多,操作方便
# 缺點(diǎn):
# 1.占用內(nèi)存高
# 2.不能直接通過(guò) for 循環(huán),不能直接取值,必須先轉(zhuǎn)化成迭代器
# 啥是迭代器?
# 內(nèi)部含有'__iter__' 并且含有 '__next__' 方法的對(duì)象就是迭代器
# 判斷是否是迭代器,就判斷'__iter__'和'__next__' 在不在dir(對(duì)象)中
# 判斷文件句柄是不是迭代器
#判斷對(duì)象是否是迭代器
with open('file1',encoding='utf-8',mode='w') as f1:
print(('__iter__' in dir(f1)) and ('__next__' in dir(f1)))
#可迭代對(duì)象可以轉(zhuǎn)化為迭代器
s1 = 'jofjs'
obj = iter(s1) #或者 s1.__iter__() 都可以
print(obj)
#迭代器可以一個(gè)一個(gè)取值,下邊這倆都行,每寫(xiě)一次迭代代碼,就彈出來(lái)一個(gè)值
print(next(obj)) #print(obj.__next__())
print(next(obj)) #print(obj.__next__())
print(next(obj)) #print(obj.__next__())
print(next(obj)) #print(obj.__next__())
print(next(obj)) #print(obj.__next__())
#如果迭代超出范圍了,就會(huì)報(bào)錯(cuò)
l1 = [1,2,3,4,5,6,7]
obj2 = iter(l1)
print(next(obj2))
print(next(obj2))
print(next(obj2))
print(next(obj2))
print(next(obj2))
print(next(obj2))
print(next(obj2))
print(next(obj2))
#for i in range(7):
# print(next(obj2))
##迭代器有啥用呢?
##迭代器的優(yōu)點(diǎn):
##1.節(jié)省內(nèi)存!
##2.惰性機(jī)制,執(zhí)行一個(gè)next()就取一個(gè)值,不next()就不取值。有一個(gè)迭代器模式可以很好的解釋上面這兩條:迭代是數(shù)據(jù)處理的基石。掃描內(nèi)存中放不下的數(shù)據(jù)集時(shí),我們要找到一種惰性獲取數(shù)據(jù)項(xiàng)的方式,即按需一次獲取一個(gè)數(shù)據(jù)項(xiàng)。這就是迭代器模式。
##缺點(diǎn):
##1.速度慢
##2.不走回頭路的,他會(huì)記住你當(dāng)前取值的位置,你下一次取值不執(zhí)行,就一直在這停留
#可迭代對(duì)象于迭代器的對(duì)比
1. 可迭代對(duì)象是一個(gè)操作方法比較多,比較直觀,存儲(chǔ)數(shù)據(jù)相對(duì)少的數(shù)據(jù)集
2. 當(dāng)你側(cè)重于對(duì)數(shù)據(jù)的靈活處理,并且內(nèi)存足夠多的時(shí)候,可迭代對(duì)象是好的選擇
1.是一個(gè)非常節(jié)省內(nèi)存,可以記錄取值位置,可以直接通過(guò)循環(huán)+next方法取值,但是不直觀,操作方法比較單一的數(shù)據(jù)集。
2當(dāng)你的數(shù)據(jù)量過(guò)大,大到足以撐爆你的內(nèi)存或者你以節(jié)省內(nèi)存為首選因素時(shí),將數(shù)據(jù)集設(shè)置為迭代器是一個(gè)不錯(cuò)的選擇。(可參考為什么python把文件句柄設(shè)置成迭代器)。
#while 循環(huán)模擬 for循環(huán)對(duì)可迭代對(duì)象的取值
l1 = [1,2,3,4,5,6,7,8]
#將可迭代對(duì)象轉(zhuǎn)化為迭代器
obj = iter(l1)
while True:
try:
print(next(obj))
except StopIteration:
break