前言回顧
1.函數(shù)作為變量
實(shí)參高階函數(shù)、返回值高階函數(shù)
列表.sort(),sorted(),max(),min()函數(shù)中key參數(shù)
key要求:一個(gè)函數(shù)、有一個(gè)參數(shù)、有一個(gè)返回值
2.迭代器和生成器
迭代器:將其他序列轉(zhuǎn)換成迭代器、生成器
獲取元素:next(),for-in !脾还!僅有兩種
iter1 = iter('hello')
print(next(iter1))
print(iter1.__next__()) # 不常用
print(next(iter1))
for x in iter1:
print(x)
生成器:調(diào)用帶有yield生成器關(guān)鍵字的函數(shù),就可以得到一個(gè)
一個(gè)生成器能夠產(chǎn)生多少數(shù)據(jù)入愧,看函數(shù)執(zhí)行完成會遇到多少次yield
def func1(num, pre=''):
width = len(str(num))
for x in range(1, num+1):
yield pre+str(x).zfill(width)
id_gen = func1(100)
print(next(id_gen))
print(next(id_gen))
id_gen2 = func1(50, 'py1902')
print(next(id_gen2))
# 每次都會創(chuàng)建新的生成器然后獲取第一個(gè)元素
print('===:', next(func1(60)))
print('===:', next(func1(60))) # 這是生成了兩個(gè)生成器
# 所以需要保存
1.生成式
生成式本質(zhì)還是生成器鄙漏,只是寫法更簡潔
1)生成式的寫法
a.語法1:
(表達(dá)式 for 變量 in 序列)
b.展開:
def func():
for 變量 in 序列:
yield 表達(dá)式
func()
c.說明:
() - 固定寫法
表達(dá)式 - 除了賦值語句以外的任何語句嗤谚,比如:數(shù)據(jù)、賦值過的變量怔蚌、運(yùn)算表達(dá)式巩步、函數(shù)調(diào)用表達(dá)式等
這個(gè)表達(dá)式一般都和后面的變量有聯(lián)系
- 語法二:
a.語法
(表達(dá)式 for 變量 in 序列 if 條件語句)
b.展開
def func():
for 變量 in 序列:
if 條件語句:
yield 表達(dá)式
gen = func()
- 補(bǔ)充:python的三目運(yùn)算符
c語言 - 條件語句?值1:值2 (條件語句為真桦踊,表達(dá)式結(jié)果為值1椅野,否則是值2)
python - 值1 if 條件語句 else 值2 (如果條件語句為真整個(gè)表達(dá)式的結(jié)果為值1,否則為值2)
print('=====補(bǔ)充=====以下')
a = 10
b = 20
result = a if a > b else b
print(result)
# 展開
if a > b:
result = a
else:
result = b
print('=====語法2=====以下')
gen = ('str%d' % x for x in range(15) if x % 2)
for item in gen:
print(item)
# str1, str3, str5, str7, str9, str11, str13
print('=====語法1=====下面')
gen1 = (10*x for x in range(5)) # for循環(huán)控制著生成器的數(shù)據(jù)數(shù)量
print(gen1)
print(next(gen1))
print(next(gen1))
print(next(gen1))
print(next(gen1))
print(next(gen1))
# print(next(gen1)) # StopIteration
gen2 =('str'+str(x) for x in range(15))
for str1 in gen2:
print(str1)
交換字典中key和value的值
dict1 = {'a': 1, 'b': 2, 'c': 3}
gen3 = ((value, key) for key, value in dict1.items())
print(next(gen3)) # (1, 'a')
print(dict(gen3)) # {2: 'b', 3: 'c'}
一句話實(shí)現(xiàn)交換一個(gè)字典的key和value(面試題)
dict1 = {'a': 1, 'b': 2, 'c': 3}
newdict = dict(((value, key) for key, value in dict1.items()))
print(newdict)
# 展開
def func():
for key, value in dict1.items():
yield value, key # 沒寫括號籍胯,元組的寫法
gen = func()
dict2 = dict(gen)
print(dict2)
# [(1, 'a'),(2, 'b'),(3, 'c')] -> {1: 'a', 2: 'b', 3: 'c'}
# for item in gen:
# print(item)
練習(xí)實(shí)現(xiàn)自己的dict()函數(shù)竟闪,可以將序列轉(zhuǎn)換成字典
def yt_dict(seq):
temp = {}
for item in seq:
if len(item) != 2:
raise ValueError # 拋出異常
list1 = list(item)
temp[list1[0]] = list1[1]
return temp
dict2 = yt_dict([(1, 3), (3, 8), (10, 2)])
print(dict2)
def my_dict(seq): # mine
dict1 = {}
for item in seq:
if len(item) != 2:
return False
else:
dict1[item[0]] = item[1]
return dict1
print(my_dict([(1, 'a'), (2, 'b'), (3, 'c')]))
list1 = list('abc')
# 解析內(nèi)部轉(zhuǎn)換過程
def my_list(seq):
temp = []
1.數(shù)據(jù)持久化
程序中產(chǎn)生的數(shù)據(jù)默認(rèn)保存在內(nèi)存中,程序數(shù)據(jù)會自動(dòng)銷毀杖狼。
如果希望程序結(jié)果數(shù)據(jù)不銷毀炼蛤,那么需要對這個(gè)數(shù)據(jù)做數(shù)據(jù)持久化
!! 內(nèi)存是計(jì)算機(jī)的工作場所,硬盤用來存放暫時(shí)不用的信息
數(shù)據(jù)持久化:將數(shù)據(jù)保存到文件中蝶涩,然后將文件保存在磁盤/硬盤中
2.文件操作(對文件內(nèi)容進(jìn)行操作)
基本步驟:打開文件 -> 操作文件(讀/寫) -> 關(guān)閉文件(文件對象.close())
- 打開文件
open(file, mode='r, encoding=None) - 以指定的方式打開文件理朋,并且返回文件對象
說明:
file - 文件路徑,可以寫絕對路徑绿聘,也可以寫相對路徑
a.絕對路徑(一般不用) - 完整路徑嗽上,文件在硬盤上真正存在的路徑 如:D:/wamp/www/img/icon.jpg
b.相對路徑(需要先將文件保存在工程目錄下) - 就是自己相對與目標(biāo)位置。
.\ - 代表當(dāng)前目錄(當(dāng)前目錄可以省略.)
..\ - 代表當(dāng)前目錄的上層目錄
...\ - 代表當(dāng)前目錄的上層目錄的上層目錄
以此類推
注意:當(dāng)前目錄指的是當(dāng)前代碼所在的文件對應(yīng)的目錄
(Mac操作系統(tǒng)路徑為:/ windows操作系統(tǒng)路徑為:)
mode - 字符串斜友,文件的打開方式(決定打開文件后能夠進(jìn)行的操作炸裆,和操作方式)
'r' - 以只讀的方式打開文件垃它,讀出來的數(shù)據(jù)是字符串
'w' - 以只寫的方式打開文件鲜屏,寫入的數(shù)據(jù)是字符串(覆蓋原文件內(nèi)容)
'rb'/'br' - 以只讀的方式打開文件,讀出來的數(shù)據(jù)是二進(jìn)制數(shù)據(jù)
'wb'/'bw' - 以只寫的方式打開文件国拇,寫入的數(shù)據(jù)是二進(jìn)制數(shù)據(jù)
'a' - 以只寫的方式打開文件洛史,寫入的數(shù)據(jù)是字符串(在原文件的最后添加內(nèi)容)
注意:如果是以讀的方式打開文件,文件不存在會出現(xiàn)異常(報(bào)錯(cuò):FileNotFindError)
如果是以寫的方式打開文件酱吝,文件不存在不會報(bào)錯(cuò)也殖,并且會自動(dòng)創(chuàng)建這個(gè)文件
encoding - 字符,文本編碼方式(數(shù)據(jù)的展示)
'utf-8'(mac默認(rèn)) - 支持中文
'gbk'(windows默認(rèn)) - 只支持英文
注意:只有文本文件才能設(shè)置encoding务热,二進(jìn)制操作不能設(shè)置encoding
查看一個(gè)系統(tǒng)方法忆嗜,進(jìn)入dos命令,輸入ipython崎岂,然后輸入help(函數(shù)名)
print('=====打開文件')
# 使用絕對路徑打開test.txt文件
open('E:\Python_space\day12文件操作\\files\\test.txt')
# 使用相對路徑打開文件
open('.\\files\\test.txt')
# f保存文件對象捆毫,只有打開文件才能得到文件對象
f = open('files\\test.txt', 'r', encoding='utf-8')
# f = open(r'files\test.txt', 'r', encoding='utf-8') 前面加r,防止反編譯
- 操作文件
1.讀操作:
文件對象.read() - 返回文件中的內(nèi)容(從讀寫位置獲取到文件結(jié)尾)
文件對象.readline() - 讀一行內(nèi)容(從讀寫位置)
f = open('files\\test.txt', 'r', encoding='utf-8')
print('=====讀取全部數(shù)據(jù)=====')
content = f.read() # 讀取所有數(shù)據(jù)
print(type(content))
print(content)
print('===:', f.read()) # 數(shù)據(jù)讀取完畢后冲甘,不能再讀出數(shù)據(jù)(相當(dāng)于光標(biāo))
# 設(shè)置讀寫位置在文件開頭
f.seek(0)
print('more one=:', f.read())
f.close()
print('=====讀取一行數(shù)據(jù)=====')
f1 = open('files\\test.txt', 'r', encoding='utf-8')
print(f1.readline())
print(f1.readline())
# 讀不到內(nèi)容的時(shí)候返回空串
content = f1.readline()
print('===:', content, type(content))
f1.close()
練習(xí):讀一個(gè)本地的txt文件中的內(nèi)容绩卤,一行一行的讀途样,讀完為止
print('===練習(xí):')
f2 = open('files\\test1.txt', 'r', encoding='utf-8')
con = f2.readline()
while con:
print(con)
con = f2.readline()
# while True:
# content = f2.readline()
# print(content)
# if not content:
# break
f2.close()
2.寫操作
文件對象.write(內(nèi)容) - 將內(nèi)容寫入指定文件
'w'/'a' - 內(nèi)容要求是字符串類型
'bw'/'wb' - 內(nèi)容要求是二進(jìn)制(bytes)
w - 直接覆蓋原文件
a - 在原文件的基礎(chǔ)上追加
f3 = open(r'files\test.txt', 'w', encoding='utf-8')
f3.write('嗷嗚,惡龍咆哮')
3.二進(jìn)制數(shù)據(jù)(bytes)
- 數(shù)據(jù)來源:
a.將其他類型轉(zhuǎn)換成bytes類型:
整型和字符串都可以轉(zhuǎn)換成bytes
b.以'rb'/'br'的方式讀文件
# 整型轉(zhuǎn)bytes
print(bytes(10))
# 布爾轉(zhuǎn)bytes
print(bytes(True))
# 字符串轉(zhuǎn)bytes
b1 = bytes('你好', encoding='utf-8')
print(b1)
b2 = '你好'.encode()
print(b2)
# 將bytes轉(zhuǎn)字符串
str1 = str(b1) # 輸出這個(gè)二進(jìn)制字符串
print('str1:', str1) # str1: b'\xe4\xbd\xa0\xe5\xa5\xbd'
str1 = str(b1, encoding='utf-8') # 將這個(gè)二進(jìn)制進(jìn)行編碼濒憋,輸出字符串
print('str1:', str1) # str1: 你好
str1 = b1.decode(encoding='utf-8')
print('str1:', str1)
f4 = open(r'files\test.txt', 'wb')
f4.write('abc'.encode())
# f4 = open(r'files\test.txt', 'wb')
# f4.write('abc')
3.二進(jìn)制文件的讀寫
圖片何暇,視頻,音頻等都是二進(jìn)制文件凛驮,這些文件只能以帶'b'的方式打開然后操作
# 二進(jìn)制讀操作
image_f = open('files\兔子.jpg', 'rb')
image_data = image_f.read()
print(type(image_data), image_data)
# 二進(jìn)制寫操作
n_f = open('new.jpg', 'wb') # [寫]的時(shí)候打開一個(gè)不存在的文件裆站,會創(chuàng)建一個(gè)新的文件
n_f.write(image_data) # 'w','a','wb'
1.打開文件
with open() as 文件對象:
文件的操作
上述代碼功能如下:
文件對象 = open()
文件操作
文件關(guān)閉.close()
2.數(shù)據(jù)持久化
0.要為這個(gè)數(shù)據(jù)創(chuàng)建對應(yīng)的本地文件
1.程序中需要這個(gè)值的時(shí)候,從文件中去讀取這個(gè)數(shù)據(jù)的值
2.這個(gè)數(shù)據(jù)的值發(fā)生改變以后要將最新的數(shù)據(jù)更新到本地文件中
練習(xí):統(tǒng)計(jì)程序啟動(dòng)次數(shù)(將當(dāng)前程序的啟動(dòng)次數(shù)打印出來)
# 1.將數(shù)據(jù)從文件中讀出來
with open('newfile.txt', 'r', encoding='utf-8') as f:
count = int(f.read())
# 2.更新數(shù)據(jù)
count += 1
print(count)
# 3.更新文件
with open('newfile.txt', 'w', encoding='utf-8') as f:
f.write(str(count))
# [
# {'name': '小明', 'age': 23},
# {'name': '張三', 'age': 19}
# ]
import json
(需要導(dǎo)入模塊黔夭,import語句一般寫在文件開頭)
1.什么是json數(shù)據(jù)(特別重要遏插,實(shí)用性!)
滿足json格式要求的數(shù)據(jù)就是json數(shù)據(jù)纠修;文件內(nèi)容滿足json格式要求胳嘲,就是json文件
- json格式要求:
a.要求一個(gè)json中有且只有一個(gè)數(shù)據(jù) b.這個(gè)數(shù)據(jù)必須是json支持的數(shù)據(jù)類型的數(shù)據(jù)
- json支持的數(shù)據(jù)類型
數(shù)字類型(number) - 包含所有的數(shù)字(整數(shù)和小數(shù)),并且支持科學(xué)計(jì)數(shù)法,例如:10,23.1,3e2
字符串(string) - 使用[雙引號]引起來的字符集,支持轉(zhuǎn)義字符扣草,例如"abc","12山東黃金","123\nabc","\u4e00"
布爾(bool) - 只有true了牛,false兩個(gè)值(和python不同,關(guān)鍵字為小寫)
數(shù)組(array) - 相當(dāng)于python中的列表辰妙,[12, "abc", true, [1, 3]]
字典(dictionary) - 相當(dāng)于python中的字典鹰祸,{"name": "小明","age": 18} 但是key值只能為字符串,value任意
null - 相當(dāng)于None,空值
"""
2.python數(shù)據(jù)和json數(shù)據(jù)的相互轉(zhuǎn)換
python中內(nèi)置了一個(gè)json模塊密浑,用來支持json相關(guān)操作 (需要導(dǎo)入模塊蛙婴,import語句一般寫在文件開頭)
- json轉(zhuǎn)python
json (轉(zhuǎn)) python
數(shù)字 int/float
字符串 str,有可能將雙引號變成單引號
布爾 bool,true -> True,false -> False
數(shù)組 list
字典 dict
null None
- json轉(zhuǎn)python方法
json.loads(字符串, encoding=編碼方式) - 將json字符串轉(zhuǎn)換成python對應(yīng)的數(shù)據(jù)
注意:這兒的字符串要求字符串中的內(nèi)容必須是json格式數(shù)據(jù)(去掉字符串最外面的引號,本身就是一個(gè)json數(shù)據(jù))
result = json.loads('"abc"', encoding='utf-8')
print([result])
result = json.loads('true', encoding='utf-8')
print([result])
result = json.loads('[12, true, "abc", null]', encoding='utf-8')
print(result, type(result))
- python轉(zhuǎn)json
python (轉(zhuǎn)) json
int/float 數(shù)字
bool 布爾,True -> true,False -> false
str 字符串尔破,單引號會變成雙引號
list/tuple 數(shù)組
dict 字典
None null
- python轉(zhuǎn)json方法
json.dumps(數(shù)據(jù)) - 將python數(shù)據(jù)轉(zhuǎn)換成json格式的字符串
result = json.dumps(100)
print([result])
result = json.dumps('hello python')
print([result])
result = json.dumps(True)
print([result])
result = json.dumps({'abc': 23, 'name': '小明', 'gender': True, 'score': None})
print([result])
with open(r'files\test2.txt') as f:
content = f.read()
dict1 = json.loads(content, encoding='utf-8')
print(dict1['age'])