Python钱包系统开发:如何创建可被函数修改且保留历史的变量?
解决方法
1. 使用全局变量
在函数内部通过global关键字声明要使用全局作用域的balance变量,这样函数就能直接修改外部的余额值,而非创建局部变量。
balance = 0 def addmoney(x): global balance balance += x def withdraw(x): global balance if balance >= x: balance -= x else: print("余额不足") addmoney(10000) print(balance) # 输出10000 withdraw(3000) print(balance) # 输出7000
每次调用函数时,都会基于当前的全局余额进行更新,不会重置初始值。
2. 使用类封装(推荐)
对于钱包这类有状态的功能,用类封装数据和操作是更规范的方案,符合面向对象设计思路,还能避免全局变量的潜在问题。
class Wallet: def __init__(self): self.balance = 0 def addmoney(self, x): self.balance += x def withdraw(self, x): if self.balance >= x: self.balance -= x else: print("余额不足,无法取款") # 创建独立的钱包实例 my_wallet = Wallet() my_wallet.addmoney(10000) print(my_wallet.balance) # 输出10000 my_wallet.withdraw(4000) print(my_wallet.balance) # 输出6000
每个钱包实例都有自己独立的余额状态,调用实例方法时会直接修改该实例的余额,状态会被持久保存,还能创建多个互不干扰的钱包。
3. 使用闭包
如果不想用类,闭包可以在函数内部维护私有状态,既避免全局变量,又能持久保存余额数据。
def create_wallet(): balance = 0 def addmoney(x): nonlocal balance balance += x def withdraw(x): nonlocal balance if balance >= x: balance -= x else: print("余额不足") def get_balance(): return balance return addmoney, withdraw, get_balance # 生成钱包操作函数 add, withdraw, get_bal = create_wallet() add(10000) print(get_bal()) # 输出10000 withdraw(2000) print(get_bal()) # 输出8000
balance被封装在create_wallet内部,只能通过返回的操作函数修改和查询,保证了数据的封装性。
内容的提问来源于stack exchange,提问作者Luke Jordan Anderson
相关产品推荐
相关产品推荐

