@Timebird

Как правильно определить области видимости переменных?

Здравствуйте!

Допустим, объявляются функции подобным образом:
for i in range(80):
    for k in range(800):
        obj1 = func1()
        obj2 = func2(obj1)
        obj3 = func3(obj1, obj2)
, причем функция func3 выглядит как-то так:
def func3(.., ..):
    counter = 0
    ...
    for elem in range(3):
        #<do_something>
        counter += 1


Какждый прогон по циклу for elem in range(3): увеличивает значение счётчика, но... Так как вызов функций тоже в циклах, то счетчик не накапливает единички постоянно, а каждый новый прогон for k in range(800) (например) снова сбрасывает счётчик в 0, очевидно. И всё начинается заново.
Необходимо накапливать единички и с учётом циклов в вызовых функций. Не понимаю, как это сделать, ведь начальное значение счётчика тоже нужно где-то объявить (counter = 0). Пытался поместить его в качестве глобальной переменной, но тогда функция def func3 его не находит.

Вопрос сложно формулируемый, рассказал как смог. Подскажите пожалуйста, если кто-то понял.
  • Вопрос задан
  • 159 просмотров
Решения вопроса 1
longclaps
@longclaps
Вроде работает:
counter = 0
for i in range(80):
    for k in range(800):
        obj1 = func1()
        obj2 = func2(obj1)
        obj3 = func3(obj1, obj2)

def func3(.., ..):
    global counter
    ...
    for elem in range(3):
        #<do_something>
        counter += 1
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@nirvimel
class MyCounter(object):
    def __init__(self, initial_value=0):
        self._value = initial_value
    def do_count(self, iterable):
        for _ in iterable:
            # do something
            self._value += 1
    @property
    def value(self):
        return self._value

c = MyCounter()
c.do_count(range(10))
c.do_count(range(10))
print(c.value)

Выводит:
20
Ответ написан
Комментировать
@fireSparrow
Глобальные переменные крайне не рекомендуется использовать там, где можно обойтись без них.

Используйте функции-генераторы. Информацию о них легко нагуглить, поискав "yield питон".

Вот пример простого кода, в котором функция запоминает значение счётчика между итерациями:

def func():
    counter = 0
    while True:
      for elem in range(3):
          # do something
          counter += 1
      yield counter

current_func = func()        
for i in range(5):
  print(next(current_func))
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы