首页生活资讯正文

青鸟飞扬教育Python之区块链简单记账本实现

2024-09-22 次浏览

一、界说出入记载

在上一篇中区块的内容是简单的文本,这里实现将基于Block实现一个支撑出入记载格局的类,代码如下:

In [36]:

青鸟飞扬教育Python之区块链简单记账本实现
(图片来源网络,侵删)

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 = 0 if self.data: amount = int(self.data.split('|')[2]) return amount def get_content(self): content = '' if self.data: content = self.data.split('|')[1] return content def __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 = 0 if self.blocks: for k, v in self.blocks.items(): balance += v['block'].get_amount() return balance def __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|人为|100002017-07-30 19:57:57|房租|-25002017-07-30 19:57:57|衣服|-15002017-07-30 19:57:58|用饭|-10002017-07-30 19:57:58|股票收入|2002017-07-30 19:57:58|看片子|-2002017-07-30 19:57:59|购物|-10002017-07-30 19:57:59|水电费等|-100

In [50]:

# 使用柱状图展现出入记载%matplotlib inlineimport matplotlibimport numpy as npimport matplotlib.pyplot as pltplt.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()



selfamountAccountBill
二下《生活太空生活趣事多》信息筛选,说出太空生活中的四件趣事 工作纪律和生活纪律交流研讨发言稿1621字
相关内容