【问题标题】:Function with boolean input not printing the expected result带有布尔输入的函数不打印预期结果
【发布时间】:2014-03-11 04:16:13
【问题描述】:

很抱歉在这个时间打扰你,但我真的在为一个程序而苦恼。我正在做一个 python 项目,我有一套非常具体的说明要遵循。在主模块中使用本地命名常量来获取座位成本和部分座位限制,这些常量将传递给以下几点描述的模块和函数。这些是说明。

• 尽管问题中有三个座位区,但将创建一组通用函数,用于基于传递的参数的任何给定区。这些函数将为每个部分调用一次:A、B 和 C。这些函数的一般逻辑如下所述:

1.) 包含输入函数 (getTickets),该函数将给定部分的部分字母和座位限制作为参数。返回给定部分的票数。这个函数应该只返回有效数量的票;应该从此函数调用验证函数ticketValid。

2.) 包含验证函数 (ticketsValid),它将每节售出的门票和每节的座位限制作为传递的参数。返回一个布尔值,指示为给定部分出售的通过票是否在有效范围内。此验证函数将从先前定义的 getTickets 函数中调用。

3.)包括收入计算函数(calcIncome),它以售票和座位成本为传递参数,并返回该部分产生的收入。

现在我的问题是,我不明白为什么我的验证器不能正常工作。我将它放在另一个函数中,但是当我运行代码时,它只是一起跳过了验证。 这是我的代码,任何帮助表示赞赏。再次感谢您在深夜提供帮助! :)

def Main():

    aPrice=20
    bPrice=15
    cPrice=10
    alimit=100
    blimit=500
    climit=200
    ticketSold=0
    getTickets(alimit)
    calcIncome(ticketSold,aPrice)
    getTickets(blimit)
    calcIncome(ticketSold,bPrice)
    getTickets(alimit)
    calcIncome(ticketSold,cPrice)


def getTickets(limit):

    ticketSold =int(input("How many tickets were sold in section? "))
    ticketsValid(ticketSold,limit)
    return ticketSold

def ticketsValid(ticketSold,limit):

    if (ticketSold>limit | ticketSold<0):
        print ("ERROR: Section A needs to be a number between 0 and 300")

def calcIncome(ticketSold,price):

    totalIncome= (price*ticketSold)
    print ("The total income for the theater section is "+str(totalIncome))

Main()

【问题讨论】:

  • 我在您粘贴的代码中没有看到“函数内的函数”...
  • 当我通过getTickets里面的ticketValid时
  • 对不起,我是新手,我会突出显示
  • if (ticketSold&gt;limit | ticketSold&lt;0):。您可能想在 python 中使用逻辑或运算符,即 or| 是按位或运算符。
  • | ==> or... -- 好像是一个错字

标签: python function parameter-passing


【解决方案1】:
  1. 在这里:ticketSold&gt;limit | ticketSold&lt;0| 更改为 or 即可。
  2. 您的calcIncome 得到ticketSold = 0,而不是新计算的收入。这是因为您在函数中使用的同名变量是本地变量,它在函数外部不可见。要修复它,请使用ticketSold = getTickets(alimit)。一般来说,如果函数应该进行一些计算,最好让函数返回一些东西,而不是使用全局变量:

    def calcIncome(ticketSold,price):
        return price*ticketSold
    
    totalIncome = calcIncome(ticketSold,cPrice)
    print totalIncome
    

【讨论】:

    【解决方案2】:

    让我们逐条审查您的要求。

    在主模块中使用本地命名常量来获取座位成本和部分座位限制,这些常量将传递给以下几点描述的模块和函数。

    所以有一个主模块,它有本地命名常量。这很容易。

    def income():
        SECTION_A = dict('name': 'A', 'seats': 100, 'price': 20)
        SECTION_B = dict('name': 'B', 'seats': 500, 'price': 15)
        SECTION_C = dict('name': 'C', 'seats': 200, 'price': 10)
    

    每个常量都是一个具有三个插槽的字典。

    虽然问题中有三个座位区,但将创建一组通用函数,用于基于传递的参数的任何给定区。这些函数将为每个部分调用一次:A、B 和 C。这些函数的一般逻辑如下所述:

    1.) 包含输入函数 (getTickets),它将给定部分的部分字母和座位限制作为参数。返回给定部分的票数。这个函数应该只返回有效数量的票;验证函数 ticketsValid 应从此函数调用。

    该要求基本上规定如果ticketsValid 返回false,则该函数不得返回。我想这意味着我们需要循环并再次询问是否没有。

        def getTickets(section_letter, seat_limit):
            while True:
                print "Tickets sold for section %s (max %d):" % (section_letter, seat_limit)
                reply = int(input())
                if ticketsValid(reply, seat_limit):
                    return reply
                else:
                    print "Sorry, try again."
    

    如果无法将输入强制转换为 int,这将失败,但这对于第一次分配来说可能是可以接受的。

    2.) 包括验证函数 (ticketsValid),该函数将每个部分售出的门票和每个部分的座位限制作为传递的参数。返回一个布尔值,指示为给定部分出售的通过票是否在有效范围内。此验证函数将从先前定义的 getTickets 函数中调用。

    如果我理解正确的话,“有效范围”是指我们不能销售超过座位限制或负数。

        def ticketsValid(number, seat_limit):
            if 0 <= number <= seat_limit:
                return True
            else:
                return False
    

    恕我直言,将它放在一个单独的函数中并没有真正的意义,尽管通过将其分解出来,调用函数可能会变得更简单。

    3.) 包括收入计算函数 (calcIncome),它将售出的门票和座位成本作为传递的参数,并返回该部分产生的收入。

    再说一次,这太简单了,放入一个单独的函数是很愚蠢的,但是如果将来计算会发生变化(添加增值税!复制一个百分比到失业基金!),把它放进去可能会很好只有一个地方。

        def calcIncome(tickets_sold, seat_cost):
            return tickets_sold*seat_cost
    

    现在剩下的就是将这些部分连接在一起,形成一个有意义的整体。注意记住将每个函数的返回值分配给一个变量!

        for section in [SECTION_A, SECTION_B, SECTION_C]:
            tickets_sold = getTickets(section['name'], section['seats'])
            ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-28
      相关资源
      最近更新 更多