我可以在函数中定义变量吗?

2024-06-01 04:39:45 发布

您现在位置:Python中文网/ 问答频道 /正文

最近,我在自学时遇到了一个初学者的问题,要求我编写一个程序来计算给定输入的工时和小时工资。超过40小时的任何时间,都应支付半小时工资。我成功地做到了这一点,但出于某种原因,我觉得这很奇怪。以下代码非常有效,我在作业中获得了100%的分数:

def computepay(h,r):
    try:
        hrsfloat = float(h)
    except:
        print("Error: 'Hours' must be a number")
        quit()
    try:
        ratefloat = float(r)
    except:
        print("Error: 'hourly rate in dollars' must be a number")
        quit()
    if hrsfloat <= 40:
        return(hrsfloat*ratefloat)
    else:
        x=hrsfloat-40
        return((1.5 * x + 40) * ratefloat)

h = input("Enter Hours:")
r = input("Enter hourly rate in dollars:")
p = computepay(h,r)
print('Pay', p)

但出于某种原因,我宁愿把

 h = input("Enter Hours:")
 r = input("Enter hourly rate in dollars:")

computepay的定义中,以以下方式:

def computepay(h,r):
    h = input("Enter Hours:")
    r = input("Enter hourly rate in dollars:")
    try:
        hrsfloat = float(h)
    except:
        print("Error: 'Hours' must be a number")
        quit()
    try:
        ratefloat = float(r)
    except:
        print("Error: 'hourly rate in dollars' must be a number")
        quit()
    if hrsfloat <= 40:
        return(hrsfloat*ratefloat)
    else:
        x=hrsfloat-40
        return((1.5 * x + 40) * ratefloat)

p = computepay(h,r)
print('Pay', p)

但这会返回一个错误:

Traceback (most recent call last): File "C:[redacted]", line 20, in p = computepay(h,r) NameError: name 'h' is not defined

那么,有没有一种方法可以写入computepay,从而使它以这种方式自包含?我不知道为什么我觉得必须这么做,但我真的这么做了


Tags: ininputrateerrorfloatprintenterhourly
3条回答

您可以指定默认值None,以确定是否需要用户输入:

def computepay(h=None, r=None):
    if h is None:
        h = input("Enter Hours:")
    if r is None:
        r = input("Enter hourly rate in dollars:")
    try:
        hrsfloat = float(h)
    except:
        print("Error: 'Hours' must be a number")
        quit()
    try:
        ratefloat = float(r)
    except:
        print("Error: 'hourly rate in dollars' must be a number")
        quit()
    if hrsfloat <= 40:
        return(hrsfloat*ratefloat)
    else:
        x=hrsfloat-40
        return((1.5 * x + 40) * ratefloat)

然后您可以用几种不同的方式调用computepay,包括

p1 = computepay(40, 19)

p2 = computepay(40)  # Prompts for hours

p3 = computepay(r=19)  # Prompts for hourly rate

p4 = computepay()  # Prompts for hours and hourly rate

我认为保持computepay函数的原样是最有意义的:获取一些参数,从这些参数中计算一些东西,然后返回结果。然后,您可以将所有代码放入一个函数中,我在这里按约定调用了main,稍后将调用该函数:

def main():
    h = input("Enter Hours:")
    r = input("Enter hourly rate in dollars:")
    p = computepay(h,r)
    print('Pay', p)

main()

是的,你可以。如错误消息所示,问题在于hr在调用函数的位置不存在:

p = computepay(h,r)

请注意,这些函数与函数中定义的函数不同!如果你感到困惑,请仔细阅读scopes

解决方案是省略函数定义和调用站点中的参数:

def computepay():
    ...

p = computepay()

然而,有理由将这些变量作为参数传递。如果它只做一件事(计算工资),而不是做两件正交的事(请求输入,然后计算工资),那么它会使您的函数更加通用。如果您将这些值作为参数传递,则函数不关心它们来自何处,因此调用代码可以从文件或GUI中读取它们,而无需修改函数本身

这种多功能性还使函数更易于进行单元测试,Python以doctests的形式特别支持单元测试

如果你还在掌握语言的基本知识,你就不必担心这一点。我只是想提一下

相关问题 更多 >