Python - Passing variables through functions(Python-通过函数传递变量)
问题描述
我使用Python大约有一周了。我已经研究了与此相关的各种其他问题,并对我执行这些建议的尝试失败感到相当沮丧。
根据我读到的内容,我尝试了几种传递变量的方法。例如(这不一定代表连贯的尝试.我尝试了许多变体,不得不返回以获取值得发布的代码):
def verify_nums():
    globhours = hours
    globrate = rate
    try:
        globhours = float(globhours)
        globrate = float(globrate)
        return globhours,globrate
    except:
        print("You must provide numbers")
def calc():
    globhours = globhours
    globrate = globrate
    if globhours > 40:
        base = 40 * globrate
        ot = (globhours - 40) * (globrate * 1.5)
        pay = base + ot
        print(pay)
    else:
        pay = globrate * globhours
        print(pay)
hours = input("Enter hours worked: ")
rate = input("Enter hourly rate: ")
verify_nums()
calc()
我对如何将小时和费率变量传递给calc()函数感到非常困惑。
我最终认为我可以将这些合并到一个函数中.
def paycalc(hours,rate):
    etc.
    etc.
hours = input("Enter hours: ")
hours = input("Enter hours: ")
paycalc(hours,rate)
但是为了学习,我真的很想把这个全局/局部的事情弄清楚。
谢谢您的帮助!
Python
您似乎试图让推荐答案根据它们的名称猜测哪些函数应该是全局的,哪些是本地的。Python不能做到这一点。如果为函数中的变量赋值,并希望该赋值是全局的,则需要在函数的顶部使用global语句:
def verify_nums():
    global globhours
    global blograte
    globhours = hours
    globrate = rate
    # ...
此外,globhours = globhours不会做任何有用的事情-事实上,它会导致问题。如果在该函数中也使用global globhours,则该语句没有意义。否则,您将创建一个局部变量,并将其赋值为…尚不存在局部变量的值。
无论如何,如果您将正确的global声明添加到所有函数,它们将会起作用,但这不是一个很好的设计。
这里确实不需要任何全局变量。如果您考虑的是值而不是变量,那么一切都会变得容易得多。
您的verify_nums函数需要处理两个值。因此,只需将这些值作为参数传递即可。并且它需要返回两个值-这很简单,您已经完成了这一部分。
现在调用方必须存储它返回的这两个值,以便可以将它们传递给calc函数。它还可以接受两个值作为参数。
把这些放在一起:
def verify_nums(hours, rate):    
    try:
        numhours = float(hours)
        numrate = float(rate)
        return numhours, numrate
    except:
        print("You must provide numbers")
def calc(hours, rate):
    if hours > 40:
        base = 40 * rate
        ot = (hours - 40) * (rate * 1.5)
        pay = base + ot
        print(pay)
    else:
        pay = rate * hours
        print(pay)
globhours = input("Enter hours worked: ")
globrate = input("Enter hourly rate: ")
hours, rate = verify_nums(globhours, globrate)
calc(hours, rate)
剩下的一个问题是:如果用户输入出现错误,会发生什么情况?在
verify_nums中,您使用except:处理错误,然后打印一条消息,什么也不做。这意味着您返回None。因此,当调用者尝试执行hours, rate = None时,它将得到一个错误,而您没有处理该错误。你不能没有价值观就这样生活下去。您能做什么?
更笼统地说,"返回一对数字,或返回None"对于函数来说是一个令人困惑的约定。你怎么使用那个功能?还有一大堆丑陋的类型检查。但是,"返回两个数字,或者提出一个例外"是一个非常好的合同。你怎么使用那个功能?使用简单的try。
这就是为什么最好将异常处理放在您可以处理它的正确位置。如果出现错误,您希望跳过调用calc,因此except必须位于您调用calc的位置。
def verify_nums(hours, rate):    
    numhours = float(hours)
    numrate = float(rate)
    return numhours, numrate
def calc(hours, rate):
    if hours > 40:
        base = 40 * rate
        ot = (hours - 40) * (rate * 1.5)
        pay = base + ot
        print(pay)
    else:
        pay = rate * hours
        print(pay)
try:
    globhours = input("Enter hours worked: ")
    globrate = input("Enter hourly rate: ")
    hours, rate = verify_nums(globhours, globrate)
except ValueError:
    print("You must provide numbers")
else:
    calc(hours, rate)
您可能需要考虑的另一个改进是:让calc返回工资,而不是打印它,并让调用者打印它返回的值。
这篇关于Python-通过函数传递变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Python-通过函数传递变量
				
        
 
            
        基础教程推荐
- 使用大型矩阵时禁止 Pycharm 输出中的自动换行符 2022-01-01
 - Plotly:如何设置绘图图形的样式,使其不显示缺失日期的间隙? 2022-01-01
 - 在同一图形上绘制Bokeh的烛台和音量条 2022-01-01
 - PermissionError: pip 从 8.1.1 升级到 8.1.2 2022-01-01
 - 求两个直方图的卷积 2022-01-01
 - PANDA VALUE_COUNTS包含GROUP BY之前的所有值 2022-01-01
 - 无法导入 Pytorch [WinError 126] 找不到指定的模块 2022-01-01
 - 修改列表中的数据帧不起作用 2022-01-01
 - 包装空间模型 2022-01-01
 - 在Python中从Azure BLOB存储中读取文件 2022-01-01
 
    	
    	
    	
    	
    	
    	
    	
    	
				
				
				
				