如何在python中使参数非特定?

Posted

技术标签:

【中文标题】如何在python中使参数非特定?【英文标题】:How to make arguments non-specific in python? 【发布时间】:2020-08-11 18:43:39 【问题描述】:

我有一个披萨店成本计算器的 Python 代码,它在给定订单后计算成本,其中可以包括披萨、饮料、鸡翅和优惠券。它不一定要有所有这些论点,它会有各种各样的。这就是我卡住的地方。 我有代码,但我需要使用默认值参数来制作它,以便插入的任何数量的参数都会产生有效的输出。 (关于位置参数)

这是代码:

def pizza_cost(pizorders):
    total = 0
    for order in pizorders:
        total += 13
        if "pepperoni" in order:
            total = total + (x.count("pepperoni") * 1)
        if "mushroom" in order:
            total = total + (x.count("mushroom") * 0.5)
        if "olive" in order:
            total = total + (x.count("olive") * 0.5)
        if "anchovy" in order:
            total = total + (x.count("anchovy") * 2)
        if "ham" in order:
            total = total + (x.count("ham") * 1.5)
    return total

def drink_cost(driorders):
    total = 0
    for order in driorders:
        if order == "small":
            total = total + (x.count("small") * 2)
        if order == "medium":
            total = total + (x.count("medium") * 3)
        if order == "large":
            total = total + (x.count("large") * 3.5)
        if order == "tub":
            total = total + (x.count("tub") * 3.75)
    return total

def wing_cost(wingorders):
    total = 0
    for order in wingorders:
        if order == 10:
            total += 5
        if order == 20:
            total += 9
        if order == 40:
            total += 17.5
        if order == 100:
            total += 48
    return total


def cost_calculator(*pizzas, *drinks, *wings, *coupon):
    total = 0
    total += pizza_cost(pizzas)
    total += drink_cost(drinks)
    total += wing_cost(wings)
    tax = total * 0.0625
    discount = total * coupon
    total += tax
    total -= discount
    return total

这是错误:

   TypeError                                 Traceback (most recent call last)
~/opt/anaconda3/lib/python3.7/site-packages/bwsi_grader/__init__.py in compare_functions(student, soln, fn_args, fn_kwargs, function_name, comparison_function)
    110     try:
--> 111         student_out = student(*fn_args, **fn_kwargs)
    112     except Exception as e:

TypeError: cost_calculator() missing 3 required positional arguments: 'drinks', 'wings', and 'coupon'

During handling of the above exception, another exception occurred:

StudentError                              Traceback (most recent call last)
<ipython-input-13-322b790cbb8b> in <module>
      1 # Execute this cell to grade your work
      2 from bwsi_grader.python.pizza_shop import grader
----> 3 grader(cost_calculator)

~/opt/anaconda3/lib/python3.7/site-packages/bwsi_grader/python/pizza_shop.py in grader(student_func)
    191     for pizzas, items in zip(std_pizzas, std_orders):
    192         compare_functions(student=student_func, soln=soln,
--> 193                           fn_args=tuple(pizzas), fn_kwargs=items)
    194 
    195     for i in range(1000):

~/opt/anaconda3/lib/python3.7/site-packages/bwsi_grader/__init__.py in compare_functions(student, soln, fn_args, fn_kwargs, function_name, comparison_function)
    111         student_out = student(*fn_args, **fn_kwargs)
    112     except Exception as e:
--> 113         raise StudentError(f"\nCalling \n\tpad_indent(sig, ln=4)\nproduces the following error:"
    114                            f"\n\ttype(e).__name__:e"
    115                            f"\nPlease run your function, as displayed above, in your Jupyter "

StudentError: 
Calling 
    student_function([])
produces the following error:
    TypeError:cost_calculator() missing 3 required positional arguments: 'drinks', 'wings', and 'coupon'
Please run your function, as displayed above, in your Jupyter notebook to get a detailed stacktrace of the error, and debug your function.

【问题讨论】:

发布文字,而不是文字图片。 Under what circumstances may I add “urgent” or other similar phrases to my question, in order to obtain faster answers? 如果您想了解未指定数量的位置参数,请查看***.com/questions/36901/… @JosephSible-ReinstateMonica 对于紧急评论,我深表歉意,老实说,我认为我根本不会得到回复,因为这是一个如此大的平台。 @Eric Truett 谢谢你的资源,我在我的论点前添加了“*”,但我不认为它有效。 【参考方案1】:

当您声明一个不使用默认参数的函数时,Python 希望您必须为每个参数提供一个输入。默认参数将允许您不为参数添加任何内容。

def cost_calculator(pizza=[], drinks=[], wings=[], coupon=0.0):

     ''' your code here '''

非默认参数被称为位置参数,因为它们总是必须输入并且必须以正确的顺序输入。

对于默认参数,您应该确保在进行函数调用时输入参数的名称:

cost_calculator(drinks=['small', 'small', 'large'], coupon=0.2)

我认为这应该在评分代码中起作用。他们正在使用一种称为 dictionary unpacking 的方法,该方法允许您将所有默认参数作为字典对象提交,按惯例称为 kwargs

【讨论】:

我不确定这是否有效,因为评分者会提交许多随机参数,有或没有某些参数,如披萨、饮料等。我明白你在说什么,但我的代码中没有能放东西进去,就只能准备拿到各种订单了。非常感谢您的帮助,希望您能进一步帮助我! @ah123412312 你试过了吗?我向您展示的案例将使您可以提交任何随机参数。请尝试一下,如果有错误告诉我。 是的,我确实尝试过,正如我所说,我很确定我自己不能将参数输入代码中,这就是评分者会做的事情。这是出现的错误:StudentError: Calling student_function([]) 产生以下错误:TypeError:cost_calculator() 接受 0 个位置参数但给出了 1 请在 Jupyter 笔记本中运行您的函数,如上所示,以获得错误的详细堆栈跟踪,并调试您的函数。 该代码不会将参数提供给您的代码。它使您的函数准备好接受具有特定名称的参数。 positional argument 表示没有 = 的那个。等于的那些称为keyword arguments。我猜你的函数需要 1 个位置参数,可能是广场。我会尝试:def cost_calculator(pizza, drinks=[], wings=[], coupon=0.0): 好的,我确实试过了,它似乎可以工作,但是当函数只传递[]时它不起作用。该错误表明预期为 13.81 美元,但该函数给出了零。类似的情况,只给了一杯饮料和一张优惠券,功能是给3.61美金什么的,但是给了16.61美金。

以上是关于如何在python中使参数非特定?的主要内容,如果未能解决你的问题,请参考以下文章

非特定数据类实例的类型提示

将非特定数量的数据集行添加到列表中

java如何判断一个字符串中是不是包含标点符号(任意标点符号,非特定)?

Linux C下非特定波特率的配置和使用

非特定的 `include 文件名 - 系统 Verilog 编译器指令

redis非特定类型命令