Найти - Пользователи
Полная версия: функции с параметрами и без
Начало » Python для новичков » функции с параметрами и без
1 2
dmitry1959
Не могу разобраться - вот пример кода для подсчета суммы цифр числа, используется функция без параметра:
def print_digit_sum():
… sm = 0
… for i in str(n):
… sm += int(i)
… print(sm)

>>> n = int(input())
12345
>>> print_digit_sum()
Результат выполнения функции здесь ведь зависит от параметра n, но тем не менее в объявлении функции он отсутствует. В других случаях применение параметров в объявлении функции необходимо.
Помогите пожалуйста разобраться - как определить , когда можно обойтись без параметров, а когда нет .
ZerG
Учебники нынче не в моде…

https://habr.com/ru/companies/otus/articles/487952/
py.user.next
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
>>>

Как видишь, глобальная переменная n и локальная переменная n - это две разные переменные, которые хранят разные значения и никак не относятся друг к другу.

Локальная переменная n в функции создаётся в заголовке функции
def f(n):
Как только переменная появилась в заголовке, значит создалась локальная переменная функции, которая существует только внутри функции и которая создаётся каждый раз при вызове функции и уничтожается каждый раз при завершении вызова функции.

Вызов функции выглядит так
f(0)
Тут создалась переменная n внутри функции, этой переменной внутри функции присвоилось значение 0 и дальше функция работает и видит эту переменную внутри функции, а потом функция доходит до своей последней строки и переменная n внутри функции уничтожается.
При следующем вызове этой функции всё это повторяется заново.

Когда есть глобальная переменная, все функции её видят сразу.

Просто запусти этот код
  
 
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 создаётся только за пределами функции и функция просто к ней обращается внутри себя, потому что видит эту переменную в глобальной области видимости, а в локальной области видимости такой переменной нет. Если бы у функции в локальной области видимости создавалась бы локальная переменная n, то эта локальная переменная n перекрыла бы собой глобальную переменную n в этой функции и функция видела бы только локальную переменную n от начала вызова этой функции до конца вызова этой функции.

Есть ещё возможность менять в функции глобальную переменную.

Просто запусти этот код
  
 
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 глобальная, чтобы функция понимала, что внутри не нужно создавать локальную переменную n, а надо работать с глобальной переменной n только. Таким образом функция выводит глобальную переменную n и записывает новое значение в глобальную переменную n.

Если же сделать то же самое, но без объявления о глобальности n, то функция будет думать, что ты пытаешься создать внутри неё локальную переменную n.

Просто запусти этот код
  
 
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
>>>

Как видишь, функция пишет, что ты создал локальную переменную n внутри функции в строке n = 30 (она создалась автоматически из-за присваивания ей значения), но тут же она видит, что наверху стоит строка print(n), которая эту переменную пытается вывести до её создания, поэтому функция считает это ошибкой, так как локальную переменную нельзя вывести до её создания, и пишет об ошибке. Сообщение означает “ты пытаешься вывести на экран значение переменной, которую ещё не создал, а создаёшь её только в следующей строке - это ошибка”. Во время всего этого глобальная переменная n внутри функции никак не участвует, а живёт своей отдельной жизнью, почему print'ы за пределами вызова функции и продолжают выдавать двадцатки на экран.
dmitry1959
Большое спасибо Вам за время, потраченное на разбор моего вопроса. То, что локальная и глобальная переменная, имеющие одинаковые имена это разные вещи, поскольку ссылаются на разные объекты в памяти - это я в курсе. Но в таком коде:

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
Подытожу :
В обоих кодах присутствует глобальная переменная n, от которой зависит результат выполнения функции.
Но играет в них принципиально разную роль, поскольку в одном случае функция может обойтись без этого параметра, а в другом нет. Вот эту разницу пока не могу четко осознать.
ZerG
dmitry1959
Подытожу : В обоих кодах присутствует глобальная переменная n, от которой зависит результат выполнения функции.Но играет в них принципиально разную роль, поскольку в одном случае функция может обойтись без этого параметра, а в другом нет. Вот эту разницу пока не могу четко осознать.

Это потому что ты читаешь выборочно и по диагонали! А ссылку которую я тебе предоставил ты просто пролистал так как немного ниже в ней подробно разбирается твой вопрос с твоим же примером

Ну и никто ведь не запрещает набрать 5 строк кода и выполнить его 20 раз меняя значения переменных что бы четко осознать ответ нв вопрос а не игра в поле чудес?
dmitry1959
ZerG
Учебники нынче не в моде…

https://habr.com/ru/companies/otus/articles/487952/



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости
Офлайн

Пожалуйста, будьте снисходительны ко мне ) Некоторые сложные вещи схватываю налету, а над некоторыми простыми туплю ))!
ZerG
dmitry1959
Хочешь Парри?
Прочитай линк что я тебе сбросил - ты потратишь от силы минут 15 и еще столько же на тесты
И сам в этой же теме ответишь на свой вопрос
xam1816
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

потому что внутри функции CONSTANT не определена

Такие константы пишут вначале файла большими буквами и далее в коде их не меняют (хотя возможность такая есть). Т.е переменные большими буквами в начале файла считаются константами, которые можно читать, но нельзя изменять.

В остальных случаях переменные вне функции не используют.

ZerG
а всего то два листа прочитать по ссылке
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB