Синтаксис и возможности цикла for Python
Циклы python — for и while представляют собой операторы языка программирования, то есть операторы итерации, которые позволяют повторять код определенное количество раз.
Синтаксис цикла For
Как уже упоминалось ранее, цикл for в Python является итератором, основанным на цикле. Он проходит по элементам list и tuple, строкам, ключам словаря и другим итерируемым объектам.
В Python цикл начинается с ключевого слова for , за которым следует произвольное имя переменной, которое будет хранить значения следующего объекта последовательности. Общий синтаксис for. in в python выглядит следующим образом:
Элементы «последовательности» перебираются один за другим «переменной» цикла; если быть точным, переменная указывает на элементы. Для каждого элемента выполняется «действие».
Пример простого цикла for в Python:
>>> languages = ["C", "C++", "Perl", "Python"] >>> for x in languages: . print(x) . C C++ Perl Python >>>Блок else является особенным; в то время как программист, работающий на Perl знаком с ним, это неизвестная конструкция для программистов, которые работают на C и C++. Семантически он работает точно так же, как и в цикле while .
Он будет выполнен только в том случае, если цикл не был «остановлен» оператором break . Таким образом, он будет выполнен только после того, как все элементы последовательности будут пройдены.
Оператор прерывания в python — break
Если в программе цикл for должен быть прерван оператором break , цикл будет завершен, и поток программы будет продолжен без выполнения действий из else .
Обычно фразы break в pyton связаны с условными операторами.
edibles = ["отбивные", "пельмени", "яйца", "орехи"] for food in edibles: if food == "пельмени": print("Я не ем пельмени!") break print("Отлично, вкусные " + food) else: print("Хорошо, что не было пельменей!") print("Ужин окончен.")Если мы запустим этот код, получим следующий результат:
Отлично, вкусные отбивные Я не ем пельмени! Ужин окончен.
Удалим «пельмени» из нашего списка еды и получим следующее:
Отлично, вкусные отбивные Отлично, вкусные яйца Отлично, вкусные орехи Хорошо, что не было пельменей! Ужин окончен.
Оператор пропуска python — continue
Предположим, нам «пельмени» нам нужно просто пропустить и продолжить прием пищи. Тогда нужно использовать оператор continue , для перехода к следующему элементу.
В следующем маленьком скрипте python мы используем continue , чтобы продолжить, итерацию по списку, когда мы сталкиваемся с пельменями.
edibles = ["отбивные", "пельмени", "яйца", "орехи"] for food in edibles: if food == "пельмени": print("Я не ем пельмени!") continue print("Отлично, вкусные " + food) else: print("Ненавижу пельмени!") print("Ужин окончен.")Результат будет следующим:
Отлично, вкусные отбивные Я не ем пельмени! Отлично, вкусные яйца Отлично, вкусные орехи Ненавижу пельмени! Ужин окончен.
Итерация по спискам с функцией range()
Если вам нужно получить доступ к индексам списка, не очевидно как использовать цикл for для этой задачи. Мы можем получить доступ ко всем элементам, но индекс элемента остается недоступным. Есть способ получить доступ как к индексу элемента, так и к самому элементу. Для этого используйте функцию range() в сочетании с функцией длины len() :
Как вывести элементы списка по убыванию
У меня есть код. Генерируется 6 чисел, дальше они сортируются по убыванию. В этом коде есть цикл (самый последний), в этом цикле должны выводиться максимумы. Т.е., должен находиться первый максимум (самая большая цифра) и выводиться, дальше второй - и выводиться, третий и.т.д. Проблема в том, что цикл не работает так, как это мне нужно. Что можно с этим сделать? Помогите, пожалуйста.
import random spisok = [] for i in range(0,5): spisok.append(random.randint(1,3)) maxi = max(spisok) a = sorted(spisok, reverse=True) print('Сгенерированы такие числа: ') print(a) print('В порядке убывания: ') print(a) for i in range(spisok[i-1]): for j in range(spisok[i+1]): if spisok[i] == spisok[j]: print(' максимум: '.format(maxim = spisok[i], cout = i)) continue
Не нужно двух вложенных циклов. У вас список отсортирован по убыванию - значит первым идет первый максимум, потом второй максимум, и т.д. Нужно просто последовательно пройти по списку. И сгенерированные числа имеет смысл выводить до сортировки, а то два раза одно и то же выводится.
2 ответа 2
for num, i in enumerate(a, 1): print(' максимум: '.format(maxim = max(a), cout = num)) a.remove(max(a))
Сгенерированы такие числа: [3, 3, 2, 1, 1] В порядке убывания: [3, 3, 2, 1, 1] 1 максимум: 3 2 максимум: 3 3 максимум: 2
Если нужно все одинаковые цифры убирать, то добавляем еще такой цикл
for num, i in enumerate(a, 1): print(' максимум: '.format(maxim = max(a), cout = num)) m = max(a) while m in a: a.remove(m)
[3, 3, 2, 1, 1] 1 максимум: 3 2 максимум: 2 # - не считает вторую тройку еще раз
Первая часть это генерация и сортировка:
import random nums = [random.randint(1, 3) for i in range(5)] print('Сгенерированы такие числа: ') print(nums) sorted_nums = sorted(nums, reverse=True) print('В порядке убывания: ') print(sorted_nums)
1. Через groupby . Метод groupby сгруппирует подряд идущие элементы в последовательности:
from itertools import groupby . for i, (num, _) in enumerate(groupby(sorted_nums), 1): print(' максимум: '.format(i=i, maxim=num))
2. Через цикл. Первый элемент выводим и запоминаем, а в цикле начинаем со второго элемента с проверкой предыдущего:
i = 1 last_num = sorted_nums[0] print(' максимум: '.format(i=i, maxim=last_num)) for j in range(1, len(sorted_nums)): num = sorted_nums[j] if num != last_num: i += 1 print(' максимум: '.format(i=i, maxim=num)) last_num = num
3. Через множество. Это множество удалит дубликаты, но потребуется создание новой коллекции, поэтому может быть затратным:
sorted_nums = sorted(set(sorted_nums), reverse=True) for i, num in enumerate(sorted_nums, 1): print(' максимум: '.format(i=i, maxim=num))
Конечно, тут лучше всего nums в множество помещать, т.е. не делать лишней предварительной сортировки:
nums = [random.randint(1, 3) for i in range(5)] . sorted_nums = sorted(set(nums), reverse=True)