Експертні відповіді Українцям Що робить Ірден знак

Що робить Ірден знак

6. Вирази¶

У цьому розділі пояснюється значення елементів виразів у Python.

Примітки до синтаксису: У цьому та наступних розділах для опису синтаксису буде використано розширену нотацію BNF, а не лексичний аналіз. Коли (одна альтернатива) синтаксичне правило має форму

і семантика не вказана, семантика цієї форми name така сама, як і othername .

6.1. Арифметичні перетворення¶

Коли в описі арифметичного оператора нижче використовується фраза «числові аргументи перетворюються на загальний тип», це означає, що реалізація оператора для вбудованих типів працює наступним чином:

  • Якщо будь-який аргумент є комплексним числом, інший перетворюється на комплексне;
  • інакше, якщо будь-який аргумент є числом з плаваючою комою, інший перетворюється на число з плаваючою комою;
  • інакше обидва мають бути цілими числами, і перетворення не потрібне.

Деякі додаткові правила застосовуються до певних операторів (наприклад, рядок як лівий аргумент для оператора «%»). Розширення мають визначати власну поведінку перетворення.

6.2. Атоми¶

Атоми є основними елементами виразів. Найпростішими атомами є ідентифікатори або літерали. Форми, укладені в дужки, дужки або дужки, також класифікуються синтаксично як атоми. Синтаксис для атомів:

atom ::= identifier | literal | enclosure enclosure ::= parenth_form | list_display | dict_display | set_display | generator_expression | yield_atom 

6.2.1. Ідентифікатори (імена)¶

Ідентифікатор, що зустрічається як атом, є ім’ям. Перегляньте розділ Ідентифікатори та ключові слова для лексичного визначення та розділ Називання та зв’язування для документації іменування та прив’язки.

Коли ім’я пов’язане з об’єктом, оцінка атома дає цей об’єкт. Коли ім’я не прив’язане, спроба його оцінити викликає виняток NameError .

Приватне спотворення імені: Якщо ідентифікатор, який текстово зустрічається у визначенні класу, починається з двох або більше символів підкреслення і не закінчується двома або більше підкресленнями, він вважається приватним ім’ям цього класу. Приватні імена перетворюються на довшу форму перед тим, як для них буде згенеровано код. Трансформація вставляє ім’я класу з видаленням початкового підкреслення та вставленням одного підкреслення перед ім’ям. Наприклад, ідентифікатор __spam , що зустрічається в класі з назвою Ham , буде перетворено на _Ham__spam . Це перетворення не залежить від синтаксичного контексту, у якому використовується ідентифікатор. Якщо перетворене ім’я надзвичайно довге (більше 255 символів), може статися скорочення, визначене реалізацією. Якщо ім’я класу складається лише з підкреслення, перетворення не виконується.

6.2.2. Літерали¶

Python підтримує рядкові та байтові літерали та різні числові літерали:

literal ::= stringliteral | bytesliteral | integer | floatnumber | imagnumber 

Обчислення літералу дає об’єкт заданого типу (рядок, байти, ціле число, число з плаваючою комою, комплексне число) із заданим значенням. Значення може бути наближено у випадку плаваючої коми та уявних (комплексних) літералів. Перегляньте розділ Літерали для деталей.

Усі літерали відповідають незмінним типам даних, і, отже, ідентичність об’єкта менш важлива, ніж його значення. Кілька обчислень літералів з однаковим значенням (або те саме входження в текст програми, або інше входження) можуть отримати той самий об’єкт або інший об’єкт з тим самим значенням.

6.2.3. Форми в дужках¶

Форма в дужках – це необов’язковий список виразів, укладений у дужки:

Список виразів у дужках дає все, що дає цей список виразів: якщо список містить принаймні одну кому, він дає кортеж; інакше він дає єдиний вираз, який складає список виразів.

Порожня пара круглих дужок дає порожній об’єкт кортежу. Оскільки кортежі є незмінними, застосовуються ті ж правила, що й для літералів (тобто два входження порожнього кортежу можуть або не можуть давати той самий об’єкт).

Note that tuples are not formed by the parentheses, but rather by use of the comma. The exception is the empty tuple, for which parentheses are required — allowing unparenthesized «nothing» in expressions would cause ambiguities and allow common typos to pass uncaught.

6.2.4. Відображення списків, наборів і словників¶

Для побудови списку, набору або словника Python надає спеціальний синтаксис, званий «дисплеями», кожен з яких у двох варіантах:

  • або вміст контейнера перераховано явно, або
  • вони обчислюються за допомогою набору інструкцій циклу та фільтрації, які називаються comprehension.

Загальні синтаксичні елементи для розуміння:

comprehension ::= assignment_expression comp_for comp_for ::= ["async"] "for" target_list "in" or_test [comp_iter] comp_iter ::= comp_for | comp_if comp_if ::= "if" or_test [comp_iter]

Розуміння складається з одного виразу, за яким слідує принаймні одна пропозиція for і нуль або більше пропозицій for або if . У цьому випадку елементи нового контейнера — це ті, які були б створені шляхом розгляду кожного з пропозицій for або if блоку, вкладення зліва направо та оцінювання виразу створювати елемент кожного разу, коли досягнуто внутрішнього блоку.

Однак, окрім ітераційного виразу в крайньому лівому реченні for , розуміння виконується в окремій неявно вкладеній області. Це гарантує, що імена, призначені в цільовому списку, не «просочуються» в охоплюючу область.

Ітераційний вираз у крайньому лівому реченні for обчислюється безпосередньо в охоплюючій області, а потім передається як аргумент до неявно вкладеної області. Наступні пропозиції for і будь-яка умова фільтра в крайньому лівому пункті for не можуть бути оцінені в охоплюючій області, оскільки вони можуть залежати від значень, отриманих від крайнього лівого ітератора. Наприклад: [x*y для x в діапазоні (10) для y в діапазоні (x, x+10)] .

Щоб гарантувати, що розуміння завжди призводить до контейнера відповідного типу, вирази yield і yield from заборонені в неявно вкладеній області.

Since Python 3.6, in an async def function, an async for clause may be used to iterate over a asynchronous iterator . A comprehension in an async def function may consist of either a for or async for clause following the leading expression, may contain additional for or async for clauses, and may also use await expressions. If a comprehension contains either async for clauses or await expressions or other asynchronous comprehensions it is called an asynchronous comprehension. An asynchronous comprehension may suspend the execution of the coroutine function in which it appears. See also PEP 530.

