Как пользоваться opera tor

Обновлено: 03.07.2024

Все операторы языка СИ могут быть условно разделены на следующие категории:

- условные операторы, к которым относятся оператор условия if и оператор выбора switch;

- операторы цикла (for,while,do while);

- операторы перехода (break, continue, return, goto);

- другие операторы (оператор "выражение", пустой оператор).

Операторы в программе могут объединяться в составные операторы с помощью фигурных скобок. Любой оператор в программе может быть помечен меткой, состоящей из имени и следующего за ним двоеточия.

Все операторы языка СИ, кроме составных операторов, заканчиваются точкой с запятой ";".

1.4.1. Оператор выражение

Любое выражение, которое заканчивается точкой с запятой, является оператором.

Выполнение оператора выражение заключается в вычислении выражения. Полученное значение выражения никак не используется, поэтому, как правило, такие выражения вызывают побочные эффекты. Заметим, что вызвать функцию, невозвращающую значения можно только при помощи оператора выражения. Правила вычисления выражений были сформулированы выше.

Этот оператор представляет выражение, которое увеличивает значение переменной i на единицу.

Этот оператор представляет выражение, включающее в себя операции присваивания и вызова функции.

Этот оператор представляет выражение состоящее из вызова функции.

1.4.2. Пустой оператор

Пустой оператор состоит только из точки с запятой. При выполнении этого оператора ничего не происходит. Он обычно используется в следующих случаях:

- в операторах do, for, while, if в строках, когда место оператора не требуется, но по синтаксису требуется хотя бы один оператор;

- при необходимости пометить фигурную скобку.

Синтаксис языка СИ требует, чтобы после метки обязательно следовал оператор. Фигурная же скобка оператором не является. Поэтому, если надо передать управление на фигурную скобку, необходимо использовать пустой оператор.

1.4.3. Составной оператор

Составной оператор представляет собой несколько операторов и объявлений, заключенных в фигурные скобки:

Заметим, что в конце составного оператора точка с запятой не ставится.

Выполнение составного оператора заключается в последовательном выполнении составляющих его операторов.

Переменные e,g,f,q будут уничтожены после выполнения составного оператора. Отметим, что переменная q является локальной в составном операторе, т.е. она никоим образом не связана с переменной q объявленной в начале функции main с типом int. Отметим также, что выражение стоящее после return может быть заключено в круглые скобки, хотя наличие последних необязательно.

1.4.4. Оператор if

if (выражение) оператор-1; [else оператор-2;]

Выполнение оператора if начинается с вычисления выражения.

Далее выполнение осуществляется по следующей схеме:

- если выражение истинно (т.е. отлично от 0), то выполняется оператор-1.

- если выражение ложно (т.е. равно 0),то выполняется оператор-2.

- если выражение ложно и отсутствует оператор-2 (в квадратные скобки заключена необязательная конструкция), то выполняется следующий за if оператор.

После выполнения оператора if значение передается на следующий оператор программы, если последовательность выполнения операторов программы не будет принудительно нарушена использованием операторов перехода.

Этот пример иллюстрирует также и тот факт, что на месте оператор-1, так же как и на месте оператор-2 могут находиться сложные конструкции.

Допускается использование вложенных операторов if. Оператор if может быть включен в конструкцию if или в конструкцию else другого оператора if. Чтобы сделать программу более читабельной, рекомендуется группировать операторы и конструкции во вложенных операторах if, используя фигурные скобки. Если же фигурные скобки опущены, то компилятор связывает каждое ключевое слово else с наиболее близким if, для которого нет else.

В результате выполнения этой программы r станет равным 2.

Если же в программе опустить фигурные скобки, стоящие после оператора if, то программа будет иметь следующий вид:

В этом случае r получит значение равное 3, так как ключевое слово else относится ко второму оператору if, который не выполняется, поскольку не выполняется условие, проверяемое в первом операторе if.

Следующий фрагмент иллюстрирует вложенные операторы if:

Из рассмотрения этого примера можно сделать вывод, что конструкции использующие вложенные операторы if, являются довольно громоздкими и не всегда достаточно надежными. Другим способом организации выбора из множества различных вариантов является использование специального оператора выбора switch.

1.4.5. Оператор switch

Оператор switch предназначен для организации выбора из множества различных вариантов. Формат оператора следующий:

Выражение, следующее за ключевым словом switch в круглых скобках, может быть любым выражением, допустимыми в языке СИ, значение которого должно быть целым. Отметим, что можно использовать явное приведение к целому типу, однако необходимо помнить о тех ограничениях и рекомендациях, о которых говорилось выше.

Значение этого выражения является ключевым для выбора из нескольких вариантов. Тело оператора smitch состоит из нескольких операторов, помеченных ключевым словом case с последующим константным-выражением. Следует отметить, что использование целого константного выражения является существенным недостатком, присущим рассмотренному оператору.

Так как константное выражение вычисляется во время трансляции, оно не может содержать переменные или вызовы функций. Обычно в качестве константного выражения используются целые или символьные константы.

