有这样一个python问题

设想以下情况,在收银台前顾客给了收银员 𝑥块钱,而收银员应收顾客 𝑦 元,那么,请编写一个找零的函数,以 𝑥 和 𝑦为参数,比如,如果调用函数,该函数将会打印以下信息:收您¥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元。”表示相应的找零信息。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/967877
  • 除此之外, 这篇博客: python小白自学基础知识(二)附加(人狗大战游戏)中的 根据函数和面向对象(类)的知识,概括为一个总的例子(该例子我在其他的文章中见过),作为上课的内容,老师要求实现人狗大战游戏代码编写,内容中包含:人初始化的金钱额度,金钱用于买枪,枪对狗的伤害,以及狗的血量,最后是人在多少次把狗打死(其中没有涉及到人打狗的同时,狗也在咬人,但是却定义了狗对人的伤害,有兴趣的朋友可以继续把游戏做下去) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    人狗大战游戏

    #创建一个类(该类的属性会为后面的类继承调用)
    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)
    

    (这个小例子重点在掌握面向对象的继承,还有定义函数的方法,以及一些逻辑关系,程序里没有实现让狗攻击人,然后人在攻击狗,完全就是单纯的人打狗。至于函数内定义的狗的攻击力,可以作为是为了学习面相对象的继承。一起加油呀!)

  • 以下回答来自chatgpt:

    问题解答:

    实现找零功能的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
    

    其中,第一行和第二行是位置参数方式调用,第三行使用了关键字参数,第四行使用了混合方式调用。

    关于代码的实现,有如下几个要点:

    1. 定义函数时,需要指定函数名和参数列表,参数可带默认值;
    2. 函数体内部先判断顾客支付的金额是否够支付,不够支付则抛出异常;
    3. 计算找零金额并保留两位小数,使用了Python的格式化字符串;
    4. 最后,返回找零的金额和货币符号。

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^