布尔输入的函数不打印预期结果

时间:2014-03-11 04:16:14

标签: python function parameter-passing

很抱歉在这个时候打扰你,但我真的很挣钱。我正在开发一个python项目,我有一组非常具体的指令要遵循。在主模块中使用本地命名常量来获取座位成本和部分座位限制,这些限制将传递给在以下几点下描述的模块和功能。这些是说明。

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

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

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()

2 个答案:

答案 0 :(得分:1)

  1. 此处:ticketSold>limit | ticketSold<0|更改为or,这样就可以了。
  2. 您的calcIncome得到ticketSold = 0,而不是新计算的收入。这是因为您在函数中使用的具有相同名称的变量是本地的,在函数外部不可见。要修复它,请使用ticketSold = getTickets(alimit)。一般来说,如果函数应该进行一些计算而不是使用全局变量,那么让函数返回一些东西是个好主意:

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

答案 1 :(得分:1)

让我们逐一审核您的要求。

  

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

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

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函数中调用此验证函数。

如果我理解正确,&#34;有效范围&#34;意味着我们不得卖出超过座位限额或负数。

    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'])
        ...