python 核心编程2 第十三章练习

'''对类进行定制。写一个类,用来将浮点数值转换为金额。在本练习里,我们使用美国
货币,但读者也可以自选任意货币。
基本任务: 编写一个dollarize()函数,它以一个浮点数值作为输入,返回一个字符串形式的
金额数。比如说:
dollarize(1234567.8901) ==> ‘$1,234,567.89.
dollarize()返回的金额数里应该允许有逗号(比如1,000,000),和美元的货币符号。如果有负
号,它必须出现在美元符号的左边。完成这项工作后,你就可以把它转换成一个有用的类,名为
MoneyFmt。
MoneyFmt 类里只有一个数据值(即,金额),和五个方法(你可以随意编写其他方法)。__init__()
构造器对数据进行初始化,update()方法把数据值替换成一个新值,__nonzero__()是布尔型的,当
数据值非零时返回True,__repr__()方法以浮点数的形式返回金额;而__str__()方法采用和
dollarize()一样的字符格式显示该值。
(a) 编写update()方法,以实现数据值的修改功能。
(b) 以你已经编写的 dollarize()的代码为基础,编写__str__()方法的代码
(c) 纠正__nonzero__()方法中的错误,这个错误认为所有小于1 的数值,例如,50 美分($0.50),
返回假值(False)。
(d) 附加题: 允许用户通过一个可选参数指定是把负数数值显示在一对尖括号里还是显示一个
负号。默认参数是使用标准的负号。
'''

class MoneyFmt():
    # 构造类结构
    def __init__(self, value=0.0, flag="-"):
        self.mvalue = float(value)
        self.flag = flag
    # 定义金额转换函数
    def dollarize(self):
        val = round(self.mvalue, 2)
        strvalue = str(val)
        if strvalue.startswith("-"):
            strvalue = strvalue[1:]
        else:
            strvalue = strvalue
        pos = strvalue.find('.')
        while (pos-3) > 0:
            strvalue = strvalue[:pos-3] +','+ strvalue[pos-3:]
            pos -= 3
        if strvalue.startswith("-"):
            return self.flag + "$" + strvalue[1:]
        else:
            return "$" + strvalue

    def update(self, newvalue=None):
        if newvalue is not None:
            self.mvalue = newvalue

    def __nonzero__(self):
        if self.mvalue == 0:
            return False
        else:
            return True

    def __str__(self):
        return self.dollarize()

    def __repr__(self):
        return repr(self.mvalue)

    
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Jacky Cheng
'''用户注册。建立一个用户数据库(包括登录名、 密码和上次登录时间戳)类(参考练习 7-5
和 9-12),来管理一个系统,该系统要求用户在登录后才能访问某些资源。这个数据库类对用
户进行管理,并在实例化操作时加载之前保存的用户信息,提供访问函数来添加或更新数据库
的信息。在Edit By Vheavens
Edit By Vheavens
数据修改后,数据库会在垃圾回收时将新信息保存到磁盘。(参见__del__()).'''
'''解析:
   1,建立一个类,包括 登陆名, 密码,时间戳, 而且需要读取:
       用到“序列化”对象的相关模块,数据结构用{"username": ["password", "datetime"]}.
   2, 登陆后才能访问:
        这里需要,给登陆状态做个标记:flag = False or True.
   3, 实例化操作时加载用户信息:
        需要在__init__构造器中,读取数据:shelve.open("filename", ......)
   4, 提供访问函数添加、更新数据库:
         这里要定义:deluser()、updateuser()等函数。
   5, 数据修改后,数据库会在垃圾回收是将“ 新信息”,保存到磁盘:
         这里用到__del__解构器, 结构器 是在引用计数为0时的前一刻,调用__del__
         结构器,这种特性可以定义__del__(), 来保存数据。'''

from datetime import datetime
import shelve, os

class userdatabase(object):
    def __init__(self, dbfile):
        self.db = {}
        if os.path.exists(dbfile):
            self.db = shelve.open(dbfile, 'c')
        self.dbfile = dbfile
        self.flog = False

    def __del__(self):
        data = shelve.open(self.dbfile, 'c')
        data.update(self.db)
        data.close()

    def login(self, user, pwd):
        if user not in self.db:
            self.flog = False
        elif self.db[user][0] == pwd:
            self.db[user][1] = datetime.now()
            self.flog = True

    def deluser(self, user):
        if self.flog:
            self.db.pop(user)
        else:
            print('login first')

    def updateuser(self, user, pwd):
        if self.flog:
            self.db[user] = [pwd, datetime.now()]
        else:
            print('login first')

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Jacky Cheng
'''几何. 创建一个由有序数值对(x, y) 组成的 Point 类,它代表某个点的 X 坐标和 Y 坐
标。X 坐标和 Y 坐标在实例化时被传递给构造器,如果没有给出它们的值,则默认为坐标的
原点。
'''

class Point(object):
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

    def __str__(self):
        return '(%d,%d)' % (self.x, self.y)


if __name__=="__main__":
    p = Point(3,4)
    print(p)
    print("p的x坐标:%d" % p.x)
    print("p的y坐标:%d" % p.y)



#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Jacky Cheng

'''几何. 创建一个直线/直线段类。 除主要的数据属性: 一对坐标值(参见上一个练习)外,
它还具有长度和斜线属性。你需要覆盖__repr__()方法(如果需要的话,还有__str__()方法),
使得代表那条直线(或直线段)的字符串表示形式是由一对元组构成的元组,即,((x1, y1),
(x2, y2)).
总结:
__repr__ 将直线的两个端点(始点和止点)显示成一对元组
length 返回直线段的长度 - 不要使用"len", 因为这样使人误解它是整数。
slope 返回此直线段的斜率(或在适当的时候返回 None)'''

from math import sqrt

class Line(object):
    def __init__(self, x1=0, y1=0, x2=0, y2=0):
        self.x1 = x1
        self.x2 = x2
        self.y1 = y1
        self.y2 = y2
        self.length = 0
        self.slope = 0

    def getLength(self):
        self.length = sqrt((self.x2-self.x1)**2 + (self.y2-self.y1)**2)
        return self.length

    def getSlope(self):
        if self.length == 0:
            self.slope = None
        elif (self.x2 == self.x1) or (self.y2 == self.y1):
            self.slope = None
        else:
            self.slope = (self.y2-self.y1)/(self.x2-self.x1)
        return self.slope

    def __str__(self):
        return "((%d,%d),(%d,%d))" % (self.x1, self.y1, self.x2, self.y2)

    __repr__ = __str__

if __name__=='__main__':
    L = Line(2,3,5,3)
    print(L)
    print('length is: %f' % L.getLength())
    print('slope is: %f' % L.getSlope())

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Jacky Cheng

'''数据类。提供一个 time 模块的接口,允许用户按照自己给定时间的格式,比如:
“MM/DD/YY,” “MM/DD/YYYY,” “DD/MM/YY,” “DD/MM/ YYYY,” “Mon DD, YYYY,”
或是标准的 Unix 日期格式:“Day Mon DD, HH:MM:SS YYYY” 来查看日期。你的类应该
维护一个日期值,并用给定的时间创建一个实例。如果没有给出时间值,程序执行时会默认
采用当前的系统时间。还包括另外一些方法:
update() 按给定时间或是默认的当前系统时间修改数据值
display() 以代表时间格式的字符串做参数,并按照给定时间的格式显示:
'MDY' ==> MM/DD/YY
'MDYY' ==> MM/DD/YYYY
'DMY' ==> DD/MM/YY
'DMYY' ==> DD/MM/YYYY
'MODYY' ==> Mon DD, YYYY
如果没有提供任何时间格式,默认使用系统时间或 ctime()的格式。 附加题: 把这个类和练习
6-15 结合起来'''

import time
class TimeFormat(object):
    def __init__(self, t=time.time()):
        self.mytime = t

    def update(self, t=time.time()):
        self.mytime = t

    def display(self, formtime=None):
        fmt = {}
        fmt['MDY'] = '%m-%d-%y'
        fmt['MDYY'] = '%m-%d-%Y'
        fmt['DMY'] = '%d-%m-%y'
        fmt['DMYY'] = '%d-%m-%Y'
        fmt['MODYY'] = '%b %d,%Y'
        if formtime in fmt:
            mt = time.localtime(self.mytime)
            print(time.strftime(fmt[], mt))
        else:
            print(time.ctime(self.mytime))

if __name__=="__main__":
    tf = TimeFormat()
    tf.display()
    tf.display('MDY')
    tf.display('MDYY')
    tf.display('DMY')
    tf.display('DMYY')
    tf.display('MODYY')
    tf.update(time.time() + 5)







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值