Двоеточие в питоне что значит
Перейти к содержимому

Двоеточие в питоне что значит

  • автор:

Зачем двоеточие в python?

Здравствуйте, не как не пойму зачем в питоне используется двоеточие ?

и также понятно по отступам что print вложенный блок if

  • Вопрос задан более трёх лет назад
  • 4839 просмотров

Оценить 1 комментарий

  • Facebook
  • Вконтакте
  • Twitter

Daniro_San

  • Facebook
  • Вконтакте
  • Twitter

aRegius

  • Facebook
  • Вконтакте
  • Twitter

Olej

Как же мне нравится и всегда умиляет, когда каждый пЫонЭр начинает в очередной раз предлагать: а давайте в C++ станем употреблять скобки, вывернутые наоборот — > < вместо <>!

aRegius

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

В свое время Python-ист Крис МакДоноу вместе с коллегами из Zope остались неудовлетворены своими поисками «правильного» с их точки зрения фреймворка из существующих на рынке и занялись разработкой своего собственного, Repoze. Спустя какое-то время они объединились с ребятами из Pylons, так родился Pyramid.

Когда и зачем использовать оператор := в Python

Совсем недавно Python 3.8 представил оператор присвоения с двоеточием := , аналогичный оператору присвоения = . Использование этого оператора позволяет ускорить и сократить код.

Эта нотация берёт своё начало в математике. При записи уравнений можно написать что-то вроде a=5, a+b=7. Тогда, используя простую алгебраическую операцию, легко вычислить, что b=2. В этом контексте знак равенства означает тождество. Переменные a и b являются постоянными числами, и, хотя их значение неизвестно при инициализации задачи, они существуют и не изменяются.

С другой стороны, в математике существует другая нотация для обозначения отношения ‘x определяется как y’. Запись x := y не означает, что x и y равны друг другу. Здесь x определён как любое значение y. Уравнение скорее одностороннее, чем симметричное, что несколько сложно понять. Эта нотация применяется только для длинных списков определений переменных в узкоспециализированных научных статьях.

Однако в самой последней версии Python 3.8 стало общепринятым использование := или оператора “морж” (он действительно похож на голову лежащего моржа). С его помощью можно определить переменную в границах выражения в контексте программирования.

Так разработчики Python обосновали введение оператора “морж”:

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

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

Рассмотрим следующий код с функцией f , определённой как f = lambda x : x+2 , которая просто прибавляет 2 к любым введённым данным:

Получим [3, 5, 6] , поскольку эти результаты функции не равны 4. Это значительно более эффективная реализация, чем её альтернатива, дважды прогоняющая введённые данные через функцию:

Будьте осторожны: поскольку версия 3.8 является совсем новой, некоторые не обновлённые среды могут не поддерживать её.

Давайте рассмотрим другой пример. Есть некий текстовый файл text.txt . Он содержит три строки с буквами от a до i .

Допустим, мы хотим пройти циклом по файлу строка за строкой. Существует несколько способов сделать это. Например, использовать встроенную функцию .readlines() .

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

Оно тоже работает, но составные функции не настолько просты и понятны, как могли бы быть. Запишем с помощью оператора “морж”:

Здесь мы просто определяем chunk как чтение файла. Просто, коротко и чисто. С другой стороны, запись while chunk = open… была бы неверной, потому что нельзя создавать присвоение переменных при вычислении отдельного выражения.

В качестве следующего примера возьмём заданное выше определение функции f(x), добавлявшей двойку к вводу. Следующая конструкция списка g полностью допустима с использованием оператора “морж”:

Здесь y определяется как f(3) и используется в том же выражении. Нельзя написать что-то вроде g = [y=f(3), …] , поскольку присвоение переменных с использованием = должно выполняться отдельной строкой, а не внутри другого выражения. С помощью стандартного оператора равенства то же самое записывается в две строки:

Теперь использование оператора морж должно быть довольно ясным.

Оператор := может использоваться для присвоения переменных во время вычисления другого выражения.

Поскольку присвоение переменной в форме var = expr должно записываться в отдельной строке, оператор “морж” позволяет сократить пространство, запуская присвоение переменной с выполнением внутри другого выражения, будь то создание списка или чтение файла.

Во многих случаях оператор := аналогичен определению переменных-заполнителей, например for i in range(x): , в котором переменная i инициализируется внутри выражения цикла for. Его можно рассматривать как расширение или обобщение этих “инициализаций скрытых переменных”.

Конечно, оператор “морж” нельзя использовать везде. Следующее недопустимо:

Давайте разберём, почему работает выражение a=(b:=4) . Это происходит потому, что b:=4 не только устанавливает b равным четырём, но и возвращает его значение. Поэтому работает и приведённый выше оператор генератора списков ( if y := f(x)) is not 4] ). Он вычисляет b:=4 как выражение, возвращающее значение, в итоге и a , и b имеют значение 4.

Со скобками вокруг первого оператора (a := 3) он выполняется корректно, потому что использование скобок помечает всё внутри них как выражение. Операторы “морж” могут использоваться только внутри других выражений.

Давайте немного выйдет за пределы каноничного Python. Здесь мы рассмотрим некоторые полезные способы использования оператора “морж”, которые могут привести в ярость фанатичных последователей Python.

Рассмотрим функцию exponent , которая увеличивает base по exp .

Допустим, нам нужно получить значение четырёх в кубе, сохранив при этом значение степени (3). Воспользуемся оператором “морж”:

Тройка сохраняется в хранилище переменных, функция выполняется нормально, мы сэкономили строку кода и некоторое время выполнения. При широкомасштабном использовании оператора “морж” эта экономия заметно ощутима.

Оператор “морж” можно использовать даже в операторах if. В примере ниже (placeholder:=x) вычисляется независимо от значения x . Если выход равен четырём, он всё равно сохраняется в плейсхолдере. Обычно такое использование не имеет особой практической ценности, поскольку выполняется избыточное присваивание (что если x!=4 ?), но полезно знать, что такое возможно.

В качестве ещё одного примера кода не в стиле Python, рассмотрим следующую допустимую функцию:

f(3) возвращает 20, потому что (m := x+1) оценивается как 4 и (m**2) оценивается как 16 . Их сумма равна 20, это вычисляется довольной чистым, но при этом несколько хитрым методом.

В чем принципиальный смысл двоеточия при отделение блоков кода в Python?

Есть принцип DRY, то есть "не повторяйся". Когда мы пишем функцию def, используем if, for и другие инструкции, то в конце ставим двоеточие для отделения блока кода от его объявления. А на следующей строке обязательно используем отступ в 4 пробела с той же целью. Разве это не нарушение DRY? В чем тогда сакральный смысл двоеточия? Оно под капотом Python как-то обрабатывается? Разве одной табуляции было бы не достаточно?

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

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

Danis's user avatar

Хорошо, давайте попробуем сократить одну из "лишних" сущностей.

  • Начнём с отступа

Так, стоп — а как понять, что функция кончилась? Придётся ещё какое-то правило вводить, например, пустую строку в конце функции.

Хм, ну это вариант, но лучше ли это, чем отступы, нагляднее ли? А если добавить ещё таких же сущностей внутрь функции.

Так, стоп, а как понять, где кончились строки внутри блоков if ?! И так, чтобы не перепутать их с концом функции? Тоже с помощью пустой строки? Ну ладно, добавим ещё после else: пустую строку.

Понятно ли в таком виде, где кончился else: , а где def ? А если это длинная функция и там ещё есть внутри уровни вложенности? Это тогда придётся считать пустые строки, чтобы понять, конец какого блока эта пустая строка означает? И считать потом назад конструкции, начинающие блоки. Кажется, код постепенно становится не читаемым. :/

  • Теперь попробуем оставить отступы, но не двоеточие

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