Нове в версії 3.6: Були введені асинхронні розуміння.

Змінено в версії 3.8: yield і yield from заборонені в неявно вкладеній області.

Змінено в версії 3.11: Asynchronous comprehensions are now allowed inside comprehensions in asynchronous functions. Outer comprehensions implicitly become asynchronous.

6.2.5. Відображається список¶

Відображення списку – це, можливо, порожня серія виразів, укладених у квадратні дужки:

Відображення списку дає новий об’єкт списку, вміст якого визначається або списком виразів, або розумінням. Коли надається список виразів, розділених комами, його елементи обчислюються зліва направо та розміщуються в об’єкті списку в такому порядку. Коли надається розуміння, список складається з елементів, отриманих у результаті розуміння.

6.2.6. Встановити дисплеї¶

Відображення набору позначається фігурними дужками та відрізняється від відображення словника відсутністю двокрапки, що розділяє ключі та значення:

Відображення набору дає новий змінний об’єкт набору, вміст якого визначається або послідовністю виразів, або розумінням. Коли надається список виразів, розділених комами, його елементи обчислюються зліва направо та додаються до набору об’єктів. Коли надається розуміння, набір будується з елементів, отриманих у результаті розуміння.

Порожній набір не можна створити за допомогою <> ; цей літерал створює порожній словник.

6.2.7. Відображення словника¶

A dictionary display is a possibly empty series of dict items (key/value pairs) enclosed in curly braces:

dict_display ::= "dict_item_list | dict_comprehension] ">" dict_item_list ::= dict_item ("," dict_item)* [","] dict_item ::= expression ":" expression | "**" or_expr dict_comprehension ::= expression ":" expression comp_for 

Відображення словника дає новий об’єкт словника.

If a comma-separated sequence of dict items is given, they are evaluated from left to right to define the entries of the dictionary: each key object is used as a key into the dictionary to store the corresponding value. This means that you can specify the same key multiple times in the dict item list, and the final dictionary’s value for that key will be the last one given.

A double asterisk ** denotes dictionary unpacking. Its operand must be a mapping . Each mapping item is added to the new dictionary. Later values replace values already set by earlier dict items and earlier dictionary unpackings.

Нове в версії 3.5: Розпакування у словникові відображення, спочатку запропоноване PEP 448.

Розуміння dict, на відміну від списків і набору, потребує двох виразів, розділених двокрапкою, за якими слідують звичайні пропозиції «for» і «if». Коли виконується розуміння, отримані елементи ключа та значення вставляються в новий словник у тому порядку, в якому вони створені.

Restrictions on the types of the key values are listed earlier in section Стандартна ієрархія типів . (To summarize, the key type should be hashable , which excludes all mutable objects.) Clashes between duplicate keys are not detected; the last value (textually rightmost in the display) stored for a given key value prevails.

Змінено в версії 3.8: До Python 3.8 у розуміннях dict порядок оцінки ключа та значення не був чітко визначений. У CPython значення було обчислено перед ключем. Починаючи з 3.8, ключ оцінюється перед значенням, як запропоновано PEP 572.

6.2.8. Генератор виразів¶

Генеруючий вираз — це компактний генераторний запис у круглих дужках:

Генеруючий вираз дає новий генераторний об’єкт. Його синтаксис такий самий, як і для розуміння, за винятком того, що він узятий у дужки замість дужок або фігурних дужок.

Змінні, які використовуються у виразі генератора, обчислюються ліниво, коли метод __next__() викликається для об’єкта генератора (так само, як і звичайні генератори). Однак ітераційний вираз у крайньому лівому реченні for негайно обчислюється, тому помилка, створена ним, буде видана в точці, де визначено вираз генератора, а не в точці, де перше значення відновлено. Наступні пропозиції for і будь-яка умова фільтра в крайньому лівому пункті for не можуть бути оцінені в охоплюючій області, оскільки вони можуть залежати від значень, отриманих від крайнього лівого ітератора. Наприклад: (x*y для x в діапазоні (10) для y в діапазоні (x, x+10)) .

У викликах лише з одним аргументом дужки можна опускати. Подробиці див. у розділі Дзвінки .

Щоб уникнути перешкоджання очікуваній роботі самого виразу генератора, вирази yield і yield from заборонені в неявно визначеному генераторі.

Якщо вираз генератора містить пропозиції async for або вирази await , це називається asynchronous generator expression. Вираз асинхронного генератора повертає новий об’єкт асинхронного генератора, який є асинхронним ітератором (див. Асинхронні ітератори ).

Нове в версії 3.6: Було введено асинхронні генераторні вирази.

Змінено в версії 3.7: До Python 3.7 вирази асинхронного генератора могли з’являтися лише в співпрограмах async def . Починаючи з 3.7, будь-яка функція може використовувати вирази асинхронного генератора.

Змінено в версії 3.8: yield і yield from заборонені в неявно вкладеній області.

6.2.9. Вирази дохідності¶

yield_atom ::= "(" yield_expression ")" yield_from ::= "yield" "from" expression yield_expression ::= "yield" expression_list | yield_from 

Вираз yield використовується під час визначення функції generator або функції asynchronous generator і тому може використовуватися лише в тілі визначення функції. Використання виразу yield у тілі функції робить цю функцію функцією-генератором, а використання його в тілі функції async def призводить до того, що функція співпрограми стає асинхронною функцією-генератором. Наприклад:

def gen(): # defines a generator function yield 123 async def agen(): # defines an asynchronous generator function yield 123 

Через їхній побічний вплив на область, що містить, вирази yield не дозволені як частина неявно визначених областей, які використовуються для реалізації розуміння та виразів генератора.

Змінено в версії 3.8: Вирази yield, заборонені в неявно вкладених областях, що використовуються для реалізації виразів розуміння та генератора.

Функції генератора описані нижче, тоді як функції асинхронного генератора описані окремо в розділі Функції асинхронного генератора .

When a generator function is called, it returns an iterator known as a generator. That generator then controls the execution of the generator function. The execution starts when one of the generator’s methods is called. At that time, the execution proceeds to the first yield expression, where it is suspended again, returning the value of expression_list to the generator’s caller, or None if expression_list is omitted. By suspended, we mean that all local state is retained, including the current bindings of local variables, the instruction pointer, the internal evaluation stack, and the state of any exception handling. When the execution is resumed by calling one of the generator’s methods, the function can proceed exactly as if the yield expression were just another external call. The value of the yield expression after resuming depends on the method which resumed the execution. If __next__() is used (typically via either a for or the next() builtin) then the result is None . Otherwise, if send() is used, then the result will be the value passed in to that method.

Усе це робить функції генератора досить схожими на співпрограми; вони поступаються кілька разів, вони мають більше однієї точки входу, і їхнє виконання може бути призупинено. Єдина відмінність полягає в тому, що функція-генератор не може контролювати, де має продовжуватися виконання після того, як вона виходить; керування завжди передається абоненту генератора.

Вирази yield дозволені будь-де в конструкції try . Якщо генератор не відновлено до його завершення (досягнувши нульової кількості посилань або збираючи сміття), буде викликано метод close() генератора-ітератора, дозволяючи будь-які очікуючі finally пропозиції для виконання.

Коли використовується yield from , наданий вираз має бути повторюваним. Значення, отримані шляхом ітерації цього ітерованого, передаються безпосередньо до виклику методів поточного генератора. Будь-які значення, передані за допомогою send() , і будь-які винятки, передані за допомогою throw() , передаються базовому ітератору, якщо він має відповідні методи. Якщо це не так, то send() викличе AttributeError або TypeError , а throw() просто викличе переданий виняток негайно.

Коли основний ітератор завершено, атрибут value піднятого екземпляра StopIteration стає значенням виразу yield. Його можна встановити явно під час виклику StopIteration або автоматично, коли субітератор є генератором (шляхом повернення значення з субгенератора).

Змінено в версії 3.3: Додано yield from для делегування потоку керування субітератору.

Дужки можуть бути опущені, якщо вираз yield є єдиним виразом у правій частині оператора призначення.

Пропозиція щодо додавання генераторів і оператора yield до Python.

PEP 342 – Співпрограми через розширені генератори

Пропозиція покращити API та синтаксис генераторів, зробивши їх придатними для використання як простих співпрограм.

PEP 380 – Синтаксис для делегування підгенератору

Пропозиція запровадити синтаксис yield_from , що спрощує делегування субгенераторам.

Пропозиція, яка розширила PEP 492 шляхом додавання можливостей генератора до функцій співпрограми.

6.2.9.1. Методи генератор-ітератор¶

У цьому підрозділі описано методи ітератора генератора. Вони можуть використовуватися для керування виконанням функції генератора.

Зауважте, що виклик будь-якого з наведених нижче методів генератора, коли генератор уже виконується, викликає виняткову ситуацію ValueError .

Починає виконання функції генератора або відновлює його після останнього виконаного виразу yield. Коли функцію генератора відновлено за допомогою методу __next__() , поточний вираз yield завжди оцінюється як None . Потім виконання продовжується до наступного виразу yield, де генератор знову призупиняється, а значення expression_list повертається до викликаючого __next__() . Якщо генератор завершує роботу, не видаючи іншого значення, виникає виняток StopIteration .

Цей метод зазвичай викликається неявно, напр. за допомогою циклу for або за допомогою вбудованої функції next() .

Відновлює виконання та «надсилає» значення у функцію генератора. Аргумент value стає результатом поточного виразу yield. Метод send() повертає наступне значення, отримане генератором, або викликає StopIteration , якщо генератор завершує роботу, не видаючи іншого значення. Коли send() викликається для запуску генератора, його потрібно викликати з None як аргументом, оскільки немає виразу yield, який міг би отримати значення.

generator. throw ( value ) ¶ generator. throw ( type [ , value [ , traceback ] ] )

Викликає виняток у точці, де генератор було призупинено, і повертає наступне значення, отримане функцією генератора. Якщо генератор завершує роботу, не видаючи іншого значення, виникає виняток StopIteration . Якщо функція генератора не перехоплює переданий виняток або викликає інший виняток, тоді цей виняток поширюється на виклик.

У типовому використанні це викликається з одним винятком, подібним до того, як використовується ключове слово raise .

For backwards compatibility, however, the second signature is supported, following a convention from older versions of Python. The type argument should be an exception class, and value should be an exception instance. If the value is not provided, the type constructor is called to get an instance. If traceback is provided, it is set on the exception, otherwise any existing __traceback__ attribute stored in value may be cleared.

Змінено в версії 3.12: The second signature (type[, value[, traceback]]) is deprecated and may be removed in a future version of Python.

Викликає GeneratorExit у точці, де функцію генератора було призупинено. Якщо функція-генератор завершує роботу належним чином, уже закрита або викликає GeneratorExit (не перехоплюючи виняток), close повертається до свого виклику. Якщо генератор видає значення, виникає RuntimeError . Якщо генератор викликає будь-який інший виняток, він передається до абонента. close() нічого не робить, якщо генератор уже завершив роботу через виняток або нормальний вихід.

6.2.9.2. Приклади¶

Ось простий приклад, який демонструє поведінку генераторів і функцій генератора:

>>> def echo(value=None): . print("Execution starts when 'next()' is called for the first time.") . try: . while True: . try: . value = (yield value) . except Exception as e: . value = e . finally: . print("Don't forget to clean up when 'close()' is called.") . >>> generator = echo(1) >>> print(next(generator)) Execution starts when 'next()' is called for the first time. 1 >>> print(next(generator)) None >>> print(generator.send(2)) 2 >>> generator.throw(TypeError, "spam") TypeError('spam',) >>> generator.close() Don't forget to clean up when 'close()' is called. 

Приклади використання yield from див. PEP 380: Синтаксис для делегування субгенератору у розділі «Що нового в Python».

6.2.9.3. Функції асинхронного генератора¶

Наявність виразу yield у функції чи методі, визначеному за допомогою async def , далі визначає функцію як функцію asynchronous generator .

Коли викликається функція асинхронного генератора, вона повертає асинхронний ітератор, відомий як об’єкт асинхронного генератора. Потім цей об’єкт керує виконанням функції генератора. Асинхронний об’єкт генератора зазвичай використовується в операторі async for у функції співпрограми аналогічно тому, як об’єкт генератора використовувався б у операторі for .

Виклик одного з методів асинхронного генератора повертає об’єкт awaitable , і виконання починається, коли цей об’єкт очікується. У цей час виконання переходить до першого виразу yield, де воно знову призупиняється, повертаючи значення expression_list до співпрограми очікування. Як і у випадку з генератором, призупинення означає, що весь локальний стан зберігається, включаючи поточні прив’язки локальних змінних, покажчик інструкцій, внутрішній стек оцінки та стан будь-якої обробки винятків. Коли виконання відновлюється шляхом очікування наступного об’єкта, повернутого методами асинхронного генератора, функція може продовжувати роботу точно так, якби вираз yield був просто ще одним зовнішнім викликом. Значення виразу yield після відновлення залежить від методу, який відновив виконання. Якщо використано __anext__() , результатом буде None . В іншому випадку, якщо asend() використовується, результатом буде значення, передане цьому методу.

Якщо асинхронний генератор завершує роботу раніше через break , скасування завдання виклику або інші винятки, запуститься асинхронний код очищення генератора та, можливо, викличе винятки або отримає доступ до змінних контексту в неочікуваному контексті — можливо, після час життя завдань залежить від цього, або під час завершення циклу подій, коли викликається хук збирання сміття асинхронного генератора. Щоб запобігти цьому, абонент повинен явно закрити асинхронний генератор, викликавши метод aclose() , щоб завершити генератор і остаточно від’єднати його від циклу подій.

У функції асинхронного генератора вирази yield дозволені будь-де в конструкції try . Однак, якщо асинхронний генератор не відновлено до його завершення (досягнувши нульового підрахунку посилань або збираючи сміття), тоді вираз yield у конструкції try може призвести до збою виконання очікуваного finally . У цьому випадку цикл подій або планувальник, який запускає асинхронний генератор, відповідає за виклик методу aclose() асинхронного генератора-ітератора та запуск отриманого об’єкта співпрограми, таким чином дозволяючи будь-які очікуючі finally для виконання.

Щоб подбати про фіналізацію після завершення циклу подій, цикл подій має визначати функцію finalizer, яка приймає асинхронний генератор-ітератор і, ймовірно, викликає aclose() і виконує співпрограму. Цей фіналізатор можна зареєструвати, викликавши sys.set_asyncgen_hooks() . Під час першого повторення асинхронний генератор-ітератор зберігатиме зареєстрований фіналізатор, який буде викликаний під час фіналізації. Для довідкового прикладу методу finalizer перегляньте реалізацію asyncio.Loop.shutdown_asyncgens у Lib/asyncio/base_events.py.

Вираз yield from є синтаксичною помилкою під час використання у функції асинхронного генератора.

6.2.9.4. Методи асинхронного генератора-ітератора¶

У цьому підрозділі описано методи ітератора асинхронного генератора, які використовуються для керування виконанням функції генератора.

Повертає awaitable, який під час запуску починає виконувати асинхронний генератор або відновлює його після останнього виконаного виразу yield. Коли функцію асинхронного генератора відновлено за допомогою методу __anext__() , поточний вираз yield завжди обчислюється як None у поверненому очікуваному, який під час виконання продовжиться до наступного виразу yield. Значення expression_list виразу yield є значенням винятку StopIteration , викликаного завершальною співпрограмою. Якщо асинхронний генератор завершує роботу, не видаючи іншого значення, awaitable натомість викликає виняток StopAsyncIteration , сигналізуючи, що асинхронну ітерацію завершено.

Цей метод зазвичай викликається неявно циклом async for .

coroutine agen. asend ( value ) ¶

Повертає awaitable, який після запуску відновлює виконання асинхронного генератора. Як і у випадку з методом send() для генератора, це «надсилає» значення у функцію асинхронного генератора, а аргумент value стає результатом поточного виразу yield. Awaitable, повернений методом asend() , поверне наступне значення, отримане генератором, як значення підвищеної StopIteration , або підвищить StopAsyncIteration , якщо асинхронний генератор завершує роботу, не даючи іншого. значення. Коли asend() викликається для запуску асинхронного генератора, його потрібно викликати з None як аргументом, оскільки немає виразу yield, який міг би отримати значення.

coroutine agen. athrow ( value ) ¶ coroutine agen. athrow ( type [ , value [ , traceback ] ] )

Повертає awaitable, який викликає виняток типу type у точці, де асинхронний генератор було призупинено, і повертає наступне значення, отримане функцією генератора як значення викликаного винятку StopIteration . Якщо асинхронний генератор завершує роботу, не видаючи іншого значення, очікуваний виклик викликає виняток StopAsyncIteration . Якщо функція генератора не перехоплює переданий виняток або викликає інший виняток, тоді, коли виконується очікуваний, цей виняток поширюється на виклик очікуваного.

Змінено в версії 3.12: The second signature (type[, value[, traceback]]) is deprecated and may be removed in a future version of Python.

Повертає awaitable, який під час виконання видає GeneratorExit у функцію асинхронного генератора в точці, де її було призупинено. Якщо функція асинхронного генератора завершує роботу належним чином, уже закрита або викликає GeneratorExit (не перехоплюючи виняток), тоді повернутий awaitable викличе виняток StopIteration . Будь-які подальші очікування, повернуті наступними викликами асинхронного генератора, викличуть виняток StopAsyncIteration . Якщо асинхронний генератор видає значення, awaitable викликає RuntimeError . Якщо асинхронний генератор викликає будь-який інший виняток, він поширюється на виклик очікуваного. Якщо асинхронний генератор уже завершив роботу через виняток або звичайний вихід, тоді подальші виклики aclose() повернуть очікуваний, який нічого не робить.

6.3. Праймеріз¶

Основні представляють найбільш тісно зв’язані операції мови. Їх синтаксис:

primary ::= atom | attributeref | subscription | slicing | call 

6.3.1. Посилання на атрибути¶

Посилання на атрибут є основним, за яким йдуть крапка та ім’я:

The primary must evaluate to an object of a type that supports attribute references, which most objects do. This object is then asked to produce the attribute whose name is the identifier. The type and value produced is determined by the object. Multiple evaluations of the same attribute reference may yield different objects.

This production can be customized by overriding the __getattribute__() method or the __getattr__() method. The __getattribute__() method is called first and either returns a value or raises AttributeError if the attribute is not available.

If an AttributeError is raised and the object has a __getattr__() method, that method is called as a fallback.

6.3.2. Підписки¶

Підписка екземпляра класу контейнера зазвичай вибирає елемент із контейнера. Підписка загального класу зазвичай повертатиме об’єкт GenericAlias .

Коли об’єкт має індекс, інтерпретатор обчислить основний і список виразів.

Основний має обчислювати об’єкт, який підтримує підписку. Об’єкт може підтримувати підписку через визначення одного або обох __getitem__() і __class_getitem__() . Коли основний має індекс, обчислений результат списку виразів буде передано одному з цих методів. Щоб дізнатися більше про те, коли __class_getitem__ викликається замість __getitem__ , перегляньте __class_getitem__ проти __getitem__ .

