№15 цикл for / уроки по python для начинающих

Содержание

На сегодняшний день Python является одним из самых популярных языков программирования. Это интерпретируемый высокоуровневый язык с элегантным и легко читаемым синтаксисом. Но Python, как правило, значительно медленнее, чем Java, C#, особенно C и C++, а также Fortran. И иногда вопросы производительности могут сильно влиять на возможность полноценно использовать приложения.

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

И наконец, всегда есть возможность написать функции Python на C, C++ или Cython и вызывать их потом из Python-приложения, ликвидировав таким образом узкие места в программе. Но это уже крайняя мера, и на практике так делать приходится редко.

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

В нашей статье мы будет сравнивать производительность различных способов поэлементного суммирования двух последовательностей. А именно:

  • с использованием цикла ;
  • с использованием цикла ;
  • с использованием представления списков;
  • с использованием библиотеки NumPy;

Но производительность это не главное при разработке программного обеспечения. Более того, как сказал Дональд Кнут в своей книге «Искусство программирования»: «Поспешная оптимизация — это корень всех (или почти всех) зол в программировании.» В конечном итоге, «важна читаемость (readability counts)». Это сказано в «Дзен Python» Тима Питерса.

Python while Loop

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

Python во цикла имеет следующий вид:

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

оценивается перед выполнением операторов. Если условие , выполняется . В противном случае, если условие оценивается как , цикл завершается, и управление программой передается следующей инструкции.

Давайте посмотрим на следующий пример кода, который увеличивает и печатает текущее значение переменной если оно меньше пяти:

Цикл вторника повторяется, пока меньше или равно пяти. Он выдаст следующий результат:

Python поддерживает стандартные операции сравнения:

  • — Истинно, если и равны.
  • — Верно, если и не равны.
  • — Истинно, если больше .
  • — Истинно, если равно или больше .
  • — Истинно, если меньше .
  • — Истинно, если равно или меньше .

Чтобы отрицать условное выражение, используйте логический оператор :

Бесконечный цикл while

Если условие, заданное в цикле while, никогда не становится ложным, цикл while никогда не завершается и превращается в бесконечный цикл while.

Любое ненулевое значение в цикле while указывает на условие “всегда истинное”, тогда как ноль указывает на условие “всегда ложное”. Такой подход полезен, если мы хотим, чтобы наша программа непрерывно работала в цикле без каких-либо помех.

Пример 1:

while(1):  
    print("Hi! we are inside the infinite while loop")

Выход:

Hi! we are inside the infinite while loop
Hi! we are inside the infinite while loop

Пример 2:

var = 1  
while(var != 2):  
    i = int(input("Enter the number:"))  
    print("Entered value is %d"%(i))  

Выход:

Enter the number:10
Entered value is 10
Enter the number:10
Entered value is 10
Enter the number:10
Entered value is 10
Infinite time

Оператор цикла while

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

while выражение:
    инструкция_1
    инструкция_2
    ...
    инструкция_n

Выполняемый набор инструкций называется телом цикла.

Пример.

a = 
while a < 7:
   print("A")
   a += 1

Буква “А” будет выведена семь раз в столбик.

Пример бесконечного цикла.

a = 
while a == :
   print("A")

Операторы break и continue

При работе с циклами используются операторы break  и continue.

Оператор break  предназначен для досрочного прерывания работы цикла while.

Пример.

a = 
while a >= :
   if a == 7:
       break
   a += 1
   print("A")

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

Оператор continue  запускает цикл заново, при этом код, расположенный после данного оператора, не выполняется.

Пример.

a = -1
while a < 10:
   a += 1
   if a >= 7:
       continue
   print("A")

При запуске данного кода символ “А” будет напечатан 7 раз, несмотря на то, что всего будет выполнено 11 проходов цикла.

else

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

указанный в  пункте, будет выполняться , когда прервётся цикл  .

Сейчас вы можете подумать: «Как это полезно?». Вы можете сделать то же самое, поместив эти операторы сразу после  цикла, без :

