【问题标题】:Cannot pass returned values from function to another function in python无法将函数的返回值传递给python中的另一个函数
【发布时间】:2017-09-22 21:49:42
【问题描述】:

我的目标是创建一个小程序来检查客户是否获得银行贷款的批准。它要求客户每年收入 > 30k,并且在他/她目前的工作中至少有 2 年的经验。这些值是通过用户输入获得的。我实现了正则表达式来验证输入只是没有任何字符串或负数的数字,也不是 0。

但是第三个函数 asses_customer 总是在执行 else 部分。我认为每次参数要么是无,要么是 0

这里是源代码:

import sys
import re
import logging
import self as self


class loan_qualifier():

    # This program determines whether a bank customer
    # qualifies for a loan.

    def __init__(self): #creates object
        pass

def main():

        salary_check()
        work_exp_check()
        asses_customer(salary = 0, years_on_job = 0)


def salary_check():

        input_counter = 0  # local variable

        # Get the customer's annual salary.
        salary = raw_input('Enter your annual salary: ')
        salary = re.match(r"(?<![-.])\b[1-9][0-9]*\b", salary)

        while not salary:

            salary = raw_input('Wrong value. Enter again: ')
            salary = re.match(r"(?<![-.])\b[1-9][0-9]*\b", salary)

            input_counter += 1

            if input_counter >= 6:
                print ("No more tries! No loan!")
                sys.exit(0)
            else:
                return salary


def work_exp_check():

        input_counter = 0 #local variable to this function

        # Get the number of years on the current job.
        years_on_job = raw_input('Enter the number of ' +
                                 'years on your current job: ')
        years_on_job = re.match(r"(?<![-.])\b[1-9][0-9]*\b", years_on_job)

        while not years_on_job:

            years_on_job = raw_input('Wrong work experience. Enter again: ')
            years_on_job = re.match(r"(?<![-.])\b[1-9][0-9]*\b", years_on_job)

            input_counter += 1

            if input_counter >= 6:
                print ("No more tries! No loan!")
                sys.exit(0)
            else:
                return years_on_job

def asses_customer(salary, years_on_job):

        # Determine whether the customer qualifies.
        if salary >= 30000.0 or years_on_job >= 2:

            print 'You qualify for the loan. '
        else:
            print 'You do not qualify for this loan. '

# Call main()
main()

【问题讨论】:

  • 下次会记住的,谢谢
  • 你只能用asses_customer(salary = 0, years_on_job = 0) 打电话给asses_customer;你期望参数是什么? (另外,动词“assess”的结尾有两个S;一个S给你一堆驴子。)
  • 你能帮我以正确的方式做吗?
  • 我没有说它会改变任何东西。出于某些原因,您应该始终确保具有准确的缩进。与您在问题中看到的内容相比,您的代码的实际格式可能会令人困惑,并且还可能导致代码执行出现问题。

标签: python python-2.7


【解决方案1】:

你说过:

要求客户年收入 > 30k,并且在当前工作中至少有 2 年的工作经验。

我们可以编写一些简单的语句来请求一个数字,如果没有给出一个数字,则再次请求该数字。

以下代码是实现该目标的一种非常简单的方法。

class Loan_Checker():
    def __init__(self):
        self.salary = 0
        self.years_on_job = 0

        self.request_salary()
        self.request_years()
        self.check_if_qualified()

    def request_salary(self):
        x = raw_input('Enter your annual salary: ')
        try:
            self.salary = int(x)
        except:
            print("Please enter a valid number")
            self.request_salary()

    def request_years(self):
        x = raw_input('Enter the number of years on your current job: ')
        try:
            self.years_on_job = int(x)
        except:
            print("Please enter a valid number")
            self.request_years()

    def check_if_qualified(self):
        if self.salary >= 30000 and self.years_on_job >= 2:
            print 'You qualify for the loan. '
        else:
            print 'You do not qualify for this loan. '

Loan_Checker()

【讨论】:

  • 谢谢队友,感谢您的帮助!
【解决方案2】:

您的代码中有一些错误,我已经对其进行了重构,以使用您似乎想要暗示的类结构。

import sys
import re
import logging

class loan_qualifier():

    # This program determines whether a bank customer
    # qualifies for a loan.

    def __init__(self): #creates object
        self.salary = self.salary_check()
        self.years_on_job = self.work_exp_check()


    def salary_check(self):

        input_counter = 0  # local variable

        # Get the customer's annual salary.
        salary = None

        while salary is None:
            if input_counter >= 6:
                print ("No more tries! No loan!")
                sys.exit(0)
            elif input_counter >= 1:
                print ("Invalid salary.")

            salary = raw_input('Enter your salary: ')
            salary = re.match(r"(?<![-.])\b[1-9][0-9]*\b", salary).group(0)
            input_counter += 1

        # broke out of loop, so valid salary
        return salary




    def work_exp_check(self):

        input_counter = 0 #local variable to this function

        # Get the number of years on the current job.
        years_on_job = None

        while years_on_job is None:
            if input_counter >= 6:
                print ("No more tries! No loan!")
                sys.exit(0)
            elif input_counter >= 1:
                print ("Invalid year amount")

            years_on_job = raw_input('Enter the number of years at your current job: ')
            years_on_job = re.match(r"(?<![-.])\b[1-9][0-9]*\b", years_on_job).group(0)

            input_counter += 1

        # broke out of loop, so valid years_on_job
        return years_on_job



    def assess_customer(self):

        # Determine whether the customer qualifies.
        if int(self.salary) >= 30000.0 and int(self.years_on_job) >= 2:
            print 'You qualify for the loan. '
        else:
            print 'You do not qualify for this loan. '

if __name__ == "__main__":
    lq = loan_qualifier()
    lq.assess_customer()

修复的一些错误包括您最初调用assess_customer 的方式(您在函数调用中为两个值都分配了0),以及assess:p 的拼写。您在assess_customer 中的条件也应该是and 而不是or(您希望两个条件都为真以使其符合条件,而不是任何一个条件都为真)。

实际上你甚至不需要这样做:

self.salary = self.salary_check()
self.years_on_job = self.work_exp_check()

行。您可以直接在函数中分配类变量(即不返回,只需在salary_check 中设置self.salary = blah)。不过,这是个人选择的事情。我认为这很清楚。

希望这一切你都清楚。如果您有任何问题,请告诉我。只需键入 python NAME_OF_YOUR_FILE.py 即可调用代码。

编辑:我不知道薪水和年限支票有多么损坏,新代码应该可以修复它们。

编辑:修复了此版本中的正则表达式结果。我的错。

【讨论】:

  • 非常感谢您抽出宝贵时间,明天我会详细回顾一下(这里是凌晨 3 点 12 分,我要在笔记本电脑上睡着了。明天会更新您。跨度>
  • 是的,不用担心。我刚刚更新了它以正确执行薪水和 years_on_the_job 的检查。我没有意识到他们之前没有拒绝不良案例。
  • 非常感谢@Saedeas,现在查看了您的更改,看起来好多了。我只面临以下问题 - 现在'assess_customer'函数总是打印第一条语句,无论输入如何。我无法调试它(任何想法为什么我不能用断点调试?还有最后一行:'if name == "main": lq = loan_qualifier( ) lq.assess_customer()' 我相信这是在调用主函数还是……它在哪里?我很好奇,谢谢:)
  • 更新:我用 pdb,set_trace() 进行了调试,但我不明白为什么它总是执行第一个打印语句(if 子句始终为真)这里有问题。
  • 我的错,我没有看到这条评论。我忘记了我在测试代码的 .group(0) 部分中添加了,而不是在这里。从正则表达式中获取实际的字符串结果。然后我将它转换为检查中的 int 。代码现在可以工作了。
【解决方案3】:

在这个片段中,您总是传递第三个函数 salary = 0years_on_job = 0

试试这个方法:

salary = salary_check()
years_on_job = work_exp_check()
asses_customer(salary, years_on_job)

【讨论】:

  • 是的,试过了,但是当我到达函数时出现这个错误: Traceback(最近一次调用最后一次):文件“C”,第 76 行,在 main() 文件“C: assess_customer(salary, years_on_job) NameError: global name 'salary' is not defined
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-10
  • 2019-07-25
  • 1970-01-01
  • 2021-04-21
  • 2021-08-14
  • 1970-01-01
相关资源
最近更新 更多