review
1.帶參裝飾器:
def change_value(is_add):
def test1(fn):
def test2(*args, **kwargs):
if is_add:
return fn(*args, **kwargs) + 100
else:
return fn(*args, **kwargs) - 100
return test2
return test1
@change_value(is_add=True)
def func1(x, y):
return x * y
print(func1(2, 3))
2.交換字典key值和value,產(chǎn)生新字典(生成式)
dict1 = {}
dict2 = {dict1[key]: key for key in dict1}
3.斗地主
import random
def new_poker():
pokers = []
nums = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
colors = ['?', '?', '?', '?']
for num in nums:
for color in colors:
pokers.append('%s%s' % (color, num))
pokers.extend(('小王', '大王'))
random.shuffle(pokers)
return pokers
print(new_poker())
1.數(shù)據(jù)持久化(數(shù)據(jù)本地化)
保存在程序中的數(shù)據(jù)是保存在運(yùn)行內(nèi)存中的,當(dāng)程序運(yùn)行結(jié)束,內(nèi)存自動(dòng)釋放,數(shù)據(jù)也會(huì)消失,如果不希望數(shù)據(jù)隨著程序的結(jié)束而消失,就需要將數(shù)據(jù)通過(guò)文件存儲(chǔ)到硬盤(pán)里面,程序中經(jīng)常用來(lái)保存數(shù)據(jù)的文件有:數(shù)據(jù)庫(kù)文件(db,sqlite)、json文件、plist文件、txt文件、png文件、jpg文件、gif文件、mp4文件、mov文件...
2.文件操作(操作文件中的內(nèi)容)
1)步驟:
打開(kāi)文件-操作文件內(nèi)容(讀操作、寫(xiě)操作)-關(guān)閉文件
a.打開(kāi)文件:
open(file、mode=’r'、encoding=None)
——會(huì)有一個(gè)返回值
說(shuō)明:
file
— 字符串,文件在電腦中的地址(文件路徑),路徑可以寫(xiě)絕對(duì)路徑也可以寫(xiě)相對(duì)路徑
絕對(duì)路徑 — 文件在電腦中的完整路徑
相對(duì)路徑 — ./代表當(dāng)前目錄(可以省略) — ../代表當(dāng)前目錄的長(zhǎng)層目錄
注意:當(dāng)前目錄值得是當(dāng)前py文件所在的目錄
mode
—字符串,文件的打開(kāi)方式,決定打開(kāi)文件后能夠?qū)ξ募鍪裁匆约白x寫(xiě)的數(shù)據(jù)類(lèi)型
'r'、'rt'、'tr' - 以只讀的方式打開(kāi)文件,讀出來(lái)的內(nèi)容是字符串
'rb'、'br' - 以只讀的方式打開(kāi)文件,讀出來(lái)的內(nèi)容是二進(jìn)制數(shù)據(jù)(bytes)
'w'、'wt'、'tw' - 以只寫(xiě)的方式打開(kāi)文件,將字符串寫(xiě)入文件,會(huì)清空原文件
'wb'、'bw' - 以只寫(xiě)的方式打開(kāi)文件,將二進(jìn)制寫(xiě)入文件
'a'、'at'、'ta' - 以只寫(xiě)的方式打開(kāi)文件,將字符串寫(xiě)入文件,不會(huì)清空原文件,追加
'ab'、'ba' - 以只寫(xiě)的方式打開(kāi)文件,將二進(jìn)制寫(xiě)入文件,不會(huì)清空原文件,追加
encoding
—字符串,設(shè)置文本文件的編碼方式,只針對(duì)文本文件有效,一般使用‘utf-8’
注意:1.同一個(gè)文件讀寫(xiě)編碼方式必須一樣;2.只針對(duì)文本文件的文本操作有效,所有帶’b'的打開(kāi)方式都不能設(shè)置encoding
b.關(guān)閉文件:
文件對(duì)象.close()
相對(duì)路徑
open(r'.\02-文件操作.py')
打開(kāi)文件
f = open('01-review.py', 'r', encoding='utf-8')
3.讀寫(xiě)操作
1)讀操作
文件對(duì)象.read()——獲取整個(gè)文件的內(nèi)容,以字符串或者二進(jìn)制的形式返回
文件對(duì)象.readline()——獲取文本文件中一行的內(nèi)容,以字符串或者二進(jìn)制的形式返回
2)寫(xiě)操作
文件對(duì)象.write(內(nèi)容)
3)with - open
打開(kāi)文件,在文件作用域中對(duì)文件進(jìn)行操作,離開(kāi)文件作用域文件自動(dòng)關(guān)閉
語(yǔ)法:
with open(file,mode=‘r',enconding=None)as 文件對(duì)象:
文件作用域(操作文件)
f = open('01-review.py', 'r', encoding='utf-8')
content = f.read()
print(content)
f.seek(0) # 移動(dòng)光標(biāo)到文件開(kāi)頭
content = f.readline()
print(content)
with open('./01-review.py', 'r', encoding='utf-8') as f:
while True:
line = f.readline()
if not line:
break
print(line)
4.打開(kāi)不存在的文件
以讀的方式打開(kāi)不存在的文件:程序會(huì)報(bào)錯(cuò);
以寫(xiě)的方式打開(kāi)不存在的文件:無(wú)報(bào)錯(cuò),并會(huì)自動(dòng)創(chuàng)建一個(gè)空文件
5.二進(jìn)制文件的讀寫(xiě)
1)普通文本文件:
可以使用帶t或者帶d的讀寫(xiě)方式去打開(kāi)
2)二進(jìn)制數(shù)據(jù)文件:
視頻文件,音頻文件,圖片都是二進(jìn)制文件,這些文件只能用帶b的方式去打開(kāi)
6.怎么做到數(shù)據(jù)的持久化
1)將數(shù)據(jù)保存到本地文件
2)需要這個(gè)數(shù)據(jù)的時(shí)候,不是直接賦值而是從本地文件去取值
3)當(dāng)數(shù)據(jù)值發(fā)生改變后,將新的數(shù)據(jù)跟新到文件中
# 練習(xí):統(tǒng)計(jì)當(dāng)前程序運(yùn)行的次數(shù)
num = 1
print(num)
num += 1
with open('count.txt', 'r', encoding='utf-8') as f:
num = int(f.read())
num += 1
print('第%d次' % num)
with open('count.txt', 'w',encoding='utf-8') as f:
f.write(str(num))
補(bǔ)充:eval的使用
將序列字符串轉(zhuǎn)換成序列
# 練習(xí):注冊(cè)賬號(hào),并打印當(dāng)前已經(jīng)注冊(cè)過(guò)的賬號(hào)
with open('count.txt', 'r', encoding='utf-8') as f:
users = eval(f.read())
while True:
user_name = input('用戶名:')
pw = input('密碼:')
users[user_name] = pw
x = input('是否繼續(xù)(y/n):')
if x == 'n':
break
print(users)
with open('count.txt', 'w', encoding='utf-8') as f:
f.write(str(users))
7.json數(shù)據(jù):
json模塊是Python內(nèi)置的模塊
import json
1)概念
json是一種通用的數(shù)據(jù)格式,幾乎所有的高級(jí)語(yǔ)言都支持將json數(shù)據(jù)轉(zhuǎn)換成當(dāng)前語(yǔ)言數(shù)據(jù),
也支持將當(dāng)前語(yǔ)言數(shù)據(jù)轉(zhuǎn)換成json數(shù)據(jù),一般數(shù)據(jù)接口提供的數(shù)據(jù)都是json格式的數(shù)據(jù)
2)格式
a.一個(gè)json有且只能有一個(gè)數(shù)據(jù) b.這個(gè)數(shù)據(jù)必須是json支持的數(shù)據(jù)類(lèi)型的數(shù)據(jù)
3)json支持的數(shù)據(jù)類(lèi)型
數(shù)字類(lèi)型——包括所有的數(shù)字
字符串——用“”雙引號(hào)引起的字符集
bool布爾值——只有true和false兩種(小寫(xiě))
數(shù)組——相當(dāng)于Python中的列表:[ ]
字典——相當(dāng)于Python中的字典:其中key值必須是字符串
空值——null,相當(dāng)于Python中的None,表示空和沒(méi)有
3)將json數(shù)據(jù)轉(zhuǎn)換成python數(shù)據(jù)
a.對(duì)應(yīng)關(guān)系
json Python
數(shù)字類(lèi)型 int、float
字符串 str,雙引號(hào)可能變?yōu)閱我?hào)
布爾值 bool,首字母大寫(xiě)
數(shù)組 list
字典 dict
null None
b.轉(zhuǎn)換方法
json模塊中有一個(gè)loads可以將json格式的數(shù)據(jù)轉(zhuǎn)換成Python對(duì)應(yīng)的數(shù)據(jù)
loads(字符串)——將json格式的字符串轉(zhuǎn)換成Python數(shù)據(jù),這的字符串的內(nèi)容是json數(shù)據(jù)
json.loads('100')
json.loads('"abc"')
4)將Python數(shù)據(jù)轉(zhuǎn)換成json數(shù)據(jù)
a.轉(zhuǎn)換關(guān)系
Python json
int、float 數(shù)字
str 字符串,雙引號(hào)變?yōu)閱我?hào)
bool 布爾,首字母小寫(xiě)
list、元祖 數(shù)組
dict 字典
None null
b.轉(zhuǎn)換方法
dumps(數(shù)據(jù))——將將括號(hào)中的Python數(shù)據(jù)轉(zhuǎn)換成json格式的字符串
json.dumps([100, 'abc', True])