Какая разница?

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

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

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

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

Этот цикл преждевременно завершается с помощью , поэтому  не выполняется.

Может показаться, что значение слова  не совсем соответствует  циклу, а также  выражению. Гвидо ван Россум (Guido van Rossum) , создатель Python, на самом деле сказал, что, если бы ему пришлось повторить, он бы исключил цикла    из языка.

Одна из следующих интерпретаций может помочь сделать ее более интуитивной:

Думайте о заголовке цикла (while n > 0) как об if операторе (if n > 0), который выполняется снова и снова, и else выполняется, когда условие становится false.

Если вы не найдете ни одну из этих интерпретаций полезной, не стесняйтесь игнорировать их.

Когда может быть полезным  в цикле? Одна распространенная ситуация, если вы ищете в списке определенный элемент. Вы можете использовать  для выхода из цикла, если элемент найден, и  может содержать код, который должен быть выполнен, если элемент не найден:

Прежде всего, списки обычно обрабатываются с определенной итерацией, а не  циклом. Определенная итерация (for) рассматривается в следующем блоке.

Во-вторых, Python предоставляет встроенные способы поиска элемента в списке. Вы можете использовать  оператор:

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

Вы узнаете об обработке исключений позже.

Цикл «for»

Цикл for в Python 3 выполняет написанный код повторно согласно введенной переменной или счетчику. Он используется только тогда, когда необходимо совершить перебор элементов заранее известное число раз. Что это значит? У нас имеется список, сначала из него берется первый элемент, потом – второй и так далее, но с каждым из них совершается действие, которое указано в теле for. Примерно это выглядит так:

for  in :
    

For может содержать данные разных типов: цифры, слова и пр. Рассмотрим пример:

for i in 10, 14, 'первый', 'второй':
    print(i)

На экране после запуска появится такая запись:

10
14
первый
второй

Для упрощения часто используется функция range(), или диапазон. В циклах она указывает на необходимое количество повторов последовательности, уточняя, какие именно элементы из списка for, нам необходимы в данный момент. В скобках может быть указано от одного до трех чисел:

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

Рассмотрим пример. Теоретически вы можете записать так:

for i in :
    print(i)

Но это слишком затратно, особенно если чисел слишком много, поэтому лучше сделать так, используя указанный выше range():

for i in range(14,18):
    print(i)

И в первом, и во втором случае на экране появится такая последовательность:

14
15
16
17

Цикл for: синтаксис

Как вы уже поняли, в питоне существует несколько типов циклов, один из них – это for. Цикл for часто используется для перебора значений внутри структурной переменной. Это позволяет обращаться сразу к элементу, а не к его индексу или ключу (предполагается, что читатель уже знает о списках и словарях).

Синтаксис конструкции for в python выглядит следующим образом:

for i in variable:

#some code

Разберем каждую команду отдельно.

For – это ключевое слово, которое говорит интерпретатору, что ниже будет цикл. i – это переменная, в которую будут помещаться временные значения для перебора. in – это еще одно ключевое слово, которое говорит интерпретатору, из какой переменной брать значения для i.

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

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

Наглядное обозначение синтасиса

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

На языке python это будет выглядеть следующим образом:

Результат выполнения программы вы можете увидеть на скриншоте ниже


Результат выполнения программы

Использование функций range() и enumerate()

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

Рассмотрим пример:

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

Она, в отличие от range, принимает в качестве аргумента список, а после возвращает список кортежей, где каждый кортеж состоит из двух значений: индекс элемента и его значение.

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

Реализация:


Результат программы ожидаем.

Вложенный цикл

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

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

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

Пример вложенности:


На каждый уровень блока – отдельный отступ

Цикл «while»

While с английского языка переводится, как «до тех пор, как». Это достаточно универсальный цикл, он немного похож на условие if, но его код выполняется не один раз. Его условие записывается до тела цикла. После того, как оно выполнено первый раз, программа возвращается к заголовку и снова повторяет все действия. Этот процесс заканчивается тогда, когда условие цикла больше не может быть соблюдено, иными словами перестает быть истинным. Тем, что заранее неизвестно количество проверок, он отличается от предыдущего цикла for. Кстати, еще его называют циклом с предусловием.

Запись цикла while в Python выглядит так:

while :
    

Приведем пример использования этого цикла:

count = 0
while count < 6:
    print(count)
    count += 2

Здесь переменной присваивается значение 0, после чего начинается цикл, в котором проверяется условие, чтобы число было меньше 6. В теле цикла также содержится две инструкции: первая выводит само число на экран, а вторая увеличивает его значение на два. Цикл, таким образом, выполняется, пока условие продолжает быть истинным. На экране перед вами появится следующая последовательность чисел:

0
2
4

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

Обычно в ней есть смысл, только если указана инструкция break, но программа работает и без последней. Посмотрим на код:

count = 3
while count < 7:
    print count, " меньше 7"
    count = count + 1
else:
    print count, " не меньше 7"

Переменная – 3, задается условие, что пока она меньше 7, нужно выводить ее и выражение «меньше 7», затем прибавлять к ней 1. В тех случаях, когда она уже становится равной 7, то в ход пойдет условие, указанное в else, и на экране появится, что переменная не меньше 7. В результате выполнения этого кода мы увидим:

3 меньше 7
4 меньше 7
5 меньше 7
6 меньше 7
7 не меньше 7

Условный оператор else

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

while :
    <statement(s)>
else:
    <additional_statement(s)>

, указанный в условии , будет выполняться , когда прервётся цикл .

У вас может возникнуть вопрос: «Чем это полезно?».

while <expr>:
    <statement(s)>
<additional_statement(s)>

Какая разница?

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

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

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

n = 5
while n > 0:
    n -= 1
    print(n)
else:
    print('Цикл выполнен.')

В этом случае цикл повторялся до тех пор, пока условие не стало false: n стало 0, а условие n > 0 стало ложным. Поскольку цикл прожил свою естественную жизнь, так сказать, условие было выполнено

Теперь обратите внимание на разницу здесь:

n = 5
while n > 0:
    n -= 1
    print(n)
    if n == 2:
        break
else:
    print('Цикл выполнен.')

Этот цикл преждевременно завершается с помощью , поэтому не выполняется.

Какая-нибудь из следующих интерпретаций может помочь сделать ее более понятной:

  • Думайте о заголовке цикла (while n > 0) как об if операторе (if n > 0), который выполняется снова и снова, и выполняется, когда условие становится false.
  • Думайте об , как если бы это был nobreak, поскольку следующий блок выполняется, если не был .

Если вы не найдете ни одну из этих интерпретаций полезной, просто проигнорируйте их.

Когда может быть полезным в цикле ? Одна распространенная ситуация, если вы ищете в списке определенный элемент. Вы можете использовать для выхода из цикла, если элемент найден, и может содержать код, который должен быть выполнен, если элемент не найден:

a = 
s = 'corge'

i = 0
while i < len(a):
    if a == s:
        # Processing for item found
        break
    i += 1
else:
    # Processing for item not found
    print(s, 'not found in list.')

Условие с циклом  — это немного странное, редко встречающееся явление. Но не избегайте его, в некоторых ситуациях может внести ясность в ваш код!

Выводы

В данной статье было произведено сравнение скорости работы циклов Python при поэлементном сложении списков или массивов. Результаты показывают, что представления списков работают быстрее обычных циклов , которые в свою очередь работают быстрее циклов . Простые циклы работают чуть-чуть быстрее вложенных (при одинаковом количестве элементов) во всех трех случаях.

Библиотека NumPy дает нам функции и операторы, которые существенно повышают скорость работы и сильно уменьшают количество кода в программе. Это особенно полезно при работе с одномерными и многомерными массивами.

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

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Мой редактор ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: