Вам буде важко знайти функції, які абсолютно унікальні . Більшість існуючих мовних ознак були прийняті більш ніж однією мовою з моменту їх створення. Деякі можуть бути рідше, головним чином тому, що вони або нові, і все ще в невідомості, або вимерли з поважних причин. Тим не менш, навіть тоді вам буде краще переглянути комбінації функцій.
Однак, кілька особливостей Python повинні зробити порівняно унікальне поєднання. Принаймні, я не знаю жодної мови віддалено, як популярної (і практичної) з набором функцій, що в основному перекриваються. Як зазначається в коментарях, Рубі досить близька, але все ж існують численні відмінності.
- Метапрограмування на основі метакласу . В основному працює довільний код про створення класу. Робить дуже приємне налаштування класу з дуже малою роботою на отриманому кінці - наприклад, для об'єктно-реляційного картографування (ORM), клієнтські класи можуть записуватися як звичайно за допомогою кількох додаткових рядків, наприклад,
attr = SomeDataType()
і тонна коду генерується автоматично. Прикладом цього є "моделі" Джанго .
- Вам рекомендується використовувати ітератори для всього . Це особливо очевидно в 3.x, коли більшість альтернатив на основі списку з еквівалентом на основі ітератора було скасовано на користь останнього. Ітератори також служать універсальним інтерфейсом для колекцій (як тих, кому ви насправді є в пам'яті, так і тих, які вам потрібні лише один раз, і таким чином створюйте за допомогою наведених нижче функцій). Колекційно-агностичний, просторний (
O(1)
простір для проміжних результатів часто випливає природним шляхом; дуже мало завдань насправді потребує всіх об'єктів в пам'яті одразу), складання даних для компонування ніколи не було простіше.
- Генераторні вирази, пов'язані з вищезазначеним. Багато хто почує про розуміння списку (створення списку з іншого ітерабельного, фільтрування та відображення в процесі з дуже зручним синтаксисом). Забудь про них, вони синтаксичний цукор, особливий випадок. Вирази генератора синтаксично дуже близькі і в кінцевому підсумку призводять до тієї самої послідовності елементів, але вони дають результати ліниво (і, таким чином, займають
O(1)
місце, якщо ви явно не тримаєте результати навколо).
yield
, що в основному робить ітератори запису (тут називаються генераторами) набагато приємніше. Вони є старшим братом вище, підтримуючи всі види контролю. C # має щось подібне, з тим самим ключовим словом. Але yield
він також перевантажений підтримкою обмеженого роду процедур (наприклад, Луа має більш досконалу підтримку), які, тим не менш, були використані розумними людьми, що працюють над важкими проблемами. Два приклади вгорі моєї голови: рекурсивний аналіз спуску з зворотним ходом та без обмеження стека та асинхронний введення / виведення (зі зручним синтаксисом).
- Багатоцільове призначення та ітерабельне розпакування. Призначення на стероїди. Не тільки ви можете призначити відразу декілька значень (навіть для заміни значень і при повторенні -
for key, value in mapping.items()
), ви можете розпакувати будь-який ітерабельний ряд відомої довжини (якщо чесно, в основному кортежі) у кілька змінних. Оскільки 3.x це навіть практично для колекцій невідомої довжини , як ви можете вказати кілька змінних , приймаючи окремі елементи і один захоплення , що залишилося: first, *everything_in_between, last = values
.
- Дескриптори , мабуть, найпотужніші серед різних способів налаштування доступу до атрибутів. Є властивості (як у C #, але без спеціальної підтримки мови), статичні методи, методи класу тощо, всі реалізовані як дескриптори. Вони теж першокласні об'єкти. Лише тиждень тому я зіткнувся з повторюваним і хитрим кодом властивостей - тому я написав невелику функцію, що генерує повторювану частину і загортає її в
propery
об'єкт.
- Чисто офсайдне правило (відступ для розмежування блоків). Я остаточно це поставив навмисно. Хоча це і відрізняє Python, він насправді не виділяється у повсякденному програмуванні, коли ви звикли до нього (або, принаймні, це мій досвід).