设想以下情况,在收银台前顾客给了收银员 𝑥块钱,而收银员应收顾客 𝑦 元,那么,请编写一个找零的函数,以 𝑥 和 𝑦为参数,比如,如果调用函数,该函数将会打印以下信息:收您¥30.00元,找您¥10.00元,要求每个金额均保留两位小数,且前边都带有货币符号,如果是美元,则使用 $,如果是人民币则使用¥,函数默认货币符号为¥,并且函数有一个返回值表示找零的金额。
当你调用函数的时候,比如函数名为changes(),那么,尝试一下使用参数关键字和位置这两种参数书写方法。
def changes(received_money, charge, symbol="¥"):
""""""
return
def changes(received_money, charge, symbol="¥"):
print("收您{}{:.2f}元,找您{}{:.2f}元".format(symbol, received_money, symbol, received_money - charge))
return received_money - charge
changes(30, 10)
def change(x, y, symbol='¥'):
if x < y:
print("您的支付金额不足!")
return None
else:
amount = x - y
if symbol == '¥':
print("收您{}元,找您{}元。".format('%.2f' % y, '%.2f' % amount))
else:
print("收您{}元,找您{}元。".format('${:.2f}'.format(y), '${:.2f}'.format(amount)))
return amount
在该函数中,参数x和y表示顾客支付和应收的金额,而参数symbol表示货币符号,默认为 '¥' 人民币符号。函数会先判断是否支付金额不足,如果支付金额不足则会返回 None,否则函数会计算出找零金额并且打印出相应的找零信息。最后,该函数会返回找零金额。你可以在调用该函数时传入实际的参数,例如:
# 人民币收银
change(50, 30)
# 美元收银
change(50, 30, symbol='$')
输出如下:
收您30.00元,找您20.00元。
收您$30.00元,找您$20.00元。
其中,“收您30.00元,找您20.00元。”和“收您$30.00元,找您$20.00元。”表示相应的找零信息。
不知道你这个问题是否已经解决, 如果还没有解决的话:人狗大战游戏
#创建一个类(该类的属性会为后面的类继承调用)
class lable:
def __init__(self, name, aggr, hp): #类属性
self.name = name
self.aggr = aggr
self.hp = hp
class dog(lable): #创建狗的类,并且继承lable(父类)的属性
def __init__(self, name, aggr, hp, kind):
lable.__init__(self, name, aggr, hp)
self.kind = kind
#定义狗的攻击方法
def attack(self, person):
#人的血等于人当前的血量减去狗的攻击力
person.hp -= self.aggr
class person(lable): #创建人的类,同样继承lable(父类)的属性
def __init__(self, name, aggr, hp, sex):
lable.__init__(self, name, aggr, hp)
self.sex = sex
#初始化人的钱为0
self.money = 0
#定义人的攻击方法,参数对象是狗
def person_attack(self, dog):
#狗的血量等于狗当前的血量减去人的攻击力
dog.hp -= self.aggr
#定义人买枪的方法
def person_gun(self, gun):
if self.money >= gun.g_price:
#如果钱够就买枪
self.money -= gun.g_price
self.gun = gun
#枪的攻击力赋值与人的攻击力
self.aggr = gun.g_aggr
else:
print('余额不足,请充值金额打狗!')
class gun: #创建gun枪的类
#类属性 记录子弹数量,初始化为0
num_bullet = 0
def __init__(self, name, aggr, zds, price):
self.g_name = name
self.g_aggr = aggr
self.g_zds = zds
self.g_price = price
def hand_w(self,dog):
#定义人开枪的方法
while self.g_zds > 0:#保证子弹数一直是正数
if dog.hp > 0:
#人用枪打狗,伤害为枪伤害的二倍
dog.hp -= self.g_aggr * 2
self.g_zds -= 1
gun.num_bullet += 1
print('正在使用武器攻击(伤害为{}的二倍)!'.format(self.g_aggr))
print('当前{}的血条为{}'.format(dog.name,dog.hp))
else: # 防止程序陷入死循环
break
#创建实例对象
zangao = dog('zangao', 100, 200, '咬人')
tom = person('tom', 50, 10, '打狗')
m4a1 = gun('m4-a1', 20, 3, 500)
tom.money += 1000
#假想藏獒不攻击人类,只有人类用枪打狗的过程
# 构造一个循环体,当[zangao]的hp<=0时,退出循环
# 固定子弹数量
bullet_full = m4a1.g_zds
while zangao.hp > 0:
# 使用gun攻击
# 判断tom是否还有钱购买枪攻击zangao,如果没有终止循环
while tom.money >= m4a1.g_price:
# 购买武器
tom.person_gun(m4a1)
# 我们需要重置一下子弹的数量
m4a1.g_zds = 3
# 使用武器攻击(hand_w方法自带判断,这里不用加判断了)
m4a1.hand_w(zangao)
#输出消耗打狗的总子弹数
print('使用子弹数量为[%d]' % gun.num_bullet)
(这个小例子重点在掌握面向对象的继承,还有定义函数的方法,以及一些逻辑关系,程序里没有实现让狗攻击人,然后人在攻击狗,完全就是单纯的人打狗。至于函数内定义的狗的攻击力,可以作为是为了学习面相对象的继承。一起加油呀!)
问题解答:
实现找零功能的Python函数可以这么写:
def change_money(x, y, currency="¥"):
"""
:param x: float, 顾客支付的金额
:param y: float, 应收金额
:param currency: str, 货币符号,默认为人民币符号"¥"
:return: str, 找零金额和货币符号,保留2位小数
"""
if x < y:
raise ValueError("The payment is not enough.")
change = x - y
return "{0}{1:.2f}".format(currency, round(change, 2))
其中,x、y为关键字参数,currency为位置参数。使用函数时,可以按位置传递参数,也可以按关键字传递参数,也可以混合使用。例如:
print(change_money(100, 78.5)) # 输出:¥21.50
print(change_money(x=100, y=78.5)) # 输出:¥21.50
print(change_money(y=78.5, x=100)) # 输出:¥21.50
print(change_money(100, 78.5, "$")) # 输出:$21.50
print(change_money(y=78.5, x=100, currency="$")) # 输出:$21.50
其中,第一行和第二行是位置参数方式调用,第三行使用了关键字参数,第四行使用了混合方式调用。
关于代码的实现,有如下几个要点: