как умножить все числа в последовательности (питон)
Как если бы я сказал программе n=10 , как бы я сделал ее return 10*9*8*7*6*5. 1 ? Я думал, что цикл while, но я чувствую, что я где-то перепутался, потому что он не суммирует все числа в последовательности. Мой текущий код выглядит следующим образом
def product(n): i=n a=n-1 while a>0: return i * a b=i * a a=a-1 i=i-1
Есть ли лучшие способы сделать это, не используя рекурсию? Извините за невероятно начинающий вопрос, но я пытаюсь научить себя тому, как кодировать. Вы должны начать где-нибудь! Спасибо!
Когда вы return вы не позволяете ни одному из остального кода цикла работать, и вы делаете цикл только один раз.
Итак, размещение возвращаемого значения вне цикла должно решить эту проблему? Я запутался в том, как цикл while должен умножать все числа. Как я чувствую с моим текущим кодом, каждый раз, когда он зацикливается, происходит сброс значения, если это имеет смысл.
Вы можете использовать « reduce если хотите, но если цель состоит в том, чтобы учиться, это, вероятно, не так хорошо. reduce(range(1, n+1), lambda a, b: a*b) или math.factorial
@BillyThompson Когда вы нажимаете return , вы выходите из текущей функции, поэтому, если вы хотите, чтобы ваш цикл повторялся более одного раза, возврат должен быть вне цикла. Вы захотите это после цикла после того, как вся работа будет выполнена, чтобы вы могли использовать его для возврата значения.
@PlatinumAzure — нет ничего плохого в том, чтобы узнать об reduce , хотя ваши аргументы меняются местами, функция идет первой, а последовательность — второй. Это позволяет легко объединить reduce и лямбду в функцию, которая просто принимает последовательности, используя functools.partial , например product_of = partial(reduce, lambda a,b: a*b) что облегчает написание print product_of(range(1,10+1)) .
Ба. Извините, с тех пор, как я использовал «уменьшить», прошло много времени, но теперь я знаю, что вы правы
8 ответов
Поскольку вы пытаетесь научиться коду, я не дам вам полного решения, но Я дам вам несколько советов:
- У вас есть цикл for , который работает от 1 до n (используя range(1, n+1) ) вместо вашего while -loop. Это приведет к генерированию значений, которые вы хотите размножить, и повторите правильное количество раз (что иногда может быть немного сложным с циклами while ).
- Имейте переменную с именем product для хранения результата умножений каждый раз через цикл.
- Инициализируйте product , прежде чем вводить for -loop. Внутри вы будете просто обновлять значение product .
- После того, как вы закончите цикл, вы можете использовать оператор return , чтобы вернуть значение product .
- Наконец, для тестирования вы можете начать с небольшого значения n , например 4, и распечатать значения, которые вы вычисляете внутри цикла, чтобы проверить, как работает ваш код.
Есть более тонкие и питонические способы сделать это, но это использует структуру кода, которую вы уже настроили. И, конечно, рекурсивно, а также вы также упоминаете.
Как только вы освоите основы, вы оцените более идиоматические способы написания этого документа или вызовите соответствующие функции, которые сделают это для вас.
@BillyThompson хорошо .. дайте мне знать, если у вас есть какие-либо вопросы / как они идут, я думаю, что это более полезно в долгосрочной перспективе, чем наблюдение за тем, как вызывать функции, или получение уже написанного решения.
Хорошо, сделаем 🙂 Точно, я хочу быть в состоянии понять метод, стоящий за безумием, прежде чем перемещать вызывающие функции.
Ну, вот еще один подход к Питону.
>>> import operator >>> numbers = range(1, 11) >>> numbers [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> reduce(operator.mul, numbers) 3628800
Да, но как это помогает OP учиться программировать? ОП заявляет: «Я пытаюсь научиться кодировать». Это показывает, как вызывать функции .
Переполнение стека не только для OP, но и для людей, которые попадают сюда, например, из поиска Google.
Я согласен с вами, так не только для OP, но этот вопрос. Основываясь на сообщениях ОП, я сомневаюсь, что reduce() т. Д. Поможет ОП. Я думаю, что каждый пытается помочь по-своему.
Предполагая, что вы имеете в виду факториальную функцию, вы можете просто использовать math.factorial() :
>>> import math >>> math.factorial(10) 3628800
Мой ответ включал math.factorial а также попытку показать ему, как реализовать это самостоятельно :-p
@ Левон Извините, я не согласен. Я считаю, что «как вызывать правильные функции», а не реализовывать все с нуля, также является важной частью обучения программированию. Научиться делать такие суждения еще важнее. Кроме того, ОП четко спросил, есть ли более простой способ сделать это «без рекурсии», и есть. Учитывая эти причины, я не понимаю, как мой ответ заслуживает отрицательного ответа.
Я не опустил ни одного ответа здесь . просто потому, что я делаю комментарии, это не значит . поэтому, пожалуйста, не спешите с выводами. Возможно, другие найдут ваш подход бесполезным? По крайней мере, еще один человек должен. И вы не помогаете OP учиться программировать, а используете продукт других программистов.
@Levon Извините за то, что отрицательный голос был от вас. Я не пытаюсь здесь поспорить, но вы не думаете, что изучение того, как использовать продукт других программистов, это также «обучение программированию»? Даже сам Python является «продуктом» других программистов. Если вы не говорите строго об алгоритмах обучения.
Конечно, хорошо (и разумно) использовать функции (повторное использование кода и все), но если вы только начинаете учиться программировать (как OP), вам следует изучить основы. Честно говоря, нельзя думать, что OP лучше разбирается в программировании после вызова факториальной функции. Да, у ОП будет решение, но не большего понимания, чем раньше. ОП заявляет о своем желании учиться. Давайте согласимся не соглашаться (и на моей стороне нет плохих чувств или желания спорить).
@ Левон Полагаю, принципиальная разница в вашем мнении о том, чему должен научиться новичок. Я просто считаю, что они должны научиться как правильно делать вещи, и алгоритм, стоящий за этим. Поэтому я приветствую ваше решение и время, и я хотел бы, чтобы это обсуждение закончилось здесь 🙂
Вы пытаетесь найти факториал числа n, по существу. Для нахождения факториала числа существует 2 метода
Как новый программист, вам будет лучше с простой структурой цикла, которая работает от 1 до n и помещает умноженное значение на каждой итерации в переменную. Эта переменная — ваш ответ. Но также знайте, что рекурсия также будет работать и сделать код более элегантным. Счастливое программирование!
Методы и способы вычисления произведения элементов списка в Python
Списки — это основная структура данных в Python, и они встречаются практически в каждом проекте. В этой статье мы рассмотрим, как вычислить произведение всех элементов списка в Python.
Простой подход: использование цикла for
Наиболее простым и понятным способом вычисления произведения всех элементов списка является использование цикла for . Вот базовый код для этого:
my_list = [1, 2, 3, 4, 5] product = 1 for num in my_list: product *= num print(product) #120
Использование функции reduce из модуля functools
Модуль functools в Python содержит функцию reduce() , которая позволяет применить функцию к каждому элементу списка таким образом, чтобы получить одно единственное значение. В нашем случае мы можем использовать reduce() для вычисления произведения всех элементов списка:
from functools import reduce import operator my_list = [1, 2, 3, 4, 5] product = reduce(operator.mul, my_list) print(product) #120
Обратите внимание, что мы используем operator.mul в качестве функции для reduce() . Эта функция выполняет операцию умножения.
Использование библиотеки NumPy
Если вы работаете с числовыми данными, возможно, вы уже знакомы с библиотекой NumPy . Эта библиотека предоставляет множество функций для работы с числовыми данными, включая функцию prod() , которая вычисляет произведение элементов массива:
import numpy as np my_list = [1, 2, 3, 4, 5] product = np.prod(my_list) print(product) #120
Заключение
Вычисление произведения элементов списка является общей задачей в Python. Мы рассмотрели несколько различных подходов, включая использование цикла for , функции reduce() из модуля functools и функции prod() из библиотеки NumPy . Каждый из этих подходов имеет свои собственные преимущества и может быть наиболее подходящим в зависимости от конкретной ситуации.
Стоит также помнить о важности обработки исключений при работе с числовыми данными. В Python предусмотрено множество различных исключений, которые могут возникнуть при выполнении математических операций, и правильная их обработка позволяет избежать ошибок и неожиданного поведения программы.
Наконец, хотя этот материал фокусировался на вычислении произведения элементов списка, принципы и методы, которые мы здесь обсудили, могут быть применены и к другим агрегатным операциям. Например, вы могли бы использовать похожий подход для вычисления суммы, минимума или максимума элементов списка.
XOR в Python: что это и как использовать
Понимание и использование асинхронных функций в Python
Оператор del в Python: основы и примеры использования
Практические примеры использования индексов в списках Python
Работа с вложенными списками в Python
Получаем доступ к документации с помощью функции help() в Python
Как перемножить числа в списке?
Раньше можно было использвать reduce(). Сейчас тоже можно, но эту функцию вынесли в отдельный модуль, так что строго говоря, считая импорт, получается две строчки:
import functools print (functools.reduce(lambda a, b : a * b, lst))
import numpy as np result = np.prod(np.array(mylist))
from functools import reduce # Функция для свёрки последовательности from operator import mul # Функция, перемножающая 2 числа spisok = [16, 15, 9, 14, 13] # Исходный список result = reduce(mul, spisok) # /\ Список для свёртки # /\ Используем умножение # /\ Сворачиваем контейнер
let num = Number(prompt()) let lis = [] let mult = [] while (num) < num = Number(prompt()) lis.append(num) >var m = 1 for (let n = 0; n
Все ответы здесь отстали от современности. Как насчет python-3.8 и выше?
import math math.prod([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
Это пожалуй самое простое и стандартное решение ИМХО.
d = [1, 2, 3, 4, 5] print(eval(str(d)[1:-1].replace(',', '*')))
Если очень захотеть, то можно и в одну строчку записать, но так конечно делать не стоит , например перемножить ‘2 3 4 5’ = 120
print(list(map(lambda s, t=[1]: [t.append(i*t[-1]) for i in map(int, s.split())][0] or t[-1], ['2 3 4 5']))[0]) # 120
Я приведу не очень практичное но красивое решение в одну строку. Оно не использует eval , побочные эффекты при работе со списком или именованные функции.
Если именованные функции разрешены, то решение может выглядеть так:
def p(a): if a: return a[0] * p(a[1:]) return 1 print(p([1, 2, 3, 4, 5]))
Нам оно не подходит, так именованная функция требует минимум две строки для определения и вызова. Лямбду можно определить и вызвать в одной строке, но есть трудность в создании рекурсивной лямбды. Синтаксис Python разрешает такой трюк:
p = (lambda a: a[0] * p(a[1:]) if a else 1); print(p([1, 2, 3, 4, 5]))
Это именно трюк с глобальной переменной и двумя операторами в одной строке. А можно обойтись без глобальной переменной вообще. На первый взгляд этого не может быть так как имя нужно чтобы сделать рекурсивный вызов. Но функцию можно передать как аргумент в саму себя:
p = lambda f, a: a[0] * f(f, a[1:]) if a else 1 print(p(p, [1, 2, 3, 4, 5]))
Кажется мы ничего не выиграли: всё равно два оператора и глобальная переменная p . Однако сделан очень важный шаг — тело лямбды не использует глобальные переменные. Глобальная переменная используется в операторе print . Избавимся от неё:
p = lambda f, a: a[0] * f(f, a[1:]) if a else 1 y = lambda f, a: f(f, a) print(y(p, [1, 2, 3, 4, 5]))
Стало только хуже: три строки и две глобальные переменные. Зато каждая глобальная переменная задействована только один раз. Делаем подстановку:
print((lambda f, a: f(f, a))(lambda f, a: a[0] * f(f, a[1:]) if a else 1, [1, 2, 3, 4, 5]))
Читается тяжело, но задача решена в одну строку без глобальных имён и волшебных вызовов eval .
P.S. Читайте Fixed-point combinator чтобы узнать откуда пошло это решение.
P.P.S. И есть очаровательное утверждение: программу любой сложность можно записать в функциональном стиле не определив ни одной глобальной переменной, включая имена функций.
P.P.P.S. Не пытайтесь повторить это дома.