Вопрос по функции с аргументами func(args)

Malenkey

Пользователь
Пользователь
Ноя 3, 2022
140
11
18
Здравствуйте!
Я не понимаю одну вещь. Вот я объявляю функцию с тремя аргументами. Потом я эту функцию вызываю, но передаю ей только 2 из 3-х аргументов. Возникает ошибка "TypeError: func() missing 1 required positional argument: 'c'"
Python:
def func(a, b, c):
    print(a, b, c)

func(1, 2)
Это что значит? Это значит, что если функция принимает 3 аргумента, то я ОБЯЗАН при ее вызове передавать ей 3 аргумента и никак не меньше?

И еще вопрос. А что, если при объявлении функции я не буду присваивать ей никаких аргументов, а просто пропишу в ее теле использование трех переменных с глобальной областью видимости.
Python:
def func():
    global a
    global b
    global c
    print(a, b, c)

a = 1
b = 2
c = 3

func()
И перед вызовом этой функции я объявляю или меняю эти переменные, а потом вызываю функцию без передачи ей аргументов. Какой способ лучше, правильнее? Может, эти способы отличаются по скорости выполнения? Заранее спасибо за ответ!
 
Последнее редактирование:

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 139
377
83
Это значит, что если функция принимает 3 аргумента, то я ОБЯЗАН при ее вызове передавать ей 3 аргумента и никак не меньше?
да

Какой способ лучше, правильнее? Может, эти способы отличаются по скорости выполнения? Заранее спасибо за ответ!
лучше передавать аргументы в функцию, использование глобальных переменных не безопасно для кода, это плохой тон
кстати, лучше еще использовать тайпхинты, это не обязательно для интерпретатора, но это хороший тон, проще читать код
так же можно назначить значение аргумента по умолчанию, в таком случае не обязательно передавать аргумент, он примет значение по умолчанию
пример
Python:
def func(a: int, b: int, c: int = 3) -> None:  # тут объявили функцию, где аргументы должны быть типа int, третий
                                               # аргумент по умолчанию имеет значение 3, и функция ничего не возвращает
    print(a, b, c)


func(1, 2)
 
  • Мне нравится
Реакции: Malenkey

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 139
377
83
Я не могу написать, допустим "-> a+b+c"?
нет, в тайпхинтах пишутся типы

В чем тогда смысл этого комментария? Для кого этот комментарий? Ведь комментарии пишутся после "#". Че-то я не понимаю до конца.
когда вы используете чужой код, и смотрите на функцию
Python:
def func(a, b ,c):
    ...
вам понятно что она делает? какие аргрументы ей передавать? что она возвращает?

а когда так
Python:
def print_list_int(a: int, b: int, c: int) -> list:
    ...
то по имени функции сразу понятно, что делает функция, понятно, что в аргументах должны быть инты, и что возвращает она тип лист, то есть список

не знаю как еще проще объяснить...
 
Последнее редактирование:
  • Мне нравится
Реакции: Malenkey

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 139
377
83
Спасибо! Понял! То есть это особый вид комментариев. И при принятии аргументов при вызове функции она не будет автоматически проверять, являются ли аргументы типом "int". Эту проверку все равно нужно делать принудительно в теле функции. Я правильно понял?
да, так же есть модули для проверки этих тайпхинтов, популярный - MyPy
интерпретатор тайпхинты не принимает во внимание, и даже если аругмент будет не того типа, ошибок не будет (если правила базовых операций не нарушены)
MyPy в свою очередь вас отругает, что тут передан аргумент не того типа, и укажет на ошибку
 
  • Мне нравится
Реакции: Malenkey

Malenkey

Пользователь
Пользователь
Ноя 3, 2022
140
11
18
да


лучше передавать аргументы в функцию, использование глобальных переменных не безопасно для кода, это плохой тон
кстати, лучше еще использовать тайпхинты, это не обязательно для интерпретатора, но это хороший тон, проще читать код
так же можно назначить значение аргумента по умолчанию, в таком случае не обязательно передавать аргумент, он примет значение по умолчанию
пример
Python:
def func(a: int, b: int, c: int = 3) -> None:  # тут объявили функцию, где аргументы должны быть типа int, третий
                                               # аргумент по умолчанию имеет значение 3, и функция ничего не возвращает
    print(a, b, c)


