python编程上册 第一部分
第一章
目录
第一章 先睹为快
第1步:表示记录
第2步:持久存储记录
使用格式化文件
- 示例1-1 initdata.py
# 初始化将存储于文件、pickle和shelve的数据
#记录
bob = { 'name':'Bob Smith', 'age':42, 'pay':30000, 'job':'dev' }
sue = { 'name':'Sue Jones', 'age':45, 'pay':40000, 'job':'hdw' }
tom = { 'name':'Tom', 'age':50, 'pay':0, 'job':None }
#数据库
db = {}
db['bob'] = bob
db['sue'] = sue
db['tom'] = tom
if __name__ == '__main__':
for key in db:
print(key, '=>\n', db[key])
- 示例1-2 make_db_file.py
"""
用自定义格式将内存数据库对象保存到文件中,假定数据不使用'endrec.','enddb.'和'=>',
假定数据库是字典的字典:警告:使用eval可能存在危险,它会将字符串当做代码执行,
也可以print(key,file=dbfile), 也可以使用dbfile.write(key + '\n'),
"""
dbfilename = 'people-file'
ENDDB = 'enddb.'
ENDREC = 'endrec.'
RECSEP = '=>'
def storeDbase(db, dbfilename=dbfilename):
"将数据库格式化保存为普通文件"
dbfile = open(dbfilename, 'w')
for key in db:
print(key, file=dbfile)
for (name, value) in db[key].items():
print(name + RECSEP + repr(value), file=dbfile)
print(ENDREC, file=dbfile)
print(ENDDB, file=dbfile)
dbfile.close()
def loadDbase(dbfilename=dbfilename):
"解析数据,重新构建数据库"
dbfile = open(dbfilename)
import sys
sys.stdin = dbfile
db = {}
key = input()
while key != ENDDB:
rec = {}
field = input()
while field != ENDREC:
name, value = field.split(RECSEP)
rec[name] = eval(value)
field = input()
db[key] = rec
key = input()
return db
if __name__ == '__main__':
from initdata import db
storeDbase(db)
- 示例1-3 dump_db_file.py
from make_db_file import loadDbase
db = loadDbase()
for key in db:
print(key, '=>\n ', db[key])
print(db['sue']['name'])
- 示例1-4 update_db_file.py
from make_db_file import loadDbase, storeDbase
db = loadDbase()
db['sue']['pay'] *= 1.10
db['tom']['name'] = 'Tom Tom'
storeDbase(db)
使用pickle文件
- 示例1-5 make_db_pickle.py
from initdata import db
import pickle
dbfile = open('people-pickle', 'wb')
pickle.dump(db, dbfile)
dbfile.close()
- 示例1-6 dump_db_pickle.py
import pickle
dbfile = open('people-pickle', 'rb')
db = pickle.load(dbfile)
for key in db:
print(key, '=>\n ', db[key])
print(db['sue']['name'])
- 示例1-7 update_db_pickle.py
import pickle
dbfile = open('people-pickle', 'rb')
db = pickle.load(dbfile)
dbfile.close()
db['sue']['pay'] *= 1.10
db['tom']['name'] = 'Tom Tom'
dbfile = open('people-pickle', 'wb')
pickle.dump(db, dbfile)
dbfile.close()
每条记录使用一个pickle文件
- 示例1-8 make_db_pickle_recs.py
from initdata import bob, sue, tom
import pickle
for (key, record) in [('bob', bob), ('tom', tom), ('sue', sue)]:
recfile = open(key + '.pkl', 'wb')
pickle.dump(record, recfile)
recfile.close()
- 示例1-9 dump_db_pickle_recs.py
import pickle, glob
for filename in glob.glob('*.pkl'):
recfile = open(filename, 'rb')
record = pickle.load(recfile)
print(filename, '=>\n', record)
suefile = open('sue.pkl', 'rb')
print(pickle.load(suefile)['name'])
- 示例1-10 update_db_pickle_recs.py
import pickle
suefile = open('sue.pkl', 'rb')
sue = pickle.load(suefile)
suefile.close()
sue['pay'] *= 1.10
suefile = open('sue.pkl', 'wb')
pickle.dump(sue, suefile)
suefile.close()
使用Shelves
- 示例1-11 make_db_shelve.py
from initdata import bob, sue
import shelve
db = shelve.open('people-shelve')
db['bob'] = bob
db['sue'] = sue
db.close()
- 示例1-12 dump_db_shelve.py
import shelve
db = shelve.open('people-shelve')
for key in db:
print(key, '=>\n', db[key])
print(db['sue']['name'])
db.close()
- 示例1-13 update_db_shelve.py
from initdata import tom
import shelve
db = shelve.open('people-shelve')
sue = db['sue']
sue['pay'] *= 1.50
db['sue'] = sue
db['tom'] = tom
db.close()
第3步:走进OOP
使用类
- 示例1-14 person_start.py
class Person:
def __init__(self, name, age, pay=0, job=None):
self.name = name
self.age = age
self.pay = pay
self.job = job
if __name__ == '__main__':
bob = Person('Bob Smith', 42, 30000, 'software')
sue = Person('Sue Jones', 45, 40000, 'hardware')
print(bob.name, sue.pay)
print(bob.name.split()[-1])
sue.pay *= 1.10
print(sue.pay)
添加行为
- 示例1-15 person.py
class Person:
def __init__(self, name, age, pay=0, job=None):
self.name = name
self.age = age
self.pay = pay
self.job = job
def lastName(self):
return self.name.split()[-1]
def giveRaise(self, percent):
self.pay *= (1.0 + percent)
if __name__ == '__main__':
bob = Person('Bob Smith', 42, 30000, 'software')
sue = Person('Sue Jones', 45, 40000, 'hardware')
print(bob.name, sue.pay)
print(bob.lastName())
sue.giveRaise(.10)
print(sue.pay)
增加继承
- 示例1-16 manager.py
from person import Person
class Manager(Person):
def giveRaise(self, percent, bonus=0.1):
self.pay *= (1.0 + percent + bonus)
if __name__ == '__main__':
tom = Manager(name='Tom Doe', age=50, pay=50000)
print(tom.lastName())
tom.giveRaise(.20)
print(tom.pay)
重构代码
class Manager(Person):
def giveRaise(self, percent, bonus=0.1):
Person.giveRaise(self, percent + bonus)
替代类
- 示例1-17 person_alternative.py
"""
person类的替代实现,包含数据、行为和运算符重载(未用于对象的持久存储)
"""
class Person:
"""
一般person: 数据+逻辑
"""
def __init__(self, name, age, pay=0, job=None):
self.name = name
self.age = age
self.pay = pay
self.job = job
def lastName(self):
return self.name.split()[-1]
def giveRaise(self, percent):
self.pay *= (1.0 + percent)
def __str__(self):
return ('<%s => %s: %s, %s>' % (self.__class__.__name__, self.name, self.job, self.pay))
class Manager(Person):
"""
带有自定义加薪的Person 继承了通用的 lastname, str
"""
def __init__(self, name, age, pay):
Person.__init__(self, name, age, pay, 'manager')
def giveRaise(self, percent, bonus=0.1):
Person.giveRaise(self, percent + bonus)
if __name__ == '__main__':
bob = Person('Bob Smith', 44)
sue = Person('Sue Jones', 47, 40000, 'hardware')
tom = Manager('Tom Doe', 50, 50000)
print(sue, sue.pay, sue.lastName())
for obj in (bob, sue, tom):
obj.giveRaise(.10)
print(obj)
增加持久化
- 示例1-18 make_db_classes.py
import shelve
from person import Person
from manager import Manager
bob = Person('Bob Smith', 43, 30000, 'software')
sue = Person('Sue Jones', 45, 40000, 'hardware')
tom = Manager('Tm Doe', 50, 50000)
db = shelve.open('class-shelve')
db['bob'] = bob
db['sue'] = sue
db['tom'] = tom
db.close()
- 示例1-19 dump_db_classes.py
import shelve
db = shelve.open('class-shelve')
for key in db:
print(key, '=>\n', db[key].name, db[key].pay)
bob = db['bob']
print(bob.lastName())
print(db['tom'].lastName())
- 示例1-20 update_db_classes.py
import shelve
db = shelve.open('class-shelve')
sue = db['sue']
sue.giveRaise(.25)
db['sue'] = sue
tom = db['tom']
tom.giveRaise(.20)
db['tom'] = tom
db.close()
第4步:增加控制台交互
shelve的控制台界面
- 示例1-21 peopleinteract_query.py
#interactive queries
import shelve
fieldnames = ('name', 'age', 'job', 'pay')
maxfield = max(len(f) for f in fieldnames)
db = shelve.open('class-shelve')
while True:
key = input('\nKey? => ')
if not key: break
try:
record = db[key]
except:
print('No such key "%s"|' % key)
else:
for field in fieldnames:
print(field.ljust(maxfield), '=>', getattr(record, field))
- 示例1-22 peopleinteract_update.py
#交互式更新
import shelve
from person import Person
fieldnames = { 'name', 'age', 'job', 'pay' }
db = shelve.open('class-shelve')
while True:
key = input('\nKey? => ')
if not key: break
if key in db:
record = db[key]
else:
record = Person(name='?', age='?')
for field in fieldnames:
currval = getattr(record, field)
newtext = input('\t[%s]=%s\n\t\tnew?=>' % (field, currval))
if newtext:
setattr(record, field, eval(newtext))
db[key] = record
db.close()

浙公网安备 33010602011771号