Python выводит переменную из цикла

#python

#python

Вопрос:

Переменная Total bottles в модуле getBottles сбрасывается в 0 при выходе из цикла while counter <8. Я также пытался использовать операторы return, но безрезультатно. Как мне получить значение из переменной totalBottles для передачи в мой другой модуль.

 global totalBottles, totalPayout, todayBottles
totalBottles=0 #store the accumulated bottle values
counter=1 #will control the loop
todayBottles=0 #store the number of bottles returned on a day
totalPayout=0 #store the calculated value of totalBottles x.10

def main():
    keepGoing='y'

    while keepGoing =='y':
        getBottles (totalBottles, todayBottles, counter)
        calcPayout (totalBottles, totalPayout)
        printInfo(totalBottles, totalPayout)
        keepGoing == raw_input ('Do you want to run the program again?')

def getBottles (totalBottles, todayBottles, counter):
    while counter <8:
        todayBottles = input ('Enter number of bottles returned for the day:')
        totalBottles = todayBottles   totalBottles
        counter=counter   1

def calcPayout(totalBottles, totalPayout):
    totalPayout = totalBottles * .10

def printInfo(totalBottles, totalPayout):
    print totalBottles,('is the total bottles')
    print totalPayout, ('amount due')

main()
  

Комментарии:

1. Это … почти невероятно… Я, честно говоря, удивлен!

2. Я понятия не имею, что это значит.

3. Извините, но эта проблема не дает мне покоя с прошлой ночи. Я действительно хочу разобраться в этом. Как бы вы справились с выводом числа. Я новичок, и меня направили спросить онлайн.

Ответ №1:

я не могу удержаться … (хотя с этим все еще есть проблемы, по крайней мере, это может сработать там, где другое не сработает)

 class Bottles:
    def __init__(self):
       self.totalBottles=0 #store the accumulated bottle values
       self.counter=1 #will control the loop
       self.todayBottles=0 #store the number of bottles returned on a day
       self.totalPayout=0 #store the calculated value of totalBottles x.10

    def getBottles(self):
        while self.counter <8:
            self.todayBottles = input ('Enter number of bottles returned for the day:')
            self.totalBottles = self.todayBottles   self.totalBottles
            self.counter=self.counter   1

    def calcPayout(self):
        self.totalPayout = self.totalBottles * .10

    def printInfo(self):
        print self.totalBottles,('is the total bottles')
        print self.totalPayout, ('amount due')

def main():
    keepGoing='y'

    while keepGoing =='y':
        b = Bottles()
        b.getBottles()
        b.calcPayout()
        b.printInfo()
        keepGoing == raw_input ('Do you want to run the program again?')

main()
  

Ответ №2:

если вы хотите использовать глобальные переменные, вы также должны указать это в функции :

 global totalBottles, totalPayout, todayBottles
totalBottles=0 #store the accumulated bottle values
counter=1 #will control the loop
todayBottles=0 #store the number of bottles returned on a day
totalPayout=0 #store the calculated value of totalBottles x.10

def main():
    global totalBottles, totalPayout, todayBottles
    keepGoing='y'

    while keepGoing =='y':
        getBottles (counter)
        calcPayout ()
        printInfo(totalBottles, totalPayout)
        keepGoing == raw_input ('Do you want to run the program again?')

def getBottles (counter):
    global totalBottles, todayBottles
    while counter <8:
        todayBottles = input ('Enter number of bottles returned for the day:')
        totalBottles = todayBottles   totalBottles
        counter=counter   1

def calcPayout():
    global totalBottles, totalPayout, todayBottles
    totalPayout = totalBottles * .10

def printInfo(totalBottles, totalPayout):
    print totalBottles,('is the total bottles')
    print totalPayout, ('amount due')

main()
  

в противном случае вы могли бы использовать возвращаемые значения :

 global totalBottles, totalPayout, todayBottles
totalBottles=0 #store the accumulated bottle values
counter=1 #will control the loop
todayBottles=0 #store the number of bottles returned on a day
totalPayout=0 #store the calculated value of totalBottles x.10

def main():

    keepGoing='y'
    while keepGoing =='y':
        totalBottles = getBottles(totalBottles, todayBottles)
        totalPayout = calcPayout (totalBottles)
        printInfo(totalBottles, totalPayout)
        keepGoing == raw_input ('Do you want to run the program again?')

def getBottles (totalBottles, todayBottles):
    counter=1
    while counter <8:
        todayBottles = input ('Enter number of bottles returned for the day:')
        totalBottles = todayBottles   totalBottles
        counter=counter   1
    return totalBottles

def calcPayout(totalBottles):
    totalPayout = totalBottles * .10
    return totalPayout

def printInfo(totalBottles, totalPayout):
    print totalBottles,('is the total bottles')
    print totalPayout, ('amount due')

main()
  

Комментарии:

1. def getBottles (totalBottles, todayBottles, counter): global totalBottles, todayBottles вызовет ошибку, потому что вы объявляете totalBottles и todayBottles как локальную, так и глобальную переменную. SyntaxError: name 'totalBottles' is local and global

Ответ №3:

Может ли проблема быть связана с областью видимости? Кажется, вы объявили глобальные переменные, а затем передаете их в своих вызовах метода. Интересно, не запутался ли он, используя локальный totalBottles вместо глобального. Попробуйте это, не передавая ваши глобальные переменные.

Комментарии:

1. Черт возьми, я как раз собирался опубликовать это:-(Я на самом деле протестировал это, и если у вас есть все методы, такие как def getBottles (totalBottles, todayBottles, counter): ... be def getBottles(): global totalBottles, todayBottles, counter , это работает

Ответ №4:

Использование global в глобальном пространстве имен ничего не дает. Если вы хотите обновить глобальную из функции, вы должны использовать ее там:

 def calcPayout():
    global totalPayout
    totalPayout = totalBottles * .10 # now the global gets updated
  

Вы должны сделать это для всех ваших функций.

Гораздо, гораздо более разумный способ — использовать return:

 def calcPayout(totalBottles):
    return totalBottles * .10

totalPayout = calcPayout(totalBottles)