Якщо список виразів містить принаймні одну кому, він обчислиться як tuple , що містить елементи списку виразів. В іншому випадку список виразів обчислюватиметься значенням єдиного члена списку.

Для вбудованих об’єктів є два типи об’єктів, які підтримують підписку через __getitem__() :

  1. Відображення. Якщо основним є mapping , список виразів має обчислювати об’єкт, значення якого є одним із ключів відображення, а підписка вибирає значення у відображенні, яке відповідає цьому ключу. Прикладом вбудованого класу відображення є клас dict .
  2. Послідовності. Якщо основним є sequence , список виразів має обчислюватися як int або slice (як описано в наступному розділі). Приклади вбудованих класів послідовності включають класи str , list і tuple .

The formal syntax makes no special provision for negative indices in sequences . However, built-in sequences all provide a __getitem__() method that interprets negative indices by adding the length of the sequence to the index so that, for example, x[-1] selects the last item of x . The resulting value must be a nonnegative integer less than the number of items in the sequence, and the subscription selects the item whose index is that value (counting from zero). Since the support for negative indices and slicing occurs in the object’s __getitem__() method, subclasses overriding this method will need to explicitly add that support.

string — це особливий вид послідовності, елементами якої є символи. Символ — це не окремий тип даних, а рядок із рівно одного символу.

6.3.3. Нарізки¶

Нарізка вибирає діапазон елементів в об’єкті послідовності (наприклад, рядок, кортеж або список). Зрізи можуть використовуватися як вирази або як цілі в операторах призначення або del . Синтаксис нарізки:

slicing ::= primary "[" slice_list "]" slice_list ::= slice_item ("," slice_item)* [","] slice_item ::= expression | proper_slice proper_slice ::= [lower_bound] ":" [upper_bound] [ ":" [stride] ] lower_bound ::= expression upper_bound ::= expression stride ::= expression 

Тут існує неоднозначність у формальному синтаксисі: все, що виглядає як список виразів, також виглядає як список фрагментів, тому будь-яку підписку можна інтерпретувати як фрагмент. Замість подальшого ускладнення синтаксису, це усувається визначенням того, що в цьому випадку інтерпретація як підписка має пріоритет над інтерпретацією як нарізка (це випадок, якщо список зрізів не містить належного зрізу).

The semantics for a slicing are as follows. The primary is indexed (using the same __getitem__() method as normal subscription) with a key that is constructed from the slice list, as follows. If the slice list contains at least one comma, the key is a tuple containing the conversion of the slice items; otherwise, the conversion of the lone slice item is the key. The conversion of a slice item that is an expression is that expression. The conversion of a proper slice is a slice object (see section Стандартна ієрархія типів ) whose start , stop and step attributes are the values of the expressions given as lower bound, upper bound and stride, respectively, substituting None for missing expressions.

6.3.4. Дзвінки¶

Виклик викликає об’єкт, який можна викликати (наприклад, function ) з можливо порожньою серією аргументів :

call ::= primary "(" [argument_list [","] | comprehension] ")" argument_list ::= positional_arguments ["," starred_and_keywords] ["," keywords_arguments] | starred_and_keywords ["," keywords_arguments] | keywords_arguments positional_arguments ::= positional_item ("," positional_item)* positional_item ::= assignment_expression | "*" expression starred_and_keywords ::= ("*" expression | keyword_item) ("," "*" expression | "," keyword_item)* keywords_arguments ::= (keyword_item | "**" expression) ("," keyword_item | "," "**" expression)* keyword_item ::= identifier "=" expression 

Необов’язкова кінцева кома може бути присутнім після позиційних і ключових аргументів, але не впливає на семантику.

The primary must evaluate to a callable object (user-defined functions, built-in functions, methods of built-in objects, class objects, methods of class instances, and all objects having a __call__() method are callable). All argument expressions are evaluated before the call is attempted. Please refer to section Визначення функцій for the syntax of formal parameter lists.

If keyword arguments are present, they are first converted to positional arguments, as follows. First, a list of unfilled slots is created for the formal parameters. If there are N positional arguments, they are placed in the first N slots. Next, for each keyword argument, the identifier is used to determine the corresponding slot (if the identifier is the same as the first formal parameter name, the first slot is used, and so on). If the slot is already filled, a TypeError exception is raised. Otherwise, the argument is placed in the slot, filling it (even if the expression is None , it fills the slot). When all arguments have been processed, the slots that are still unfilled are filled with the corresponding default value from the function definition. (Default values are calculated, once, when the function is defined; thus, a mutable object such as a list or dictionary used as default value will be shared by all calls that don’t specify an argument value for the corresponding slot; this should usually be avoided.) If there are any unfilled slots for which no default value is specified, a TypeError exception is raised. Otherwise, the list of filled slots is used as the argument list for the call.

Деталі реалізації CPython: Реалізація може надавати вбудовані функції, чиї позиційні параметри не мають імен, навіть якщо вони «іменовані» з метою документації, і які, отже, не можуть бути надані за ключовими словами. У CPython це стосується функцій, реалізованих у C, які використовують PyArg_ParseTuple() для аналізу своїх аргументів.

Якщо позиційних аргументів більше, ніж слотів формальних параметрів, виникає виняток TypeError , якщо не існує формального параметра, що використовує синтаксис *identifier ; у цьому випадку формальний параметр отримує кортеж, що містить зайві позиційні аргументи (або порожній кортеж, якщо надлишкових позиційних аргументів не було).

Якщо будь-який аргумент ключового слова не відповідає офіційній назві параметра, виникає виняток TypeError , якщо не існує формального параметра, що використовує синтаксис **ідентифікатор ; у цьому випадку формальний параметр отримує словник, що містить надлишкові аргументи ключового слова (з використанням ключових слів як ключів і значень аргументів як відповідних значень), або (новий) порожній словник, якщо не було надлишкових аргументів ключового слова.

Якщо у виклику функції з’являється синтаксис *expression , expression має обчислюватися як iterable . Елементи з цих ітерованих елементів розглядаються як додаткові позиційні аргументи. Для виклику f(x1, x2, *y, x3, x4) , якщо y обчислюється як послідовність y1, …, yM, це еквівалентно виклику з M+ 4 позиційні аргументи x1, x2, y1, …, yM, x3, x4.

Наслідком цього є те, що хоча синтаксис *виразу може з’явитися після явних аргументів ключового слова, він обробляється перед аргументами ключового слова (та будь-якими аргументами **виразу – див. нижче). Тому:

>>> def f(a, b): . print(a, b) . >>> f(b=1, *(2,)) 2 1 >>> f(a=1, *(2,)) Traceback (most recent call last): File "", line 1, in TypeError: f() got multiple values for keyword argument 'a' >>> f(1, *(2,)) 1 2 

It is unusual for both keyword arguments and the *expression syntax to be used in the same call, so in practice this confusion does not often arise.

If the syntax **expression appears in the function call, expression must evaluate to a mapping , the contents of which are treated as additional keyword arguments. If a parameter matching a key has already been given a value (by an explicit keyword argument, or from another unpacking), a TypeError exception is raised.

When **expression is used, each key in this mapping must be a string. Each value from the mapping is assigned to the first formal parameter eligible for keyword assignment whose name is equal to the key. A key need not be a Python identifier (e.g. “max-temp °F” is acceptable, although it will not match any formal parameter that could be declared). If there is no match to a formal parameter the key-value pair is collected by the ** parameter, if there is one, or if there is not, a TypeError exception is raised.

Формальні параметри, що використовують синтаксис *ідентифікатор або **ідентифікатор , не можуть використовуватися як слоти позиційних аргументів або як імена аргументів ключових слів.

Змінено в версії 3.5: Виклики функцій приймають будь-яку кількість розпакувань * і ** , позиційні аргументи можуть слідувати за ітерованими розпакуваннями ( * ), а аргументи ключових слів можуть слідувати за розпакуваннями словника ( ** ). Спочатку запропоновано PEP 448.

Виклик завжди повертає певне значення, можливо, None , якщо тільки це не викликає виняткову ситуацію. Спосіб обчислення цього значення залежить від типу викликаного об’єкта.

функція, визначена користувачем:

Блок коду для функції виконується, передаючи їй список аргументів. Перше, що зробить блок коду, це прив’яже формальні параметри до аргументів; це описано в розділі Визначення функцій . Коли блок коду виконує оператор return , це визначає значення, що повертається викликом функції.

вбудована функція або метод:

Результат залежить від перекладача; див. Вбудовані функції для опису вбудованих функцій і методів.

Повертається новий екземпляр цього класу.

Викликається відповідна функція, визначена користувачем, зі списком аргументів, який на один довший за список аргументів виклику: екземпляр стає першим аргументом.

The class must define a __call__() method; the effect is then the same as if that method was called.

6.4. Очікуйте вираження¶

Призупинити виконання coroutine на об’єкті awaitable . Можна використовувати лише всередині функції співпрограми ( coroutine function ).

6.5. Оператор енергетики¶

Потужний оператор прив’язується сильніше, ніж унарні оператори зліва; він зв’язується менш тісно, ніж унарні оператори справа. Синтаксис:

Таким чином, у послідовності степеневих і унарних операторів без дужок оператори обчислюються справа наліво (це не обмежує порядок обчислення для операндів): -1**2 призводить до -1 .

Оператор ступеня має таку саму семантику, як і вбудована функція pow() , коли викликається з двома аргументами: він повертає свій лівий аргумент, зведений до степеня правого аргументу. Числові аргументи спочатку перетворюються на загальний тип, і результат має відповідний тип.

Для операндів int результат має той самий тип, що й операнди, якщо другий аргумент не є від’ємним; у цьому випадку всі аргументи перетворюються на значення float і видає результат float. Наприклад, 10**2 повертає 100 , а 10**-2 повертає 0,01 .

Піднесення 0.0 до негативного степеня призводить до ZeroDivisionError . Зведення від’ємного числа до дробового степеня призводить до complex числа. (У попередніх версіях це викликало ValueError .)

This operation can be customized using the special __pow__() method.

6.6. Унарні арифметичні та порозрядні операції¶

Усі унарні арифметичні та порозрядні операції мають однаковий пріоритет:

The unary – (minus) operator yields the negation of its numeric argument; the operation can be overridden with the __neg__() special method.

The unary + (plus) operator yields its numeric argument unchanged; the operation can be overridden with the __pos__() special method.

The unary ~ (invert) operator yields the bitwise inversion of its integer argument. The bitwise inversion of x is defined as -(x+1) . It only applies to integral numbers or to custom objects that override the __invert__() special method.

В усіх трьох випадках, якщо аргумент не має належного типу, виникає виняток TypeError .

6.7. Двійкові арифметичні операції¶

Двійкові арифметичні операції мають загальноприйняті рівні пріоритету. Зверніть увагу, що деякі з цих операцій також застосовуються до певних нечислових типів. Окрім оператора степеня, існує лише два рівні: один для мультиплікативних операторів і один для адитивних операторів:

m_expr ::= u_expr | m_expr "*" u_expr | m_expr "@" m_expr | m_expr "//" u_expr | m_expr "/" u_expr | m_expr "%" u_expr a_expr ::= m_expr | a_expr "+" m_expr | a_expr "-" m_expr 

Оператор * (множення) повертає добуток своїх аргументів. Обидва аргументи мають бути числами, або один аргумент має бути цілим числом, а інший — послідовністю. У першому випадку числа перетворюються на загальний тип, а потім перемножуються. В останньому випадку виконується повторення послідовності; негативний коефіцієнт повторення дає порожню послідовність.

This operation can be customized using the special __mul__() and __rmul__() methods.

Оператор @ (at) призначений для використання для множення матриці. Жодні вбудовані типи Python не реалізують цей оператор.

Оператори / (поділ) і // (поділ на поверх) видають приватне своїх аргументів. Числові аргументи спочатку перетворюються на загальний тип. Ділення цілих чисел дає значення з плаваючою точкою, а поділення цілих чисел дає ціле число; результатом є математичне ділення із застосованою до результату функцією «підлога». Ділення на нуль викликає виключення ZeroDivisionError .

This operation can be customized using the special __truediv__() and __floordiv__() methods.

Оператор % (по модулю) дає залишок від ділення першого аргументу на другий. Числові аргументи спочатку перетворюються на загальний тип. Нульовий правий аргумент викликає виняток ZeroDivisionError . Аргументи можуть бути числами з плаваючою комою, наприклад, «3,14%0,7» дорівнює «0,34» (оскільки «3,14» дорівнює «4*0,7 + 0,34»). Оператор модуля завжди дає результат із той же знак, що і його другий операнд (або нуль); абсолютне значення результату строго менше, ніж абсолютне значення другого операнда [ 1 ] .

Оператори поділу поверху та модульні оператори з’єднані такою тотожністю: x == (x//y)*y + (x%y) . Поділ на поверх і модуль також пов’язані з вбудованою функцією divmod() : divmod(x, y) == (x//y, x%y) . [ 2 ] .

На додаток до виконання операції за модулем над числами, оператор % також перевантажується рядковими об’єктами для виконання старого форматування рядків (також відомого як інтерполяція). Синтаксис для форматування рядків описано в Довіднику з бібліотеки Python, розділ Форматування рядків у стилі printf .

The modulo operation can be customized using the special __mod__() method.

Оператор поверхового ділення, оператор модуля та функція divmod() не визначені для комплексних чисел. Замість цього перетворіть на число з плаваючою комою за допомогою функції abs() , якщо потрібно.

Оператор + (додавання) повертає суму своїх аргументів. Обидва аргументи мають бути числами або обома послідовностями одного типу. У першому випадку числа перетворюються на загальний тип, а потім сумуються. В останньому випадку послідовності об’єднані.

This operation can be customized using the special __add__() and __radd__() methods.

Оператор – (віднімання) повертає різницю своїх аргументів. Числові аргументи спочатку перетворюються на загальний тип.

This operation can be customized using the special __sub__() method.

6.8. Змінні операції¶

Операції зсуву мають нижчий пріоритет, ніж арифметичні операції:

Ці оператори приймають цілі числа як аргументи. Вони зсувають перший аргумент вліво або вправо на кількість бітів, задану другим аргументом.

This operation can be customized using the special __lshift__() and __rshift__() methods.

Зсув праворуч на n бітів визначається як нижнє ділення на pow(2,n) . Зсув ліворуч на n бітів визначається як множення на pow(2,n) .

6.9. Бінарні побітові операції¶

Кожна з трьох побітових операцій має різний рівень пріоритету:

and_expr ::= shift_expr | and_expr "&" shift_expr xor_expr ::= and_expr | xor_expr "^" and_expr or_expr ::= xor_expr | or_expr "|" xor_expr 

The & operator yields the bitwise AND of its arguments, which must be integers or one of them must be a custom object overriding __and__() or __rand__() special methods.

The ^ operator yields the bitwise XOR (exclusive OR) of its arguments, which must be integers or one of them must be a custom object overriding __xor__() or __rxor__() special methods.

The | operator yields the bitwise (inclusive) OR of its arguments, which must be integers or one of them must be a custom object overriding __or__() or __ror__() special methods.

6.10. Порівняння¶

На відміну від C, усі операції порівняння в Python мають однаковий пріоритет, який нижчий, ніж у будь-якої арифметичної операції, операції зсуву чи побітової операції. Крім того, на відміну від C, такі вирази, як a < b < c , мають тлумачення, яке є звичайним у математиці:

comparison ::= or_expr (comp_operator or_expr)* comp_operator ::= "" | "==" | ">=" | "

Порівняння дають логічні значення: True або False . Спеціальні rich comparison methods можуть повертати не логічні значення. У цьому випадку Python викличе bool() для такого значення в логічних контекстах.

Формально, якщо a, b, c, …, y, z є виразами, а op1, op2, …, opN є операторами порівняння, тоді a op1 b op2 c . y opN z еквівалентний a op1 b і b op2 c і . y opN z , за винятком того, що кожен вираз обчислюється щонайбільше один раз.

Зауважте, що a op1 b op2 c не передбачає жодного порівняння між a і c, тому, наприклад, x < y >z є абсолютно законним (хоча, можливо, не дуже).

6.10.1. Порівняння цінностей¶

У розділі Об’єкти, значення та типи зазначено, що об’єкти мають значення (крім типу та ідентичності). Значення об’єкта є досить абстрактним поняттям у Python: наприклад, не існує канонічного методу доступу до значення об’єкта. Крім того, немає вимоги, щоб значення об’єкта було сконструйовано певним чином, напр. складається з усіх своїх атрибутів даних. Оператори порівняння реалізують певне уявлення про цінність об’єкта. Можна думати про них як про визначення значення об’єкта опосередковано, за допомогою реалізації порівняння.

Because all types are (direct or indirect) subtypes of object , they inherit the default comparison behavior from object . Types can customize their comparison behavior by implementing rich comparison methods like __lt__() , described in Базове налаштування .

Поведінка за умовчанням для порівняння рівності ( == і != ) базується на ідентичності об’єктів. Отже, порівняння рівності екземплярів з однаковою тотожністю призводить до рівності, а порівняння рівності екземплярів з різними ідентичністями призводить до нерівності. Мотивацією такої поведінки за замовчуванням є бажання, щоб усі об’єкти були рефлексивними (тобто x є y означає x == y ).

Порівняння порядку за замовчуванням ( < , >, = ) не надається; спроба викликає TypeError . Мотивацією такої поведінки за замовчуванням є відсутність аналогічного інваріанта, як для рівності.

Поведінка порівняння рівності за замовчуванням, тобто екземпляри з різними ідентифікаторами завжди нерівні, може відрізнятися від того, які типи потребуватимуть розумного визначення значення об’єкта та рівності на основі значення. Таким типам потрібно буде налаштувати свою поведінку порівняння, і насправді це зробили кілька вбудованих типів.

У наведеному нижче списку описано поведінку порівняння найважливіших вбудованих типів.

  • Числа вбудованих числових типів ( Числові типи — int, float, complex ) і стандартних бібліотечних типів fractions.Fraction і decimal.Decimal можна порівнювати всередині та між типами, з обмеженням що комплексні числа не підтримують порівняння порядку. У межах залучених типів вони порівнюють математично (алгоритмічно) правильно без втрати точності. Нечислові значення float('NaN') і decimal.Decimal('NaN') є спеціальними. Будь-яке впорядковане порівняння числа з нечисловим значенням є хибним. Протиінтуїтивний висновок полягає в тому, що нечислові значення не дорівнюють самі собі. Наприклад, якщо x = float('NaN') , 3 < x , x < 3 і x == x є помилковими, тоді як x ! = x вірно. Така поведінка відповідає стандарту IEEE 754.
  • None і NotImplemented є одиночними елементами. PEP 8 радить, що порівняння одиночних елементів завжди слід виконувати за допомогою is або is not , а не операторів рівності.
  • Двійкові послідовності (екземпляри bytes або bytearray ) можна порівнювати всередині та між типами. Вони порівнюють лексикографічно, використовуючи числові значення своїх елементів.
  • Рядки (примірники str ) порівнюються лексикографічно за допомогою числових кодових точок Unicode (результат вбудованої функції ord() ) їхніх символів. [ 3 ] Рядки та двійкові послідовності не можна безпосередньо порівнювати.
  • Послідовності (екземпляри tuple , list або range ) можна порівнювати лише в межах кожного зі своїх типів, з обмеженням, що діапазони не підтримують порівняння порядку. Порівняння рівності між цими типами призводить до нерівності, а впорядковане порівняння між цими типами викликає TypeError . Послідовності порівнюють лексикографічно за допомогою порівняння відповідних елементів. Вбудовані контейнери зазвичай припускають, що ідентичні об’єкти рівні самі собі. Це дозволяє їм обійти тести на рівність для ідентичних об’єктів, щоб підвищити продуктивність і зберегти свої внутрішні інваріанти. Лексикографічне порівняння між вбудованими колекціями працює таким чином:
    • Щоб дві колекції порівнювалися однаково, вони повинні бути одного типу, мати однакову довжину, і кожна пара відповідних елементів має порівнюватися однаковими (наприклад, [1,2] == (1,2) false, оскільки тип не той самий).
    • Колекції, які підтримують порівняння порядку, упорядковуються так само, як і їхні перші нерівні елементи (наприклад, [1,2,x]

    Визначені користувачем класи, які налаштовують свою поведінку порівняння, повинні дотримуватися деяких правил узгодженості, якщо це можливо:

      Порівняння рівності має бути рефлексивним. Іншими словами, ідентичні об’єкти повинні порівнюватися рівними:

    Що робить кожен знак Зодіаку абсолютно щасливим?

    Усі ми розуміємо щастя по-своєму; одному достатньо погладити цуценя, іншому потрібні діаманти. Більшість людей упевнені, що не можуть бути щасливими, доки не зустрінуть кохання всього свого життя, не куплять чудовий будинок або не знайдуть престижну роботу. Але не підлягає сумніву одне – ми всі прагнемо цього відчуття. Які ж складові цього щастя для кожного зодіакального знака?

    Овен

    Овну для щастя треба постійно чогось досягати – покращеного результату на тренуванні чи нової посади. На цьому шляху він стикається з багатьма перешкодами і з задоволенням приймає виклик – адже що більше складнощів на його шляху, то більш значущим і визначнішим є результат досягнутого.

    Телець

    Тельцю для щастя потрібна романтика й увага – чи то записка зранку від коханої людини, чи то милий подарунок. Головне, щоб усе було від душі. Побалуйте Тельця приготованою вечерею або масажем, це зробить його набагато щасливішим, ніж похід у ресторан або на вечірку.

    Близнюки

    Близнюки не люблять самотності, тож для щастя їм треба бути в оточенні людей, навіть малознайомих. Їм подобається виходити у світ, знайомитися з новим оточенням і бути в центрі подій. У будь-якій такій ситуації вони почуваються комфортно і щасливо.

    Рак

    Усе що треба для щастя Рака – це бути серед коханих, близьких і друзів. Їхнє серце зігріває думка, що люди відкладають усі справи і приходять поспілкуватися саме до них. Поки їхні кохані поруч, Рак почувається безтурботно щасливим.

    Лев

    Леви люблять бути зайнятими і погано почуваються в бездіяльності. Вони заповнюють своє життя подіями, людьми і бояться просто згаяти час, який можна використати для поліпшень у житті. Потреба Лева – це весь час робити щось дуже важливе і вартісне.

    Діва

    Вони люблять фокусуватися на деталях і працювати над складними й мудрованими проєктами. Діви щасливі вкладати свої зусилля у спільну справу і дізнаватися щось нове. Хочете побачити щасливу посмішку на її обличчі? Навчіть Діву чогось, чого вона раніше не знала.

    Терези

    Усе, що необхідно Терезам – це абсолютна гармонія. Вони щасливі, коли справи йдуть гладко і без проблем. Для найвищого ступеня щастя бажано, щоб рідні та близькі люди ладнали між собою, адже Терези терпіти не можуть конфліктів і намагаються налагодити життя так, щоб усі були задоволені.

    Скорпіон

    Для повного щастя життя Скорпіона має бути наповнене пригодами і однодумцями. Вони колекціонують враження і спогади, і подумки повертаються до них; це робить їх щасливими і гріє душу. Навіть коли настає період затишшя, у Скорпіона в пам’яті залишається скарбниця на все життя.

    Стрілець

    Стрілець відчуває щастя, не тільки досягнувши однієї мети, а й постійно ставлячи перед собою нові. Це дає йому ресурс для майбутнього і заряджає енергією. Стрільці вміють отримувати задоволення, просто працюючи та інвестуючи свій час у нові досягнення.

    Козоріг

    Козорогу важливе шанування і власна впливовість. Їм для щастя необхідне усвідомлення того, що вони надихають і вселяють повагу. Особливо цінні ці почуття від рідних і близьких людей, тому вони прагнуть бути лідерами думки серед важливих для них людей.

    Водолій

    Водолії люблять допомагати людям. Вони систематично підтримують стражденних або ж знаходять цікаву ідею і починають боротьбу. Цей знак серйозно ставиться до того, у що вірить і обов’язково йде до переможного кінця. Коли мету досягнуто, вони знаходять нову ідею, і все починається спочатку.

    Риби

    Риб робить щасливими підтримка оточуючих людей. Вони впевнені, що життя шалено важке, і самотужки здолати його складно, а то й неможливо. Риби відчувають себе щасливими, або витаючи у своїх власних фантазіях, або перебуваючи в оточенні люблячих і близьких людей.

Чим замінити слово плюшкиЧим замінити слово плюшки

Збагачуйте своє мовлення. Чим замінити іншомовні слова в українській мові Українська мова багата на незвичайні звороти, вирази, синоніми та різні мовні дива, які не притаманні жодній мові світу. Однак сьогодні

Чим поливати домашніЧим поливати домашні

Зміст:1 Як і чим поливати кімнатні квіти, щоби добре росли та не хворіли1.1 Як правильно поливати квіти у горщиках1.1.1 Скисле молоко краще не викидати: як приготувати просте й ефективне добриво

Скільки у мишки мишенят народжуєтьсяСкільки у мишки мишенят народжується

Богдан Лепкий «Мишка(Казка для дітей; для малих і великих)». Цінності істинні та фальшиві. Роль трагічної та комічної ситуації в р Опрацювати ідейно – художній зміст твору Б.Лепкого «Мишка». Допомогти учням