在上一篇《Python之区块链入门》中讲述了区块链的基础知识,并用Python实现了区块和区块链的结构。在本篇中,将基于上面的内容实现一个简单的记账本功能。

记账本的功能如下:

  1. 实现基本的收支记录;
  2. 计算当前余额;
  3. 对收支情况做简单统计分析。

账单记录的格式如下:

日期|描述|金额

下面开始一步步实现上述功能。

一、定义收支记录

在上一篇中区块的内容是简单的文本,这里实现将基于Block实现一个支持收支记录格式的类,代码如下:

In [36]:

from datetime import datetimeclass AccountBill(Block):def __init__(self, content, amount):t = datetime.now().strftime('%Y-%m-%d %H:%M:%S')data = "{}|{}|{}".format(t, content, amount)return super(AccountBill, self).__init__(data)'''获取金额数量'''def get_amount(self):amount = 0if self.data:amount = int(self.data.split('|')[2])return amountdef get_content(self):content = ''if self.data:content = self.data.split('|')[1]return contentdef __repr__(self):return 'Bill: {}>'.format(self.data)

In [37]:

# 创建记录AccountBill('测试', 100)

Out[37]:

Bill: 2017-07-30 10:46:23|测试|100>

二、计算当前余额

上面已经定义了收支记录,接下来在BlockChain基础上定义一个方法用来计算当前余额。代码如下:

In [91]:

from collections import OrderedDictclass AccountBook(BlockChain):def __init__(self):self.head = None   # 指向最新的一个区块self.blocks = OrderedDict()   # 包含所有区块的一个字典'''添加记录'''def add_block(self, new_bill):new_bill.mine()super(AccountBook, self).add_block(new_bill)'''计算当前余额'''def balance(self):balance = 0if self.blocks:for k, v in self.blocks.items():balance += v['block'].get_amount()return balancedef __repr__(self):num_existing_blocks = len(self.blocks)return 'AccountBook<{} Bills, Head: {}>'.format(num_existing_blocks,self.head.identifier if self.head else None)

In [92]:

# 创建几笔记录book = AccountBook()b1 = AccountBill('工资', 10000)
book.add_block(b1)b2 = AccountBill('房租', -2500)
book.add_block(b2)b3 = AccountBill('衣服', -1500)
book.add_block(b3)b4 = AccountBill('吃饭', -1000)
book.add_block(b4)b5 = AccountBill('股票收入', 200)
book.add_block(b5)b6 = AccountBill('看电影', -200)
book.add_block(b6)b7 = AccountBill('购物', -1000)
book.add_block(b7)b8 = AccountBill('水电费等', -100)
book.add_block(b8)

In [93]:

# 计算当前余额book.balance()

Out[93]:

3900

三、简单分析收支记录

In [76]:

# 打印收支记录for k,v in book.blocks.items():print(v['block'].data)2017-07-30 19:57:57|工资|10000
2017-07-30 19:57:57|房租|-2500
2017-07-30 19:57:57|衣服|-1500
2017-07-30 19:57:58|吃饭|-1000
2017-07-30 19:57:58|股票收入|200
2017-07-30 19:57:58|看电影|-200
2017-07-30 19:57:59|购物|-1000
2017-07-30 19:57:59|水电费等|-100

In [50]:

# 使用柱状图展示收支记录%matplotlib inlineimport matplotlib
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签# 初始化数据
x_data = []  # 金额
y_data = []  # 描述
colors = []  # 颜色for k,v in book.blocks.items():bill = v['block']y_data.append(bill.get_content())amount = bill.get_amount()if amount > 0:x_data.append(amount)colors.append('blue')else:x_data.append(-amount)colors.append('red')y_pos = np.arange(len(y_data))plt.bar(y_pos, x_data, align='center', alpha=0.5, color=colors)
plt.xticks(y_pos, y_data)
plt.ylabel('金额')
plt.title('收支记录')plt.show()

In [55]:

# 简单分析支出组成labels = []
amounts = []
colors = ['gold', 'yellowgreen', 'lightcoral', 'lightskyblue'] # 用不同颜色显示for k,v in book.blocks.items():bill = v['block']  amount = bill.get_amount()# 只展示支出if amount < 0:labels.append(bill.get_content())amounts.append(-amount)plt.pie(amounts, labels=labels, colors=colors, shadow=True, autopct='%1.1f%%')
plt.axis('equal')
plt.show()

作者:Walker Python爱好者社区专栏作者 授权原创发布,请勿转载,谢谢。

出处:Python之区块链简单记账本实现

