Классы в pattern matching. Продолжение.
Также мы можем применить паттерн _, если нам надо обработать случаи, которые не соответствуют ни одному шаблону, смотрим код:
В данном случае второй шаблон Person(name=person_name) соответствует любому объекту Person, при этом значение атрибута name передается переменной person_name
А последний шаблон обрабатывает случаи, когда передано значение, которое не представляет объект Person.
🐍 Укус питона // 💬 Чат // #теория #pattern_matching #классы
Также мы можем применить паттерн _, если нам надо обработать случаи, которые не соответствуют ни одному шаблону, смотрим код:
В данном случае второй шаблон Person(name=person_name) соответствует любому объекту Person, при этом значение атрибута name передается переменной person_name
А последний шаблон обрабатывает случаи, когда передано значение, которое не представляет объект Person.
🐍 Укус питона // 💬 Чат // #теория #pattern_matching #классы
Передача набора значений.
Также с помощью вертикальной черты можно определить набор значений, которые должен иметь атрибут, смотрим код:
В данном случае первый шаблон соответствует объекту Person, у которого атрибут name имеет одно из трех значений: "Tom", "Tomas" или "Tommy".
🐍 Укус питона // 💬 Чат // #теория #pattern_matching #классы
Также с помощью вертикальной черты можно определить набор значений, которые должен иметь атрибут, смотрим код:
В данном случае первый шаблон соответствует объекту Person, у которого атрибут name имеет одно из трех значений: "Tom", "Tomas" или "Tommy".
🐍 Укус питона // 💬 Чат // #теория #pattern_matching #классы
Передача набора значений. Продолжение.
Также можно задавать альтернативные значения для всего шаблона в том числе с помощью объектов других классов:
Здесь первый шаблон соответствует любому объекту Person, у которого атрибут name = "Tom, и любому объекту Student, у которого атрибут name = "Tomas".
Второй шаблон - case Person(name=name) | Student(name=name) соответствует любому объекту Person и Student.
🐍 Укус питона // 💬 Чат // #теория #pattern_matching #классы
Также можно задавать альтернативные значения для всего шаблона в том числе с помощью объектов других классов:
Здесь первый шаблон соответствует любому объекту Person, у которого атрибут name = "Tom, и любому объекту Student, у которого атрибут name = "Tomas".
Второй шаблон - case Person(name=name) | Student(name=name) соответствует любому объекту Person и Student.
🐍 Укус питона // 💬 Чат // #теория #pattern_matching #классы
Что выведет этот код?
Anonymous Quiz
78%
JamesJamesJamesJamesJamesJames
6%
JamesJamesJamesJamesJames
16%
Ошибка: неверный синтаксис.
Позиционные параметры
В примерах из прошлых постов для определения атрибутов прописывалось их имя: case Person(name="Tom", age=37). Но если используется куча шаблонов, и в каждом необходимо связать атрибуты объекта с некоторыми значениями или переменными, то постоянное упоминание атрибутов можно несколько раздуть код. Но Python также позволяет использовать позиционные параметры, смотрим код:
Обратите внимание в классе Person на вызов функции. Благодаря этому Python будет знать, что при указании атрибутов атрибут name будет идти первым, а атрибут age - вторым.
И таким образом, в шаблонов не нужно указывать имя атрибута: case Person("Tom", 37) - Python сам сопоставит атрибуты и значения/переменные на основе их позиции.
🐍 Укус питона // 💬 Чат // #теория #pattern_matching #классы
В примерах из прошлых постов для определения атрибутов прописывалось их имя: case Person(name="Tom", age=37). Но если используется куча шаблонов, и в каждом необходимо связать атрибуты объекта с некоторыми значениями или переменными, то постоянное упоминание атрибутов можно несколько раздуть код. Но Python также позволяет использовать позиционные параметры, смотрим код:
Обратите внимание в классе Person на вызов функции. Благодаря этому Python будет знать, что при указании атрибутов атрибут name будет идти первым, а атрибут age - вторым.
И таким образом, в шаблонов не нужно указывать имя атрибута: case Person("Tom", 37) - Python сам сопоставит атрибуты и значения/переменные на основе их позиции.
🐍 Укус питона // 💬 Чат // #теория #pattern_matching #классы
Каков вывод следующего цикла for и range() функции?
Anonymous Quiz
14%
-2, -1, -3, -4
11%
-2, -1, 0, 1, 2, 3,
6%
-2, -1, 0
70%
-2, -3, -4,
guards или ограничения шаблонов
Guard или ограничения шаблонов позволяют установить дополнительные условия, которым должно соответсвовать выражение. Ограничение задается сразу после шаблона с помощью ключевого слова if, после которого идет условие ограничения:
Здесь первый шаблон соответствует любому объекту Person, у которого атрибут age меньше 18. Собственно часть if age < 18 и представляет ограничение. Соответственно, если у пользователя возраст меньше 18, то будет выводьтся одно сообщение, если больше 18, то другое.
🐍 Укус питона // 💬 Чат // #теория #pattern_matching #guards #шаблоны
Guard или ограничения шаблонов позволяют установить дополнительные условия, которым должно соответсвовать выражение. Ограничение задается сразу после шаблона с помощью ключевого слова if, после которого идет условие ограничения:
Здесь первый шаблон соответствует любому объекту Person, у которого атрибут age меньше 18. Собственно часть if age < 18 и представляет ограничение. Соответственно, если у пользователя возраст меньше 18, то будет выводьтся одно сообщение, если больше 18, то другое.
🐍 Укус питона // 💬 Чат // #теория #pattern_matching #guards #шаблоны
guards или ограничения шаблонов. Продолжение.
Подобным образом можно вводить дополнительные ограничения, первый пример:
Условия ограничений могут быть более сложными и составными по структуре, второй пример:
В данном случае функция получает кортеж data. Оба шаблона в конструкции match соответствуют двухэлементному кортежу. Но первый шаблон также применяет ограничение name == "admin" or age not in range(1, 101), в соответствии с которым первый элемент кортежа должен иметь значение "admin", а второй должен находиться вне диапазона 1-101.
🐍 Укус питона // 💬 Чат // #теория #pattern_matching #guards #шаблоны
Подобным образом можно вводить дополнительные ограничения, первый пример:
Условия ограничений могут быть более сложными и составными по структуре, второй пример:
В данном случае функция получает кортеж data. Оба шаблона в конструкции match соответствуют двухэлементному кортежу. Но первый шаблон также применяет ограничение name == "admin" or age not in range(1, 101), в соответствии с которым первый элемент кортежа должен иметь значение "admin", а второй должен находиться вне диапазона 1-101.
🐍 Укус питона // 💬 Чат // #теория #pattern_matching #guards #шаблоны
Установка псевдонимов и паттерн AS.
Оператор as позволяет установить псевдоним для значения шаблона или для всего шаблона. Простейший пример, смотрим пример:
Здесь первый шаблон соответствует трем строкам: "Tom" | "Tomas" | "Tommy". После набора значений идет оператор as, после которого указывается псевдоним. И вне зависимости от того, какая именно строка передана, она окажется в переменной name.
Псевдоним можно применять как для отдельного значения шаблона, так и для всего шаблона, вторая часть кода:
🐍 Укус питона // 💬 Чат // #теория #pattern_matching #паттерны #псевдонимы
Оператор as позволяет установить псевдоним для значения шаблона или для всего шаблона. Простейший пример, смотрим пример:
Здесь первый шаблон соответствует трем строкам: "Tom" | "Tomas" | "Tommy". После набора значений идет оператор as, после которого указывается псевдоним. И вне зависимости от того, какая именно строка передана, она окажется в переменной name.
Псевдоним можно применять как для отдельного значения шаблона, так и для всего шаблона, вторая часть кода:
🐍 Укус питона // 💬 Чат // #теория #pattern_matching #паттерны #псевдонимы