Python练习程序(三)函数练习--ATM模拟

功能要求:
- 额度15000
- 可以提现,手续费5%
- 记录消费流水
- 支持每月账单查询
- 提供还款接口

调用的相关模块:

import time    #time模块,提供各种操作时间的函数
time.strftime("%Y-%m-%d %X", time.localtime())
'2015-12-15 23:35:26'
import getpass    #getpass 模块 -> 命令行下输入密码的方法
pwd = getpass.getpass('password: ')
print pwd
import pickle    #pickle模块,序列化Python对象
#保存数据到 Pickle 文件
>>> dic = {}
>>> import pickle
>>> with open('dic.pickle', 'wb') as f:
...     pickle.dump(dic, f)
... 
#从Pickle文件读取数据
>>> import pickle
>>> with open('dic.pickle', 'rb') as f:
...      dic = pickle.load(f)
... 

1、用户数据通过字典序列化存入account.pickle

cat account.py 
#!/usr/bin/env python
#coding=utf-8
import pickle
account = {'1001':{'name':'fgf','pw':123,'money':15000,'balance':15000},
           '1002':{'name':'user','pw':123,'money':15000,'balance':15000}}
f = file('account.pickle','wb')
pickle.dump(account,f)
f.close()
with open('account.pickle', 'rb') as f:
        dic = pickle.load(f) 
        f.close()
print dic

2、Python程序

#!/usr/bin/env python
#coding=utf-8
import sys,pickle,getpass,time
#日志函数
def log(user,describe,fee,balance,**userinfo):
        time1 = time.strftime("%Y-%m-%d %X", time.localtime())
        f = file('account.log','a')
        f.write("%s     %s      %s      ¥%s      ¥%s\n" %(time1,user,describe,fee,balance))
        f.close()
        f1 = file('account.pickle','wb')
        pickle.dump(userinfo,f1)
        f1.close()
#提现函数
def withdraw(user,**userinfo):
        fee = int(raw_input("请输入提现金额:"))
        if fee % 100 ==0 and int(fee*1.05) <= userinfo[user]['balance']:
                charge = fee * 0.05
                balance = userinfo[user]['balance'] - fee - charge
                userinfo[user]['balance'] = balance
                log(user,"取现(手续费%d)"%charge,fee,balance,**userinfo)
                print "你成功取现%d,收取手续费%s,剩余额度%s" %(fee,charge,balance)
        else:
                print "输入金额有误。"
#还款函数
def repay(user,**usrinfo):
        fee = int(raw_input("请输入还款金额:"))
        userinfo[user]['balance'] += fee
        balance = userinfo[user]['balance']
        log(user,"信用卡还款",-fee,balance,**userinfo)
        print "你成功还款%d,当前可用额度%s" %(fee,balance)
#账单查询
def bills(user):
        f = file('account.log','r')
        time = raw_input("请输入查询的时间(格式:yyyy-mm):")
        match_yes = 0    #匹配标示
        for line in f.readlines():
                if user in line and time in line:
                        print line,
                        match_yes = 1
        if match_yes == 0 : print"没有查询月份账单"
with open('account.pickle','rb') as f:
        userinfo = pickle.load(f)
        f.close()
while True:
        user = raw_input("\33[1;32;40m请输入用户名:\33[0m")
        i = 1
        while userinfo.has_key(user):
                passwd = int(getpass.getpass("\33[1;32;40m请输入密码:\33[0m"))
                while passwd == userinfo[user]['pw']:
                        i = 1   
                        print "欢迎进入系统,请选择操作:"
                        choice = int(raw_input("提现 1\t还款 2\t账单查询 3\t 额度查询 4\t 退出 0\n"))
                        if   choice == 1: withdraw(user,**userinfo)
                        elif choice == 2: repay(user,**userinfo)
                        elif choice == 3: bills(user)
                        elif choice == 4: print "总额度:",userinfo[user]['money'],"当前额度",userinfo[user]['balance']
                        elif choice == 0: sys.exit()
                else:
                        i = i + 1
                        print"密码错误!"
                        if i == 4 : break
        else : print "没有这个账户。"

==============调用模块详细解释==============

python time模块
import time
 time模块提供各种操作时间的函数
  说明:一般有两种表示时间的方式:
       第一种是时间戳的方式(相对于1970.1.1 00:00:00以秒计算的偏移量),时间戳是惟一的
       第二种以数组的形式表示即(struct_time),共有九个元素,分别表示,同一个时间戳的struct_time会因为时区不同而不同

strftime(...)
  strftime(format[, tuple]) -> string
  将指定的struct_time(默认为当前时间),根据指定的格式化字符串输出
  python中时间日期格式化符号:
  %y 两位数的年份表示(00-99)
  %Y 四位数的年份表示(000-9999)
  %m 月份(01-12)
  %d 月内中的一天(0-31)
  %H 24小时制小时数(0-23)
  %I 12小时制小时数(01-12) 
  %M 分钟数(00=59)
  %S 秒(00-59)

  %a 本地简化星期名称
  %A 本地完整星期名称
  %b 本地简化的月份名称
  %B 本地完整的月份名称
  %c 本地相应的日期表示和时间表示
  %j 年内的一天(001-366)
  %p 本地A.M.或P.M.的等价符
  %U 一年中的星期数(00-53)星期天为星期的开始
  %w 星期(0-6),星期天为星期的开始
  %W 一年中的星期数(00-53)星期一为星期的开始
  %x 本地相应的日期表示
  %X 本地相应的时间表示
  %Z 当前时区的名称
  %% %号本身 

time.strftime("%Y-%m-%d %X", time.localtime())
Getpass 模块 -> 命令行下输入密码的方法
getpass.getpass() :
import getpass
pwd = getpass.getpass('password: ')
print pwd
序列化Python对象
序列化的概念很简单。内存里面有一个数据结构,一个捕获了当前进度的数据结构需要在你退出的时候保存到磁盘上,接着在你重新启动的时候从磁盘上加载进来。
pickle 模块是Python标准库的一部分。它很快; 它的大部分同Python解释器本身一样是用C写的。 它可以存储任意复杂的Python数据结构。
----------------------
保存数据到 Pickle 文件
>>> dic = {}                               ①
>>> import pickle
>>> with open('dic.pickle', 'wb') as f:    ②
...     pickle.dump(dic, f)                ③
... 
②.使用open() 函数来打开一个文件。设置文件模式为'wb'来以二进制写模式打开文件。把它放入with 语句中来保证在你完成的时候文件自动被关闭。
③.pickle模块中的dump()函数接受一个可序列化的Python 数据结构, 使用最新版本的pickle协议将其序列化为一个二进制的,Python特定的格式, 并且保存到一个打开的文件里。
最新版本的pickle协议是二进制格式的。请确认使用二进制模式来打开你的pickle文件,否则当你写入的时候数据会被损坏。
--------------------
从Pickle文件读取数据
>>> import pickle
>>> with open('dic.pickle', 'rb') as f:    ③
...      dic = pickle.load(f)              ④
... 
③.pickle模块使用二进制数据格式,所以你总是应该使用二进制模式打开pickle文件。
④.pickle.load()函数接受一个流对象, 从流中读取序列化后的数据,创建一个新的Python对象,在新的Python对象中重建被序列化的数据,然后返回新建的Python对象。
pickle.dump() / pickle.load()循环的结果是一个和原始数据结构等同的新的数据结构。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值