В python 3.8 появились новые возможности. Весь список смотреть тут: https://docs.python.org/3.8/whatsnew/3.8.html
Мы разберем в этой заметке:
:=
aka моржовый оператор,По мотивам PEP 572.
Моржовый оператор :=
— разновидность оператора присваивания, с помощью которого можно давать имена подвыражениям в выражениях. Здесь мы не будем обсуждать удачность выбра синтаксиса, а просто рассмотрим 3 примера использования, где оператор может быть полезен:
На английском walrus (читать как ˈwȯl-rəs) operator.
Бывают ситуации, когда надо проверить доступность данных перед их использованием. Рассмотрим пример с функцией find
, которая возвращает индекс начала подстроки в строке. Будем искать в это строке и будем возвращать подстроку начиная с искомого слова и до конца.
text = 'Пока кормят — ешь, пока поят — пей… Все как у людей…'
Будем искать слово, которого нет.
# Ищем слово, которого нет (ожидается, что ничего не напечатает)
res = text.find('где')
if res != -1:
print(text[res:])
Будем искать слово, которое есть
# Ищем слово, которое есть (ожидается, что напечататье часть строки от слова как и до конца)
res = text.find('как')
if res != -1:
print(text[res:])
# Упростим предыдущий код с помощью оператора :=
if (res := text.find('как')) != -1:
print(text[res:])
# Простейшая медленная функция возведения числа x в степень n
def pow(x,n):
print('Вызов функции pow')
res = 1
while n:
res *= x
n -= 1
return res
Создадим список квадратов чисел от 0 до 9, которые четные
# Простое прямое решение через list comprehantion
[pow(x, 2) for x in range(10) if pow(x, 2) % 2 == 0]
# Упростим предыдущий код с помощью walrus оператора
[p for x in range(10) if (p:=pow(x, 2)) % 2 == 0]
Количество вызовов медленной функции pow(x,n)
сократилось!
Если надо переиспользовать значения в lambda-функциях, то удобно применить :=
оператор. Рассмотрим комплексное число.
# Комплексное число
number = complex(3,4)
print(number)
# Функция для вычисисления Re, Im и модуля комплексного числа
f = lambda z: (z.real, z.imag, (z.real**2+z.imag**2)**0.5)
f(number)
# Функция для вычисисления Re, Im и модуля комплексного числа (упрощенная)
f = lambda z: (re:=z.real, im:=z.imag, (re**2+im**2)**0.5)
f(number)
def func(a,b,c,d,e,f,g):
print(a,b,c,d,e,f,g)
func(1,2,3,4,5,6,7)
def func(a=1,b=2,c=3,d=4,e=5,f=6,g=7):
print(a,b,c,d,e,f,g)
func()
def func(a=1,*,b=2,c=3,d=4,e=5,f=6,g=7):
print(a,b,c,d,e,f,g)
func(1, 2)
def func(a=1,*,b=2,c=3,d=4,e=5,f=6,g=7):
print(a,b,c,d,e,f,g)
func(1, b=2)
def func(a=1,*,b=2,c=3,d=4,e=5,f=6,g=7):
print(a,b,c,d,e,f,g)
func(a=1, b=2)
def func(a=1,/,b=2,c=3,d=4,e=5,f=6,g=7):
print(a,b,c,d,e,f,g)
func(a=1, b=2)
def func(a=1,/,b=2,c=3,d=4,e=5,f=6,g=7):
print(a,b,c,d,e,f,g)
func(1, b=2)
def length(obj,/):
return len(obj)
# length(obj=[1,2,3]) <-- было бы избыточно
length([1,2,3])
name, age = 'Vlad', 23
print(f'{name}, {age}')
print(f'{age=}, {age=}')
print(f'{age=}, {age**2}')
%load_ext watermark
%watermark -d -u -v -iv