func(1, 2)
Спасибо большое! (y) Каждый день узнаю что-то новое! :giggle:
 

Malenkey

Пользователь
Пользователь
Ноя 3, 2022
140
11
18
не безопасно для кода
А что значит безопасность кода? Я так понял, это значит, что я могу забыться по ходу программы и в каком-то месте что-то напутать со значениями переменных? Либо по ошибке повторно объявить переменную с именем, которое уже использовалось?
 

Malenkey

Пользователь
Пользователь
Ноя 3, 2022
140
11
18
А что означает эта часть строки? Что функция ничего не возвращает? Это аналог инструкции "return None" в теле функции?
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 139
377
83
А что значит безопасность кода? Я так понял, это значит, что я могу забыться по ходу программы и в каком-то месте что-то напутать со значениями переменных? Либо по ошибке повторно объявить переменную с именем, которое уже использовалось?
вы можете ошибиться, или вообще забыть, что у вас есть глобальные переменные и изменить их
глобальные переменные доступны всем объектам в программе, соответственно, они могут их изменить, что нарушит работу вашей функции

А что означает эта часть строки? Что функция ничего не возвращает? Это аналог инструкции "return None" в теле функции?
нет, тайпхинт, грубо говоря, это просто комментарий к функции в самом коде, код тайпхинт не меняет, при вызове функции вы можете указать в аргументах не инт, а любой другой тип, интерпретатор вас не отругает
обработку правильности типов в функции должны написать вы уже сами, или надеяться, что интерпретатор вас поймет, и не допустит не верные операции
этим, в некотором роде, плох язык с динамической типизацией (сугубо личное мнение)
 

Malenkey

Пользователь
Пользователь
Ноя 3, 2022
140
11
18
вы можете ошибиться, или вообще забыть, что у вас есть глобальные переменные и изменить их
глобальные переменные доступны всем объектам в программе, соответственно, они могут их изменить, что нарушит работу вашей функции


нет, тайпхинт, грубо говоря, это просто комментарий к функции в самом коде, код тайпхинт не меняет, при вызове функции вы можете указать в аргументах не инт, а любой другой тип, интерпретатор вас не отругает
обработку правильности типов в функции должны написать вы уже сами, или надеяться, что интерпретатор вас поймет, и не допустит не верные операции
этим, в некотором роде, плох язык с динамической типизацией (сугубо личное мнение)
Я понял про "a: int". Но я не понял, что значит "-> None" в конце строки?
Это аналог инструкции "return None" в теле функции?
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 139
377
83
Я понял про "a: int". Но я не понял, что значит "-> None" в конце строки?
Это аналог инструкции "return None" в теле функции?
нет, это просто тайпхинт (комментарий), что функция ничего не возвращает
 

Malenkey

Пользователь
Пользователь
Ноя 3, 2022
140
11
18
нет, это просто тайпхинт (комментарий), что функция ничего не возвращает
То есть эта инструкция никак не обрабатывается? Я не могу написать, допустим "-> a+b+c"? В чем тогда смысл этого комментария? Для кого этот комментарий? Ведь комментарии пишутся после "#". Че-то я не понимаю до конца.
 

Malenkey

Пользователь
Пользователь
Ноя 3, 2022
140
11
18
нет, в тайпхинтах пишутся типы


когда вы используете чужой код, и смотрите на функцию
Python:
def func(a, b ,c):
    ...
вам понятно что она делает? какие аргрументы ей передавать? что она возвращает?

а когда так
Python:
def print_list_int(a: int, b: int, c: int) -> list:
    ...
то по имени функции сразу понятно, что делает функция, понятно, что в аргументах должны быть инты, и что возвращает она тип лист, то есть список

не знаю как еще проще объяснить...
Спасибо! Понял! То есть это особый вид комментариев. И при принятии аргументов при вызове функции она не будет автоматически проверять, являются ли аргументы типом "int". Эту проверку все равно нужно делать принудительно в теле функции. Я правильно понял?
 

Форум IT Специалистов