Вы сможете сходу понять глядя на такой код где кончилось условие и где начался код внутри уже блока if ? И сразу понять, глядя на этот код, нет ли тут каких ошибок? Я вот что-то уже не уверен. Если только запретить продолжать код в той же строке, тогда ещё ладно. Но всё-равно не будет чёткого видения, где же тут кончился оператор и начался блок внутри оператора.

Подозреваю, что вылезут и ещё какие-то проблемы, но сходу пока больше не придумал.

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

Что такое: (двойное двоеточие) в Python при индексации последовательностей?

Я знаю, что я могу использовать что-то вроде string[3:4] чтобы получить подстроку в Python, но что означает 3 в somesequence[::3] ?

9 ответов:

Это означает «ничего для первого аргумента, ничего для второго, и прыгать на три». Он получает каждый третий элемент последовательности нарезанный. дополнительные слайсы это то, что вы хотите. Новое в Python 2.3

адреса фрагментов последовательности Python могут быть записаны как[start:end: step], и любой из start, stop или end может быть удален. a[::3] каждый третий элемент последовательности.

seq[::n] — это последовательность каждого n -й пункт во всей последовательности.

пример:

синтаксис:

так что вы можете сделать:

объяснение

s[i:j:k] есть согласно документации, «отрезок s от i до j с шагом k». Когда i и j отсутствуют, вся последовательность предполагается и таким образом s[::k] означает «каждый K-й элемент».

примеры

во-первых, давайте инициализируем список:

давайте возьмем каждые 3 rd элемент из s :

давайте возьмем каждые 3 rd пункт от s[2:] :

давайте возьмем каждые 3 rd элемент из s[5:12] :

давайте возьмем каждые 3 rd элемент из s[:10] :

TL; DR

этот визуальный пример покажет вам, как аккуратно выбирать элементы в Матрице NumPy (2-мерный массив) довольно интересным способом (я обещаю). Шаг 2 ниже иллюстрирует использование этого «двойного двоеточия» :: в вопрос.

(внимание: это конкретный пример массива NumPy с целью иллюстрации случая использования «двойных двоеточий» :: для прыжков элементов в нескольких осях. Этот пример не охватывает родной язык Структуры данных Python, такие как List ).

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

скажем, у нас есть матрица NumPy, которая выглядит так:

скажем, по какой-то причине ваш босс хочет, чтобы вы выбрали следующие элементы:

enter image description here

«Но Как. «. Читайте дальше! (Мы можем сделать это в 2 этапа)

Шаг 1 — Получить подмножество

укажите «начальный индекс» и «конечный индекс» в как по строкам, так и по столбцам.

enter image description here

в коде:

обратите внимание, что мы только что получили наше подмножество, с использованием простой техники индексирования начала и конца. Далее, как это сделать «прыжки». (читайте дальше!)

Шаг 2-Выберите элементы (с аргументом» шаг перехода»)

теперь мы можем указать «шаги перехода» в обоих направлениях по строкам и столбцам (для выбора элементов в » прыжке» путь) вот так:

enter image description here

в коде (обратите внимание на двойное двоеточие):

мы только что выбрали все элементы по мере необходимости! 🙂

консолидация Шаг 1 (начало и конец) и Шаг 2 («прыжки»)

теперь мы знаем концепцию, мы можем легко объединить Шаг 1 и Шаг 2 в один консолидированный шаг-для компактности:

готово!

при нарезке в Python третьим параметром является шаг. Как уже упоминалось, см. Дополнительные Слайсы для хорошего обзора.

С этим знанием, [::3] просто означает, что вы не указали никаких начальных или конечных индексов для вашего среза. Так как вы указали шаг, 3 , это займет каждую третью запись something начиная с первого индекса. Например:

третий параметр-это шаг. Так [::3] будет возвращать каждый 3-й элемент списка/строка.

Python использует :: для разделения конца, начала и значения шага.

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

затем мы можем открыть объекты среза как:

Это особенно используется в Numpy для нарезки многомерных массивов в любом направлении.

конечно, любой здравомыслящий API должен использовать ::3 С обычной семантикой» каждые 3″.

Добавить комментарий

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