Python之区块链简单记账本实现相关推荐

  1. python简单读写记账代码_Python之区块链简单记账本实现

    个人博客:http://101python.cn/ 在上一篇<>中讲述了区块链的基础知识,并用Python实现了区块和区块链的结构.在本篇中,将基于上面的内容实现一个简单的记账本功能. 记 ...

  2. 大数据、java、python、区块链、人工智能发展前景

    在这个信息时代高速发展的情况下,很多人会对自己该往哪个方向发展感到迷茫,下面我就浅显的给大家介绍一下五大流行区域的发展前景. 一.大数据的发展前景 当前大数据行业真的是人才稀缺吗? 学了几年后,大数据 ...

  3. Python之区块链入门,揭秘比特币

    本文将简单介绍区块链(BlockChain)并用Python做一简单实现. 什么是区块链 简单来说,区块链就是把加密数据(区块)按照时间顺序进行叠加(链)生成的永久.不可逆向修改的记录.具体来说,它区 ...

  4. python区块链框架_20分钟,我用Python实现区块链架构!

    文章目录区块链到底多神奇 一起动手创建一个极简的区块链 为"瘦小的"区块链"增肥" 添加POW共识算法 开采新的区块测试 零基础Python实现区块链架构视频观 ...

  5. python和区块链哪个好_10个最流行的Python区块链开源项目

    Python不是主流的区块链底层平台开发语言,但是在DApp 开发.区块链仿真与数据分析.智能合约安全分析等领域,Python 依然是不错的选择.本文介绍了10个最流行的Python区块链项 并提供了 ...

  6. python入门区块链技术_Python学习入门之区块链详解

    前言 本文将给大家简单介绍关于区块链(BlockChain)的相关知识,并用Python做一简单实现.下面话不多说,来一起看看详细的介绍: 什么是区块链 简单来说,区块链就是把加密数据(区块)按照时间 ...

  7. 区块链简单介绍(二)

    什么是PoW共识机制 所谓PoW机制全称是proof of work,也就是工作量证明.最开始这个技术是被用来解决垃圾邮件的问题.不过后来中本聪发现这个技术能有效解决拜占庭将军问题,于是便把它引进了比 ...

  8. BlockChain:Py实现区块链简单场景应用:程序猿记录在区块里的收入记录图

    BlockChain:Py实现区块链简单场景应用:程序猿记录在区块里的收入记录图 导读 想更好的了解区块链技术?还是用程序猿的方式来加深了解和探索区块链吧!实际案例应用会让我们更加熟悉它的底层技术! ...

  9. 区块链简单实现之p2p网络多节点同步

    区块链简单实现之p2p网络多节点同步 将区块保存为json文件 节点 不确定性 区块里保存节点信息 并未向所有节点广播 简单模拟 广播的代码: 实现效果: 完整的代码: 承接上文:区块链的简单实现,我 ...

最新文章

  1. 【2020年BNN网络的SOTA—— ReActNet 】以简单的操作得到更高精度的二值神经网络
  2. js 包含某个字符串_[译] 5 大 JavaScript 字符串操作库
  3. java正则表达式的使用_java正则表达式使用
  4. SSM框架中分页插件pageHelper的使用实例
  5. 更少的标签,更好的学习,谷歌半监督学习算法FixMatch
  6. NumPy 基础入门
  7. 最短路之floy算法
  8. Virtual Member Functions(虚拟成员函数)
  9. python实现大学物理实验不确定度计算
  10. 什么是软件测试?简介,基础知识和重要性
  11. doctrine安装和配置
  12. 移动硬盘位置不可用无法访问函数不正确修复方法?
  13. 如何录制自己手机视频
  14. pytohn用Pillow或OpenCV删除图片某种颜色
  15. nodejs+vue+elementui鲜花销售商城管理系统410
  16. html表格填充空白单元格,快速填充空白单元格【应对步骤】
  17. Git零基础教程①:如何加速开源社区github的打开(2022版)
  18. 世上最污技术解读,我竟然秒懂了
  19. 记ThinkPad T470P 屏幕更换
  20. 好巧,七夕最新8月书单出炉!送给你程序员

热门文章

  1. easyui中的datagrid的数据加载的问题
  2. IIS7 + Tomcat7 整合共用80端口
  3. 《JavaScript 每周导读》【第一期】
  4. ubuntu16安装anaconda显示没有文件或那个目录
  5. Maple 公式推导
  6. torch.cat同时连接多个tensor
  7. 牛客网题目——不用四则运算符号,计算两个数字的和
  8. matlab错误:Variable 'a' cannot be saved to a MAT-file whose version is older than 7.3.
  9. 图像处理之ROI区域裁剪
  10. 【Python】反转列表 list 的几种方法