Все константные выражения в операторе switch должны быть уникальны. Кроме операторов, помеченных ключевым словом case, может быть, но обязательно один, фрагмент помеченный ключевым словом default.

Список операторов может быть пустым, либо содержать один или более операторов. Причем в операторе switch не требуется заключать последовательность операторов в фигурные скобки.

Отметим также, что в операторе switch можно использовать свои локальные переменные, объявления которых находятся перед первым ключевым словом case, однако в объявлениях не должна использоваться инициализация.

Схема выполнения оператора switch следующая:

- вычисляется выражение в круглых скобках;

- вычисленные значения последовательно сравниваются с константными выражениями, следующими за ключевыми словами case;

- если одно из константных выражений совпадает со значением выражения, то управление передается на оператор, помеченный соответствующим ключевым словом case;

- если ни одно из константных выражений не равно выражению, то управление передается на оператор, помеченный ключевым словом default, а в случае его отсутствия управление передается на следующий после switch оператор.

Отметим интересную особенность использования оператора switch: конструкция со словом default может быть не последней в теле оператора switch. Ключевые слова case и default в теле оператора switch существенны только при начальной проверке, когда определяется начальная точка выполнения тела оператора switch. Все операторы, между начальным оператором и концом тела, выполняются вне зависимости от ключевых слов, если только какой-то из операторов не передаст управления из тела оператора switch. Таким образом, программист должен сам позаботится о выходе из case, если это необходимо. Чаще всего для этого используется оператор break.

Для того, чтобы выполнить одни и те же действия для различных значений выражения, можно пометить один и тот же оператор несколькими ключевыми словами case.

Выполнение оператора switch начинается с оператора, помеченного case 2. Таким образом, переменная i получает значение, равное 6, далее выполняется оператор, помеченный ключевым словом case 0, а затем case 4, переменная i примет значение 3, а затем значение -2. Оператор, помеченный ключевым словом default, не изменяет значения переменной.

Рассмотрим ранее приведенный пример, в котором иллюстрировалось использование вложенных операторов if, переписанной теперь с использованием оператора switch.

Использование оператора break позволяет в необходимый момент прервать последовательность выполняемых операторов в теле оператора switch, путем передачи управления оператору, следующему за switch.

Отметим, что в теле оператора switch можно использовать вложенные операторы switch, при этом в ключевых словах case можно использовать одинаковые константные выражения.

1.4.6. Оператор break

Оператор break обеспечивает прекращение выполнения самого внутреннего из объединяющих его операторов switch, do, for, while. После выполнения оператора break управление передается оператору, следующему за прерванным.

1.4.7. Оператор for

Оператор for - это наиболее общий способ организации цикла. Он имеет следующий формат:

for ( выражение 1 ; выражение 2 ; выражение 3 ) тело

Выражение 1 обычно используется для установления начального значения переменных, управляющих циклом. Выражение 2 - это выражение, определяющее условие, при котором тело цикла будет выполняться. Выражение 3 определяет изменение переменных, управляющих циклом после каждого выполнения тела цикла.

Схема выполнения оператора for:

1. Вычисляется выражение 1.

2. Вычисляется выражение 2.

3. Если значения выражения 2 отлично от нуля (истина), выполняется тело цикла, вычисляется выражение 3 и осуществляется переход к пункту 2, если выражение 2 равно нулю (ложь), то управление передается на оператор, следующий за оператором for.

Существенно то, что проверка условия всегда выполняется в начале цикла. Это значит, что тело цикла может ни разу не выполниться, если условие выполнения сразу будет ложным.

В этом примере, реализующем запись строки символов в обратном порядке, для управления циклом используются две переменные top и bot. Отметим, что на месте выражение 1 и выражение 3 здесь используются несколько выражений, записанных через запятую, и выполняемых последовательно.

Другим вариантом использования оператора for является бесконечный цикл. Для организации такого цикла можно использовать пустое условное выражение, а для выхода из цикла обычно используют дополнительное условие и оператор break.

Так как согласно синтаксису языка Си оператор может быть пустым, тело оператора for также может быть пустым. Такая форма оператора может быть использована для организации поиска.

