Вопрос Напишите пожалуйста скрипт на языке python 3

Регистрация
8 Сен 2013
Сообщения
73
Репутация
0
Спасибо
0
Монет
0
написать скрипт, который содержит генератор списка нечетных чисел от 1 до 100. С комментариями
 
# создаем функцию-генератор
def odd_numbers():
# итерируемся по числам от 1 до 100
for num in range(1, 101):
# проверяем, является ли число нечетным
if num % 2 != 0:
# если да, то возвращаем его в качестве результата
yield num

# создаем список из нечетных чисел, используя нашу функцию-генератор
odd_nums_list = list(odd_numbers())

# выводим результат
print(odd_nums_list)
Комментарии к коду:

Сначала мы создаем функцию-генератор с именем odd_numbers().
Затем мы используем оператор for для итерации по числам от 1 до 100.
Внутри цикла мы проверяем, является ли текущее число нечетным, используя оператор % (остаток от деления).
Если число нечетное, мы используем оператор yield для возврата его в качестве результата функции-генератора.
В основном блоке кода мы вызываем функцию-генератор и преобразуем результат в список, используя встроенную функцию list().
Затем мы выводим список нечетных чисел на экран с помощью функции print().
 
# Создаем пустой список
odd_numbers = []

# Используем цикл для генерации нечетных чисел от 1 до 100 и добавления их в список. А двойка отвечает за то что каждый второй элемень будет пропущен)
for i in range(1, 101, 2):
odd_numbers.append(i)

# Печатаем список
print(odd_numbers)
 
Прямо генератор нужен, или это просто для красного словца, а на самом деле - обычный школьный цикл?
С генератором это выглядит так: def oddgen(maxn):
for n in range(1, (maxn + 1) | 1, 2): yield n

# использовать так:
for k in oddgen(100): print(k)
# или так:
print(*oddgen(100), sep = '\n') Можно генератор записать проще: def oddgen(maxn): return range(1, (maxn + 1) | 1, 2) Или даже так: oddgen = lambda maxn: range(1, (maxn + 1) | 1, 2)
Пояснения: (maxn + 1) | 1 - это вычисление ближайшего нечётного числа, большего maxn
(нужно как верхняя граница цикла)
range(start, end, step) - генератор чисел, начиная со start, не доходя до end, и с шагом step
(для нечётных чисел, естественным образом, используем шаг 2) Первый вариант функции в цикле обходит всё множество нечётных чисел и возвращает их в возрастающем порядке. Но поскольку это - то же самое, что делает range с нужными параметрами, второй вариант просто возвращает генератор, созданный range. Третий вариант делает то же самое, что и второй.

И естественно, можно указать в месте использования непосредственно range, без промежуточных функций: # использовать так:
for k in range(1, (maxn + 1) | 1, 2): print(k)
# или так:
print(*range(1, (maxn + 1) | 1, 2), sep = '\n')
И пара комментариев на тему решений, приведённых ниже:
1) Три из четырёх решений бегают по всему диапазону чисел, хотя заведомо нужно только каждое второе. Вместо того, чтобы передать шаг в range, они крутят лишние итерации. Так делать не надо.
2) Два из четырёх решений материализуют список, в который складывают все сгенерированные значения, хотя, единственное, что с ними надо сделать - это напечатать, а хранить их не требуется. Так делать тоже не надо, память - не резиновая.

Казалось бы, это мелочи, что там - лишние 50 чисел пробежать или лишние 49 сохранить, но из таких мелочей потом вырастают быдлосайты, у которых открываешь первую страничку - и броузер уже весит в памяти полгига и жёстко тупит. Он выполняет миллионы лишних вычислений и хранит сотни мегабайт лишних данных, потому что так реализованы ПТУшниками алгоритмы на этом сайте.
 
a = [i for i in range(1,100) if not i % 2 == 0] #если нужен именно ГЕНЕРАТОР

for i in range(1,100): #если нужен просто ЦИКЛ
if not i % 2 == 0:
print(i)
 
# Создаем функцию-генератор
def odd_numbers():
# Используем цикл for для перебора чисел от 1 до 100
for i in range(1, 101):
# Проверяем, является ли число нечетным
if i % 2 != 0:
# Если число нечетное, то возвращаем его
yield i

# Создаем объект-генератор
numbers = odd_numbers()

# Используем цикл for для вывода всех нечетных чисел от 1 до 100
for number in numbers:
print(number)
 
Назад
Сверху