Форум сайта python.su
Не могу разобраться - вот пример кода для подсчета суммы цифр числа, используется функция без параметра:
def print_digit_sum():
… sm = 0
… for i in str(n):
… sm += int(i)
… print(sm)
…
>>> n = int(input())
12345
>>> print_digit_sum()
Результат выполнения функции здесь ведь зависит от параметра n, но тем не менее в объявлении функции он отсутствует. В других случаях применение параметров в объявлении функции необходимо.
Помогите пожалуйста разобраться - как определить , когда можно обойтись без параметров, а когда нет .
Офлайн
Учебники нынче не в моде…
https://habr.com/ru/companies/otus/articles/487952/
Офлайн
dmitry1959Есть глобальные переменные и есть локальные переменные. Когда делаешь функцию, у неё определяется локальная область видимости и глобальная область видимости. Глобальная область видимости находится за пределами функции, локальная область видимости находится в пределах функции. Когда делаешь переменные с одинаковыми именами, то в разных областях видимости это разные переменные.
Результат выполнения функции здесь ведь зависит от параметра n, но тем не менее в объявлении функции он отсутствует. В других случаях применение параметров в объявлении функции необходимо.
Помогите пожалуйста разобраться - как определить , когда можно обойтись без параметров, а когда нет .
n = 10 def f(n): print(n) n = 1 print(n) n = 2 print(n) print(n) f(0) print(n) n = 20 print(n) f(0) print(n)
>>> >>> n = 10 >>> >>> def f(n): ... print(n) ... n = 1 ... print(n) ... n = 2 ... print(n) ... >>> print(n) 10 >>> f(0) 0 1 2 >>> print(n) 10 >>> >>> n = 20 >>> >>> print(n) 20 >>> f(0) 0 1 2 >>> print(n) 20 >>>
def f(n):
f(0)
n = 20 def g(): print(n) print(n) g() print(n)
>>> >>> n = 20 >>> >>> def g(): ... print(n) ... >>> print(n) 20 >>> g() 20 >>> print(n) 20 >>>
n = 20 def h(): global n print(n) n = 30 print(n) print(n) h() print(n)
>>> >>> n = 20 >>> >>> def h(): ... global n ... print(n) ... n = 30 ... print(n) ... >>> print(n) 20 >>> h() 20 30 >>> print(n) 30 >>>
n = 20 def h(): print(n) n = 30 print(n) print(n) h() print(n)
>>> >>> n = 20 >>> >>> def h(): ... print(n) ... n = 30 ... print(n) ... >>> print(n) 20 >>> h() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in h UnboundLocalError: local variable 'n' referenced before assignment >>> print(n) 20 >>>
Отредактировано py.user.next (Май 12, 2023 09:23:35)
Офлайн
Большое спасибо Вам за время, потраченное на разбор моего вопроса. То, что локальная и глобальная переменная, имеющие одинаковые имена это разные вещи, поскольку ссылаются на разные объекты в памяти - это я в курсе. Но в таком коде:
def sum_digits(n):
result = 0
while n > 0:
result += n % 10
n //= 10
return result
n = int(input())
print(sum_digits(n))
переменная n (когда n = int(input())) ведь тоже находится в глобальной области видимости как и в предыдущем коде, поскольку она находится вне функции? Почему дальше локальная переменная n уже в теле функции, приняв ее значение не сможет выполнить код так, как это было с использованием цикла for в предыдущем примере ? Несомненно я тут ошибаюсь, чувствую, но в чем мое заблуждение? В том, в функции ей приходится претерпевать изменения, в отличие от предыдущего кода с циклом for ?
Заранее большое спасибо!
Отредактировано dmitry1959 (Май 12, 2023 21:42:52)
Офлайн
Подытожу :
В обоих кодах присутствует глобальная переменная n, от которой зависит результат выполнения функции.
Но играет в них принципиально разную роль, поскольку в одном случае функция может обойтись без этого параметра, а в другом нет. Вот эту разницу пока не могу четко осознать.
Офлайн
dmitry1959
Подытожу : В обоих кодах присутствует глобальная переменная n, от которой зависит результат выполнения функции.Но играет в них принципиально разную роль, поскольку в одном случае функция может обойтись без этого параметра, а в другом нет. Вот эту разницу пока не могу четко осознать.
Офлайн
ZerGПожалуйста, будьте снисходительны ко мне ) Некоторые сложные вещи схватываю налету, а над некоторыми простыми туплю ))!
Учебники нынче не в моде…
https://habr.com/ru/companies/otus/articles/487952/
Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости
Офлайн
Офлайн
dmitry1959Хочешь Парри?
Отредактировано ZerG (Май 13, 2023 00:33:16)
Офлайн
dmitry1959
Помогите пожалуйста разобраться - как определить , когда можно обойтись без параметров, а когда нет .
CONSTANT = 5 def func_1(): print(CONSTANT) func_1() # выведет 5
CONSTANT = 5 def func_1(): print(CONSTANT) CONSTANT += 1 func_1() # UnboundLocalError: local variable 'CONSTANT' referenced before assignment
Офлайн
а всего то два листа прочитать по ссылке
Офлайн