for (i=0; t[i]В данном примере переменная цикла i принимает значение номера первого элемента массива t, значение которого больше 10.

1.4.8. Оператор while

Оператор цикла while называется циклом с предусловием и имеет следующий формат:

while (выражение) тело ;

В качестве выражения допускается использовать любое выражение языка Си, а в качестве тела любой оператор, в том числе пустой или составной. Схема выполнения оператора while следующая:

1. Вычисляется выражение.

2. Если выражение ложно, то выполнение оператора while заканчивается и выполняется следующий по порядку оператор. Если выражение истинно, то выполняется тело оператора while.

3. Процесс повторяется с пункта 1.

Оператор цикла вида

for (выражение-1; выражение-2; выражение-3) тело ;

может быть заменен оператором while следующим образом:

Так же как и при выполнении оператора for, в операторе while вначале происходит проверка условия. Поэтому оператор while удобно использовать в ситуациях, когда тело оператора не всегда нужно выполнять.

Внутри операторов for и while можно использовать локальные переменные, которые должны быть объявлены с определением соответствующих типов.

1.4.9. Оператор do while

Оператор цикла do while называется оператором цикла с постусловием и используется в тех случаях, когда необходимо выполнить тело цикла хотя бы один раз. Формат оператора имеет следующий вид:

do тело while (выражение);

Схема выполнения оператора do while :

1. Выполняется тело цикла (которое может быть составным оператором).

2. Вычисляется выражение.

3. Если выражение ложно, то выполнение оператора do while заканчивается и выполняется следующий по порядку оператор. Если выражение истинно, то выполнение оператора продолжается с пункта 1.

Чтобы прервать выполнение цикла до того, как условие станет ложным, можно использовать оператор break.

Операторы while и do while могут быть вложенными.

Функция sum имеет два формальных параметра a и b типа int, и возвращает значение типа int, о чем говорит описатель, стоящий перед именем функции. Возвращаемое оператором return значение равно сумме фактических параметров.

В этом примере оператор return используется для выхода из функции в случае выполнения одного из проверяемых условий.

1.4.12. Оператор goto

Использование оператора безусловного перехода goto в практике программирования на языке СИ настоятельно не рекомендуется, так как он затрудняет понимание программ и возможность их модификаций.

Формат этого оператора следующий:

Оператор goto передает управление на оператор, помеченный меткой имя-метки. Помеченный оператор должен находиться в той же функции, что и оператор goto, а используемая метка должна быть уникальной, т.е. одно имя-метки не может быть использовано для разных операторов программы. Имя-метки - это идентификатор.

Любой оператор в составном операторе может иметь свою метку. Используя оператор goto, можно передавать управление внутрь составного оператора. Но нужно быть осторожным при входе в составной оператор, содержащий объявления переменных с инициализацией, так как объявления располагаются перед выполняемыми операторами и значения объявленных переменных при таком переходе будут не определены.

В Директе можно использовать специальные символы и операторы, которые помогут вам точнее сформулировать ключевую фразу, минус-фразу или запрос в сервисе подбора слов. Операторы можно комбинировать между собой.

Обучающее видео. Операторы: уточните ключевые фразы

Обучающее видео. Операторы: уточните ключевые фразы

В тексте объявления вы можете использовать математические символы (+, -, =, /, *, % и другие), знаки препинания, апостроф, хештеги. Употребление символов должно быть логически обосновано.

Как работают операторы

В таблице ниже перечислены все операторы. А также приведены примеры ключевых фраз и запросов, по которым будут или не будут показаны ваши объявления.

Пример ключевой фразы

Фиксирует форму слова (число, падеж, время).

купить билет в москву

купить билет в москве

купить корм для собак

перевозка водного транспорта

перевозка водным транспортом

Фиксирует стоп-слова (служебные части речи и местоимения, а также любые слова, не несущие дополнительного смысла).

если выключился компьютер

чтобы выключился компьютер

крем для бритья

крем после бритья

сверло по металлу

сверло из металла

Фиксирует количество слов. Показ по запросам, содержащим фразу без дополнительных слов.

купить красный автомобиль

купить автомобиль в кредит в москве

купить автомобиль в кредит москва

номер в отеле на двоих

номер в отеле для двоих

номер в недорогом отеле на двоих

приложение с картами

приложение с дисконтными картами

Фиксирует порядок слов. При этом учитываются все словоформы и стоп-слова.

билеты из москвы в париж

билеты на самолет из москвы в париж

билеты из парижа в москву

билеты москва париж

билеты из москвы недорого в париж

билеты москва париж

билеты на самолет москва париж

билеты недорого москва париж

стоимость билетов москва париж

билеты из москвы в париж

билеты париж москва

билеты из москвы недорого в париж

лечение при осложнениях

осложнения при лечении

школа живописи маслом

живопись школы кано

Группируют слова при сложных запросах.

купить машину недорого

купить машину ваз

заказать еду роллы

заказать еду пицца

Пример ключевой фразы

Фиксирует форму слова (число, падеж, время).

купить билет в москву

купить билет в москве

купить корм для собак

перевозка водного транспорта

перевозка водным транспортом

Фиксирует стоп-слова (служебные части речи и местоимения, а также любые слова, не несущие дополнительного смысла).

если выключился компьютер

чтобы выключился компьютер

крем для бритья

крем после бритья

сверло по металлу

сверло из металла

Фиксирует количество слов. Показ по запросам, содержащим фразу без дополнительных слов.

купить красный автомобиль

купить автомобиль в кредит в москве

купить автомобиль в кредит москва

номер в отеле на двоих

номер в отеле для двоих

номер в недорогом отеле на двоих

приложение с картами

приложение с дисконтными картами

Фиксирует порядок слов. При этом учитываются все словоформы и стоп-слова.

билеты из москвы в париж

билеты на самолет из москвы в париж

билеты из парижа в москву

билеты москва париж

билеты из москвы недорого в париж

билеты москва париж

билеты на самолет москва париж

билеты недорого москва париж

стоимость билетов москва париж

билеты из москвы в париж

билеты париж москва

билеты из москвы недорого в париж

лечение при осложнениях

осложнения при лечении

школа живописи маслом

живопись школы кано

Группируют слова при сложных запросах.

купить машину недорого

купить машину ваз

заказать еду роллы

заказать еду пицца

В сервисе подбора слов операторы будут работать на вкладках По словам , По регионам , на вкладке История запросов работает только оператор + .

Рекомендации по использованию

Иногда без операторов ваше объявление может быть показано по запросам, которые не подходят вашей тематике. В таблице ниже приведены примеры, в которых использование операторов необходимо.

Вы продаете плавучие дома и не хотите показываться по запросу вода на дом, в котором слова переставлены местами.

Не показывать рекламу бильярдных киев людям, которые хотят купить автомобиль фирмы Киа.

купить машину кия

купить кия спортейдж

купить бильярдный кий

Вы продаете плавучие дома и не хотите показываться по запросу вода на дом, в котором слова переставлены местами.

Не показывать рекламу бильярдных киев людям, которые хотят купить автомобиль фирмы Киа.

купить машину кия

купить кия спортейдж

купить бильярдный кий

Персонализированная реклама: возврат клиентов и доппродажи ","lang":>,"extra_meta":[>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>],"title":"Символы и операторы - Директ. Справка","productName":"Директ","extra_js":[[,"mods":,"__func137":true,"tag":"script","bem":false,"attrs":,"__func67":true>],[,"mods":,"__func137":true,"tag":"script","bem":false,"attrs":,"__func67":true>,,"mods":,"__func137":true,"tag":"script","bem":false,"attrs":,"__func67":true>],[,"mods":,"__func137":true,"tag":"script","bem":false,"attrs":,"__func67":true>]],"extra_css":[[],[,"mods":,"__func69":true,"__func68":true,"bem":false,"tag":"link","attrs":>,,"mods":,"__func69":true,"__func68":true,"bem":false,"tag":"link","attrs":>],[,"mods":,"__func69":true,"__func68":true,"bem":false,"tag":"link","attrs":>]],"csp":<"script-src":[]>,"lang":"ru">>>'> Персонализированная реклама: возврат клиентов и доппродажи

В Директе можно использовать специальные символы и операторы, которые помогут вам точнее сформулировать ключевую фразу, минус-фразу или запрос в сервисе подбора слов. Операторы можно комбинировать между собой.


Обучающее видео. Операторы: уточните ключевые фразы


Обучающее видео. Операторы: уточните ключевые фразы

В тексте объявления вы можете использовать математические символы (+, -, =, /, *, % и другие), знаки препинания, апостроф, хештеги. Употребление символов должно быть логически обосновано.

Как работают операторы

В таблице ниже перечислены все операторы. А также приведены примеры ключевых фраз и запросов, по которым будут или не будут показаны ваши объявления.

Пример ключевой фразы

Фиксирует форму слова (число, падеж, время).


купить билет в москву


купить билет в москве


купить собаку


купить корм для собак


купить собак


перевозка водного транспорта


перевозка водным транспортом


купить вазу


купить ваз

Фиксирует стоп-слова (служебные части речи и местоимения, а также любые слова, не несущие дополнительного смысла).


работа на дому


работа по дому


работа дома


если выключился компьютер


чтобы выключился компьютер


крем для бритья


крем после бритья


сверло по металлу


сверло из металла

Фиксирует количество слов. Показ по запросам, содержащим фразу без дополнительных слов.


купить автомобиль


автомобиль купить


купить красный автомобиль


купить автомобиль в кредит в москве


купить автомобиль в кредит москва


номер в отеле на двоих


номер в отеле для двоих


номер в недорогом отеле на двоих


приложение с картами


приложение с дисконтными картами

Фиксирует порядок слов. При этом учитываются все словоформы и стоп-слова.


билеты из москвы в париж


билеты на самолет из москвы в париж


билеты из парижа в москву


билеты москва париж


билеты из москвы недорого в париж


билеты москва париж


билеты на самолет москва париж


билеты недорого москва париж


стоимость билетов москва париж


билеты из москвы в париж


билеты париж москва


билеты из москвы недорого в париж


лечение при осложнениях


осложнения при лечении


школа живописи


школа живописи маслом


живопись школы кано

Группируют слова при сложных запросах.


купить машину недорого


купить машину ваз


заказать еду роллы


заказать еду пицца


купить пуховик


купить куртку

До 30 ноября включительно нужно зарегистрировать или подтвердить регистрацию симкарт, которые используются по корпоративным тарифам и были оформлены до 1 июня 2021 года. Если этого не сделать, с 1 декабря услуги связи будут приостановлены. Это касается организаций, ИП, их бывших и нынешних сотрудников и обычных абонентов, которые когда-то купили симкарту без оформления на свой паспорт.

Это не требование отдельных операторов, а федеральный закон. Все серьезно.

Курс о больших делах

Разбираемся, как начинать и доводить до конца масштабные задачи

Что это за требование

Суть требования в том, чтобы операторы и государство знали, за кем конкретно закреплен номер телефона. Раньше симку можно было купить на организацию, потом ее передавали сотруднику или продавали в переходе, не требуя предъявить паспорт. И было непонятно, кто именно пользуется этим номером. Абонентом была условная «Ромашка» с нулевым балансом или вообще давно ликвидированное ООО «Связь для всех», а на самом деле телефон мог быть у Петра Иванова или кого угодно еще.

Такими симкартами многие пользовались годами, регистрировали на них онлайн-банки, использовали в бизнесе, а иногда — для мошенничества и других преступлений. Государство решило с этим бороться. Сначала ввели обязательную идентификацию абонентов по паспорту, теперь пытаются навести порядок в корпоративных номерах.

Из-за этого прибавилось хлопот у бизнеса. А простые абоненты могут вообще потерять номер, хотя честно использовали его в течение многих лет и ничего незаконного не задумывали.

Что нужно делать фирмам и ИП

С 1 июня по 30 ноября 2021 года всем абонентам с корпоративными симкартами нужно зарегистрировать используемые номера на госуслугах. То есть владелец номеров передает оператору связи сведения о том, кто и какими симкартами пользуется, — с данными конкретных сотрудников. Оператор запрашивает у этих сотрудников подтверждение через госуслуги — и после этого активирует карту.

Если симкарта установлена в устройстве, она активируется сразу после передачи данных, дополнительное подтверждение не требуется. Все это происходит дистанционно.

Вот что нужно сделать организации или ИП:

  1. Зарегистрировать учетную запись на госуслугах. Если запись есть — проверить, чтобы она была подтвержденной. Для регистрации понадобится учетная запись руководителя-физлица. Все номера одного оператора можно указать в одном заявлении. Данные можно вносить вручную или с помощью CSV-файла. Нужны паспортные данные и номера телефонов сотрудников. Если симкарта в устройстве — адрес размещения, номер устройства и телефона.

Заявление отправляется электронно — на портале.

Данные о сотрудниках можно заполнить вручную или передать в виде таблицы

Что делать работникам

Есть два варианта:

  1. дождитесь запроса на подтверждение симкарты на госуслугах. Он придет от оператора связи в личный кабинет. Проверьте номер и подтвердите, что используете его. Информация фиксируется в реестре: вот этот номер по договору с ООО «Ромашка» использует Иванов Петр с такими-то паспортными данными; Нужно будет указать ИНН работодателя — на кого оформлена карта. Оператор проверит данные и после подтверждения активирует карту.

Получается, что пользователям симкарт нужно либо ждать инициативы от компании, которая заключила договор, либо знать ее данные и самостоятельно активировать карту. В любом случае сведения о конечном пользователе будут проверяться. Оператор активирует карту, только если данные от корпоративного абонента и физлица совпадут.

Это не будет проблемой для тех, кто на самом деле пользуется корпоративной связью действующих компаний. Добавит немного хлопот, но не более. А вот тем, кто потерял контакт с организацией или когда-то давно купил непонятно какую симкарту, придется столкнуться с проблемами — вплоть до потери номера.

Как оператор проверяет данные пользователя

Рассмотрим вариант, когда абонент передает данные на госуслугах сам за себя. Например, если организации уже нет, он уволился, покупал симку в переходе или не дождался запроса на активацию. Вот пользователь заполнил данные на госуслугах, оператор их получил.

А дальше оператор проверяет:

  1. Правда ли есть такой договор.
  2. Передавала ли эта организация реестр с данными этого пользователя.

И если хотя бы что-то не совпадает, карта не будет активирована. А после 1 декабря есть риск остаться без номера.

Что за реестры передают организации

По закону с 2018 года корпоративные абоненты должны передавать операторам связи информацию о том, кто фактически пользуется номерами. Согласие пользователей при этом не требуется. Оператор проверяет достоверность данных — например запрашивая паспорт. А если сведения не подтверждаются, услуги связи могут приостановить.

Если юрлицо или ИП ликвидируется, абонентские номера могут быть переоформлены на конечных пользователей.

То есть уже три года корпоративные абоненты и так сообщают данные конечных пользователей. Или, по крайней мере, должны это делать.

Но кто-то из них мог не передать информацию или сообщить недостоверные сведения. Или директор просто везде указывал пользователем себя, а карты раздавал менеджерам. Кто-то уже и не помнит, кому передали симкарту. Некоторые пользователи получили корпоративный номер не от работодателя, а от какой-то посторонней компании, с которой давно нет связи. Раньше об этом никто не задумывался.

Теперь это будет серьезной проблемой. Даже если вы честно сообщаете, что пользуетесь номером такого-то юрлица, нужно, чтобы это юрлицо передало о вас сведения. Только тогда карта будет активирована. В противном случае после 1 декабря вас ждет неприятный сюрприз в виде блокировки, даже если вы самый честный на свете абонент.

Что можно сделать, чтобы сохранить номер

Если точно знаете, что сведения о вас не передадут или они будут недостоверными, можно попробовать переоформить корпоративный номер на себя без участия второй стороны — организации, которая заключала договор.

Для этого у операторов связи есть услуга — обычно платная, но недорогая. Проблема не в стоимости, а в самом процессе: он не дает гарантии, что заявку на переоформление точно одобрят.

Алгоритм переоформления обычно такой:

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

А еще бывает, что организация реальная и до сих пор работает, но передавать симкарту не хочет. Хотя человек пользуется ею много лет в личных целях и сам платит за связь. Тут ничего не поделать.

Что делать, если переоформить номер не получится

Нужно подготовиться к возможной блокировке. Приостановка услуг связи по неподтвержденным корпоративным номерам может произойти 1 декабря или позднее. Может, переходный период и продлят, но пока об этом ничего не известно — надеяться не стоит.

Сообщите новый номер своим контактам. Перенесите историю в мессенджерах. Заново настройте приложения, если потребуется.

Это будет большая работа, но деваться некуда.

Как узнать, на кого оформлен номер

Эта информация есть в личном кабинете вашего оператора. Туда можно попасть через приложение или войти с компьютера — но симкарта должна быть доступна. На нее придет смс для подтверждения. Или нужно знать пароль.

Проверьте на всякий случай эту информацию, если не помните, на кого оформляли карту, или меняли данные при увольнении.

Операторы (operators) * и ** встречаются в питоне очень часто. Иногда они немного непонятны и новичкам, и опытным ребятам, переходящим на питон с ряда других языков программирования (в которых операторы могут использоваться немного иначе). Статья известного питон-коуча Трея Ханнера (Trey Hunner), который помогает девелоперам расширять свои знания. Дата написания статьи: 10.11.2018.

Функционал операторов * и ** развивается уже много лет. Я хочу рассмотреть все способы их использования по состоянию на текущий момент. Буду указывать, что конкретно работает только в современных версиях питона. Поэтому, если вы изучали операторы * и ** еще во времена питона 2 (Python 2), советую хотя бы проглядеть данную статью, потому что в питоне 3 (Python 3) этим операторам добавили много новых возможностей.

Если вы начали изучать питон недавно и еще не освоили аргументы ключевых слов (keyword arguments; также известные как именованные аргументы, named arguments), предлагаю сперва прочитать мою статью про аргументы ключевых слов в питоне.

Что мы обсуждать не будем

В данной статье, говоря про операторы * и **, я имею в виду операторы-префиксы (prefix operators), а не инфиксы (infix). То есть, функции умножения и возведения в степень не входят в тему статьи.

Тогда про что же мы говорим

Мы говорим про операторы-префиксы * и **, которые используются перед переменной (variable). Например:

>>> numbers = [2, 1, 3, 4, 7]
>>> more_numbers = [*numbers, 11, 18]
>>> print(*more_numbers, sep=', ')
2, 1, 3, 4, 7, 11, 18

В данном коде можно увидеть два способа использования оператора *. Оператор ** отсутствует.

В сферу применения рассматриваемых операторов входит:
1. Операторы * и **: передача аргументов в функцию.
2. Операторы * и **: захват аргументов, переданных в функцию.
3. Оператор *: принятие аргументов, содержащих только ключевые слова.
4. Оператор *: захват элементов во время распаковки кортежа (tuple).
5. Оператор *: распаковка итерируемых объектов в списке или кортеже.
6. Оператор **: + распаковка словарей в других словарях.

Даже если вам кажется, что вы освоили все эти способы, позволяющие использовать операторы * и **, рекомендую посмотреть на все нижеприведенные блоки кода, чтобы убедиться, что они все вам знакомы. Последние несколько лет разработчики ядра питона продолжают добавлять этим операторам новые возможности, поэтому какие-то из новых применений можно проглядеть.

Операторы * и ** при распаковке во время вызова функции

При вызове функции оператор * можно задействовать для распаковки итерируемого объекта в аргументах, введенных для вызова:

>>> fruits = ['lemon', 'pear', 'watermelon', 'tomato']
>>> print(fruits[0], fruits[1], fruits[2], fruits[3])
lemon pear watermelon tomato
>>> print(*fruits)
lemon pear watermelon tomato

В строке print(*fruits) производится вызов всех элементов списка fruits в функции print. Они становятся отдельными аргументами. При этом нам даже не надо знать, сколько всего аргументов окажется в списке.

Еще один пример:

def transpose_list(list_of_lists):
return [
list(row)
for row in zip(*list_of_lists)
]

В данном случае мы принимаем список со списками в качестве элементов и возвращаем «преобразованный» список со списками:

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

>>> date_info = <'year': "2020", 'month': "01", 'day': "01">
>>> filename = "--.txt".format(**date_info)
>>> filename
'2020-01-01.txt'

Скажу из своего опыта. Оператор ** не часто используется для распаковки аргументов ключевых слов при вызове функции. Чаще всего я вижу такие примеры при работе с наследованием: вызовы super() часто включают в себя оба оператора.

Операторы * и ** можно использовать неоднократно при вызове функции. Данная возможность появилась в питоне 3.5. Иногда это может оказаться очень уместным:

>>> fruits = ['lemon', 'pear', 'watermelon', 'tomato']
>>> numbers = [2, 1, 3, 4, 7]
>>> print(*numbers, *fruits)
2 1 3 4 7 lemon pear watermelon tomato

Неоднократное использование ** выглядит примерно так же:

>>> date_info = <'year': "2020", 'month': "01", 'day': "01">
>>> track_info =
>>> filename = "----.txt".format(
. **date_info,
. **track_info,
. )
>>> filename
'2020-01-01-Beethoven-Symphony No 5.txt'

Однако не нужно терять бдительности при неоднократном использовании операторов * и **. Неоднократное указание одного и того же аргумента ключевых слов не допускается в функциях питона. Поэтому, если использовать ** для словарей, то ключи должны быть уникальными. В противном случае возникнет исключение.

Операторы * и ** при упаковке аргументов, переданных функции

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

from random import randint
def roll(*dice):
return sum(randint(1, die) for die in dice)

Данная функция принимает любое количество аргументов.

Функции питона print и zip принимают любое количество позиционных аргументов. Такое использование оператора * при упаковке аргументов позволяет нам создавать свои функции, которые (аналогично print и zip) принимают любое количество аргументов.

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

def tag(tag_name, **attributes):
attribute_list = [
f'=""'
for name, value in attributes.items()
]
return f"< >"

В данном месте ** захватывает в словарь аргументы ключевых слов, которые мы передаем данной функции. Впоследствии аргументы атрибутов (attributes) данной функции смогут на него ссылаться.

>>> tag('a', href="http://treyhunner.com")
>>> tag('img', height=20, width=40, src="https://kirill-sklyarenko.ru/face.jpg")

Позиционные аргументы, содержащие аргументы только из ключевых слов

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

Чтобы принимать аргументы, содержащие только ключевые слова, мы можем поместить именованные аргументы после оператора * при определении тела функции:

def get_multiple(*keys, dictionary, default=None):
return [
dictionary.get(key, default)
for key in keys
]

Данную функцию можно использовать так:

>>> fruits = <'lemon': 'yellow', 'orange': 'orange', 'tomato': 'red'>
>>> get_multiple('lemon', 'tomato', 'squash', dictionary=fruits, default='unknown')
['yellow', 'red', 'unknown']

Аргументы dictionary и default поставлены после *keys. То есть, их можно только в качестве аргументов ключевых слов. Если мы попытаемся определить их позиционно, то увидим ошибку:

>>> fruits = <'lemon': 'yellow', 'orange': 'orange', 'tomato': 'red'>
>>> get_multiple('lemon', 'tomato', 'squash', fruits, 'unknown')
Traceback (most recent call last):
+ File "", line 1, in
TypeError: get_multiple() missing 1 required keyword-only argument: 'dictionary'

Данное поведение внедрено в питон с помощью предложения PEP 3102.

Аргументы, содержащие только ключевые слова и не содержащие позиционные аргументы

Аргументы, содержащие только ключевые слова, – неплохое средство. Но что если вы хотите требовать ввода аргументов, содержащих только ключевые слова, не захватывая неограниченное количество позиционных аргументов?

питон позволяет сделать это с помощью немного странного синтаксиса, когда оператор * как бы сам по себе:

def with_previous(iterable, *, fillvalue=None):
"""Yield each iterable item along with the item before it."""
previous = fillvalue
for item in iterable:
yield previous, item
previous = item

Данная функция принимает аргумент, содержащий итерируемый объект (iterable). Его можно определить позиционно (то есть, первым) или с помощью названия и аргумента fillvalue, который входит в число аргументов, допускающих только ключевые слова. Это означает, что мы можем вызвать функцию with_previous вот так:

>>> list(with_previous([2, 1, 3], 0))
Traceback (most recent call last):
File "", line 1, in
TypeError: with_previous() takes 1 positional argument but 2 were given

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

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

На самом деле, данный подход используется встроенной функцией питона sorted. Если посмотреть справку для sorted, можно увидеть следующее:

>>> help(sorted)
Help on built-in function sorted in module builtins:
sorted(iterable, /, *, key=None, reverse=False)
Return a new list containing all items from the iterable in ascending order.
A custom key function can be supplied to customize the sort order, and the reverse flag can be set to request the result in descending order.

Пример использования оператора * как самого по себе прямо в документации по аргументам функции sorted.

Операторы * и ** при распаковке кортежа

Дополнительно к вышенаписанному, в питоне 3 добавлен новый способ применения *, который некоторым образом связан с вышеописанными возможностями этого оператора при определении тела функции и при вызове функции.

Оператор * теперь можно использовать при распаковке кортежа:

>>> fruits = ['lemon', 'pear', 'watermelon', 'tomato']
>>> first, second, *remaining = fruits
>>> remaining
['watermelon', 'tomato']
>>> first, *remaining = fruits
>>> remaining
['pear', 'watermelon', 'tomato']
>>> first, *middle, last = fruits
>>> middle
['pear', 'watermelon']

Если вы задаете себе вопрос: как же мне использовать это в своем коде, посмотрите примеры в моей статье про распаковку кортежей в питоне. В этой статье я показал, каким образом такое использование оператора * может, в некоторых случаях, стать альтернативой для срезания последовательностей (sequence slicing).

Обычно во время своих лекций об операторе * я говорю, что можно использовать только одно выражение с ним в отдельном вызове многократного присвоения (multiple assignment). Технически это некорректно, потому что можно его использовать два раза при вложенной распаковке (nested unpacking). Данный вопрос я рассмотрел подробно в статье про распаковку кортежей.

>>> fruits = ['lemon', 'pear', 'watermelon', 'tomato']
>>> ((first_letter, *remaining), *other_fruits) = fruits
>>> remaining
['e', 'm', 'o', 'n']
>>> other_fruits
['pear', 'watermelon', 'tomato']

Правда, я никогда не встречал хорошего примера такого использования. Не думаю, что стал бы его рекомендовать, даже если бы удалось найти. Он выглядит немного непонятно.

Данная возможность добавлена в питон на основе предложения PEP 3132. Следует отметить, что оно не относится к очень длинным.

Операторы * и ** в литерале списка

В питоне 3.5 добавлено очень много возможностей, связанных с оператором *, на основе предложения PEP 448. Одной из самых заметных новых возможностей стало использование * для вывода итерируемого объекта в новый список.

Допустим, у вас есть функция, которая принимает любые последовательности и возвращает список, содержащий каскад из последовательности и ее реверсивного варианта:

def palindromify(sequence):
return list(sequence) + list(reversed(sequence))

Данная функция должна пару раз провести конвертацию в список, чтобы объединить списки и вернуть результат. Начиная с питона 3.5, мы можем, вместо вышеприведенного примера, написать следующее:

def palindromify(sequence):
return [*sequence, *reversed(sequence)]

В данном коде больше нет нескольких ненужных вызовов списков. Поэтому он стал эффективнее и лучше читается.

def rotate_first_item(sequence):
return [*sequence[1:], sequence[0]]

Данная функция возвращает новый список, в котором первый элемент переданного списка (или другой последовательности) перенесен в конец нового списка.

Это очень удачная возможность, позволяющая с помощью оператора * объединять итерируемые объекты различных типов. Оператор * работает с любыми итерируемыми объектами, а оператор + работает только с определенными последовательностями, при чем все из объединяемых должны быть одного типа.

Отмечу, что данная возможность не ограничивается только созданием списков. Мы можем выводить итерируемые объекты в новые кортежи или множества (set):

>>> fruits = ['lemon', 'pear', 'watermelon', 'tomato']
>>> (*fruits[1:], fruits[0])
('pear', 'watermelon', 'tomato', 'lemon')
>>> uppercase_fruits = (f.upper() for f in fruits)
>>>

Обратите внимание, что последняя строка принимает список и генератор (generator), а потом выводит их в новое множество. Перед появлением этой возможности для оператора * было непросто сделать это в одну строку кода. Разумеется, способ сделать это существовал, но его было непросто вспомнить или обнаружить:

Оператор ** в литерале словаря

Помимо вышеприведенного на основе предложения PEP 448 в функционал ** добавлен вывод пар ключ/значение (key/value) из словаря в новый словарь:

Про это я написал еще одну статью. Сейчас ее можно найти под новым названием про идиоматический способ сливать словари в питоне. Данную возможность можно использовать не только для сливания двух словарей. Например, можно скопировать словарь, параллельно добавляя в него новые значения:

Еще можно скопировать или слить словари, переписывая определенные значения:

Операторы * и ** обладают немалыми возможностями в питоне

В питоне операторы * и ** – не просто синтактический выверт. Некоторые из их возможностей реализуются и другими средствами, но доступные альтернативы обычно более громоздкие и потребляют больше ресурсов. Кроме того, некоторые элементы в функционале этих операторов попросту не доступны без их использования. Например, без помощи * невозможно передать в функцию неопределенное количество позиционных аргументов.

Прочитав обо всех возможностях * и **, вы, возможно, удивитесь названиям, под которыми используются эти странные операторы. К сожалению, для них нет лаконичных названий. Я слышал, как * называли оператором для упаковки и распаковки. Еще слышал, как его называли «splat» (это из мира Руби) и просто звездой.

Чаще всего я называю их звездой (star) и двойной звездой (double star) (или звездой-звездой (star star)). В данном случае разделения с их функциями как инфиксов не проводится (речь идет про операции умножения и возведения в степень). Но обычно из контекста очевидно, о чем идет речь, про префиксы или инфиксы.

Если вы не понимаете операторы * и ** или боитесь не запомнить все их возможности, не нужно беспокоиться. Способов использования много, и запоминать каждую конкретную возможность для каждого из них не так важно. Лучше будет осознать, в каких случаях к ним можно обратиться. Предлагать использовать данную статью как чек-лист или создать свой чек-лист, который поможет вам использовать операторы * и ** в питоне.

Читайте также: