def my_func(a, b):
print(a, b)
# Тесты
my_func(2, 4) # Позиционные аргументы
my_func(b=2, a=4) # Ключевые аргументы
my_func(2, b=4) # Первый аргумент – позиционный, второй - ключевой
my_func(a=2, 4) # Позиционные аргументы должны всегда предшествовать ключевым, поэтому в работе кода возникнет ошибка
2 4
4 2
2 4
SyntaxError: positional argument follows keyword argument
def my_func(a, b, /):
print(a, b)
# Тесты
my_func(2, 4)
my_func(b=2, a=4)
2 4
TypeError: my_func() got some positional-only arguments passed as keyword arguments: 'a, b'
def my_func(*args):
print(args)
# Тесты
my_func(2, 4)
my_func()
my_func(2, 4, key=10)
(2, 4)
()
TypeError: my_func() got an unexpected keyword argument 'key'
def my_func(**kwargs):
print(kwargs)
# Тесты
my_func()
my_func(a=5, b=10, c=15)
my_func(a=5, b=10, 8)
{}
{'a': 5, 'b': 10, 'c': 15}
SyntaxError: positional argument follows keyword argument
def my_func(*, a=5, b=10):
print(a, b)
# Тесты
my_func()
my_func(a=2, b=3)
my_func(b=1, a=10)
my_func(7, b=1, a=10)
5 10
2 3
10 1
TypeError: my_func() takes 0 positional arguments but 1 positional argument (and 2 keyword-only arguments) were given
def my_func(a=5, b=10):
print(a, b)
# Тесты
my_func()
my_func(a=2, b=3)
my_func(b=1, a=10)
my_func(7, 3)
5 10
2 3
10 1
7 3
Напишите функцию sum_range(start, end), которая суммирует все целые числа от значения «start» до величины «end» включительно.
Если пользователь задаст первое число большее чем второе, просто поменяйте их местами.
def sum_range(start, end):
if start > end:
end, start = start, end
return sum(range(start, end + 1))
# Тесты
print(sum_range(2, 12))
print(sum_range(-4, 4))
print(sum_range(3, 2))
77
0
5
Чтобы проверить понимание параметров и область их видимости, Николай создал 3 функции (представлены ниже).
Попытайтесь предугадать, как поведет себя каждая из них при запуске (возникнут ли ошибки, что возвратится).
Пример – IDE
def func1():
param = 4
def inner():
param += 1
return param
def func2():
param = 4
def inner(var):
var += 1
inner(param)
return param
def func3():
param = 4
def inner(var):
var += 1
return var
param = inner(param)
return param
print(func1())
print(func2())
print(func3())
4
4
5
Создайте функцию three_args(), которая принимает 1, 2 или 3 строго ключевых параметра.
В результате ее работы на печать в консоль выводятся значения переданных переменных, но только если они не равны None.
Получим, например, следующее сообщение: «Переданы аргументы: var1 = 2, var3 = 10».
def three_args(*, var1, var2=None, var3=None):
arguments = ', '.join([f'{arg[0]} = {str(arg[1])}' for arg in locals().items() if arg[1] is not None])
print(f'Переданы аргументы: {arguments}')
# Тесты
three_args(var1=21)
three_args(var1='Python', var3=3)
three_args(var1='Python', var2=3, var3=9)
Переданы аргументы: var1 = 21
Переданы аргументы: var1 = Python, var3 = 3
Переданы аргументы: var1 = Python, var2 = 3, var3 = 9
Антон попал в коллизию: его функция time_now() работает очень странно.
Казалось бы, задача простая: показать текущее время с сообщением.
Тем не менее, время не меняется.
Код предоставлен ниже с примерами.
Постарайтесь решить проблему незадачливого программиста.
from datetime import datetime
from time import sleep
def time_now(msg, *, dt=datetime.now()):
print(msg, dt)
# Тесты
time_now('Сейчас такое время: ')
sleep(1)
time_now('Прошла секунда: ')
sleep(1)
time_now('Ничего не понимаю... ')
Результат выполнения
Сейчас такое время: 2021-03-14 15:48:55.117455
Прошла секунда: 2021-03-14 15:48:55.117455
Ничего не понимаю... 2021-03-14 15:48:55.117455
from datetime import datetime
from time import sleep
def time_now(msg, *, dt=None):
dt = dt or datetime.now()
print(msg, dt)
# Тесты
time_now('Сейчас такое время: ')
sleep(1)
time_now('Прошла секунда: ')
sleep(1)
time_now('Задам-ка другую дату: ', dt='2020-01-11 11:00:10')
Сейчас такое время: 2021-03-14 16:01:53.331533
Прошла секунда: 2021-03-14 16:01:54.331609
Задам-ка другую дату: 2020-01-11 11:00:10
Чтобы лучше разобраться в типах параметров функций Инна создала inspect_function(), которая в качестве аргумента принимает другую функцию (главное, не встроенную, built-in).
В результате работы она выводит следующие данные: название анализируемой функции, наименование всех принимаемых ею параметров и их типы (позиционные, ключевые и т.п.).
Попробуйте повторить результат девушки.
import inspect
import math
def inspect_function(some_func):
print(f'Анализируем функцию {some_func.__name__}')
for param in inspect.signature(some_func).parameters.values():
print(param.name, param.kind, sep=': ')
# Некая функция для анализа
def my_func(a, b, /, c, d, *args, e, f, **kwargs):
pass
# Тесты
inspect_function(my_func)
print('-' * 25)
inspect_function(math.sqrt)
Анализируем функцию my_func
a: POSITIONAL_ONLY
b: POSITIONAL_ONLY
c: POSITIONAL_OR_KEYWORD
d: POSITIONAL_OR_KEYWORD
args: VAR_POSITIONAL
e: KEYWORD_ONLY
f: KEYWORD_ONLY
kwargs: VAR_KEYWORD
-------------------------
Анализируем функцию sqrt
x: POSITIONAL_ONLY