Мы не знаем что она возвращает. Мы знаем лишь, что она «иногда неправильно работает». Она может вернуть корректный ответ, может ничего не вернуть, может убить собаку пользователя или сделать ему минет. Иногда «undefined behavior» — это просто неопределенное поведение, а не ссылка на спецификации и википедию. Рад что таки смог донести свою мысль.
Вы — пользователь. Вам дали функцию — черный ящик. У вас есть набор гомогенных данных, соответствующих спецификации функции. Вы берете батч данных и отдаете функции — она возвращает корректный результат. Вы берете второй батч и отдаете функции — она возвращает не коррекный результат. Вы берете третий батч… Что вы будуте ожидать? Success? Error? Пока не выполните — не узнаете. Любой результат работы этого черного ящика будет не ожидаемым, так как вы просто не знаете чего ожидать :) «Иногда работает, иногда не работает» — это и есть неопределенное поведение. Если убрать слово «иногда», то да, она либо работает, либо нет — никакой неопределенности.
Я даже в гугл переводчик залез, чтоб удостовериться: «Undefined behavior» — «Неопределенное поведение». Если для различных входных данных соответствующих спецификации функции в одних случаях результат будет соответствовать ожидаемому, а в других — чушью, то является ли это «определенным поведением» или «неопределенным поведением» с точки зрения пользователя функции?
Уважаемый, просто найдите ближайшего человека, обучающего людей програмированию (программированию, а не навыкам владения конкретным языком) и спросите чем отличаются циклы «for», «foreach» и «while», и он вам все доступно обьяснит.
Что касается цикла с выходом по условию, то в питоне есть нужный инструмент и зовется он «while». И он достаточно красив для этого языка.
Я лишь хотел сказать, что что в питоне забавная версия обьединения двух разных по сути циклов с названием одного, а механикой другого. И говоря, что конструкцию вида «for i in range(len(seq)):» не стоит использовать, нужно уточнять, что это касается искличительно ситуаций итерирования обьекта. Для имитации же именно поведения «for» эта конструкция вполне легальна.
Строго говоря в питоне вообще нет «for» — есть только «foreach». И инкремента индекса (как и самого индекса) тоже нет — есть проход по списку, сгенерированому функцией range() или поданому явно.
С++ обычно не рассматривается в отрыве от С, так как является его надмножеством, а в С вполне есть старый добрый «for» без всяких последовательностей. В JS эти два цикла вообще вроде бы разделены друг от друга?
«for» — цикл с известным количеством итераций. Не больше и не меньше. В этом его назначение и смысл, всё остальное зависит от контекста его применения. Для итерации по последовательностям применяется «foreach» и его аналоги. Это разные циклы, с разной идеологией применения, и то что в питоне их обьединили в одно не ставит между ними знак равенства.
Автор статьи же затрагивает только «foreach» составляющую, что прямо противоречит названию и аннотации статьи и может ввести людей в заблуждение.
«Питонистический подход к циклам for: range() и enumerate()»
Автор заметки, перевод которой мы сегодня публикуем, хочет рассказать о некоторых особенностях использования циклов for в Python.
В самой статье же рассматривается только итерация по спискам, хотя это вообще не является прямой задачей цикла «for». Так что тут либо название статьи менять, либо раскрывать тему нормально, а то сейчас впечатлительные начитаются и будут везде писать что «for i in range(len(seq)):» порочно независимо от контекста.
ЗЫ: Не могу влепить статье дизлайк, буду благодарен, если кто-то сделает это за меня.
scores = [54,67,48,99,27]
for i in range(len(scores)):
print(i, scores[i])
Проблема этого цикла заключается в том, что он не очень хорошо соответствует идеологии Python. В нём мы не перебираем список, а, вместо этого, используем вспомогательную переменную i для обращения к элементам списка.
Я так и не понял в чем, собственно, проблема? Что если мне нужно организовать цикл на заданное количество шагов, не работая непосредственно со списком? Сколько раз читал про это, но нигде не увидел реально обоснованой причины так не делать. Заявления, что это «непитонично», звучат как пук в банку. Могли бы хоть сравнения замеров быстродействия выложить или детальный разбор механизмов работы.
Еще как сработает. Только надо чтоб кликал один доброволец заданное количество раз (200 раз, например). Также он не должен знать о последующей награде за это. По окончании действа выдаем ништяк (сникерс, например), чем подталкиваем детей к дальнейшей активности на занятиях (можно один сникерс в пару\через пару). Затем показываем и запускаем небольшой скрипт, делающий то же самое и показываем разницу во времени выполнения между человеком и машиной. Озвучиваем, на сколько быстрее и проще он мог получить свой приз. Дело сделано — дети знают что такое и зачем нужна автоматизация, ЯП и т.д. + мотивированы на активность.
Это и есть undefined behavior. В каком именно месте не знаю — любви к чтению и разбору говнокода не имею, опираюсь лишь на ваши слова.
Правильно сказали. Очень тяжело читать подобное, особенно если подобного много.
А вот и undefined behavior подьехал, здравствуйте однако.
Что касается цикла с выходом по условию, то в питоне есть нужный инструмент и зовется он «while». И он достаточно красив для этого языка.
С++ обычно не рассматривается в отрыве от С, так как является его надмножеством, а в С вполне есть старый добрый «for» без всяких последовательностей. В JS эти два цикла вообще вроде бы разделены друг от друга?
Автор статьи же затрагивает только «foreach» составляющую, что прямо противоречит названию и аннотации статьи и может ввести людей в заблуждение.
В самой статье же рассматривается только итерация по спискам, хотя это вообще не является прямой задачей цикла «for». Так что тут либо название статьи менять, либо раскрывать тему нормально, а то сейчас впечатлительные начитаются и будут везде писать что «for i in range(len(seq)):» порочно независимо от контекста.
ЗЫ: Не могу влепить статье дизлайк, буду благодарен, если кто-то сделает это за меня.
Я так и не понял в чем, собственно, проблема? Что если мне нужно организовать цикл на заданное количество шагов, не работая непосредственно со списком? Сколько раз читал про это, но нигде не увидел реально обоснованой причины так не делать. Заявления, что это «непитонично», звучат как пук в банку. Могли бы хоть сравнения замеров быстродействия выложить или детальный разбор механизмов работы.