গুণফলের জন্য যোগফলের মতো ফাংশনটি কী? পণ্য ()?


206

পাইথনের sum()ফাংশন একটি পুনরাবৃত্তীয় মধ্যে সংখ্যার যোগফল প্রদান করে।

sum([3,4,5]) == 3 + 4 + 5 == 12

আমি সেই ফাংশনটি সন্ধান করছি যা পরিবর্তে পণ্যটি ফেরত দেয়।

somelib.somefunc([3,4,5]) == 3 * 4 * 5 == 60

আমি নিশ্চিত যে এই জাতীয় কোনও ক্রিয়াকলাপ উপস্থিত রয়েছে তবে আমি এটি খুঁজে পাচ্ছি না।

উত্তর:


71

হালনাগাদ:

পাইথন ৩.৮-এ, গণিত মডিউলটিতে প্রোড ফাংশনটি যুক্ত করা হয়েছিল । দেখুন: গণিত.প্রড ()

পুরানো তথ্য: পাইথন ৩.7 এবং পূর্ববর্তী

আপনি যে ফাংশনটির সন্ধান করছেন তাকে প্রোড () বা পণ্য () বলা হবে তবে পাইথনের সেই ফাংশনটি নেই। সুতরাং, আপনার নিজের লিখতে হবে (যা সহজ)।

প্রোডমেটমেন্ট ()

হ্যা, তা ঠিক. গিডো একটি অন্তর্নির্মিত প্রোড () ফাংশনের জন্য ধারণাটি প্রত্যাখ্যান করেছিলেন কারণ তিনি ভেবেছিলেন এটির প্রয়োজন খুব কমই হয়েছিল।

হ্রাস সঙ্গে বিকল্প ()

আপনি প্রস্তাবিত হিসাবে, হ্রাস () এবং অপারেটর.মুল () ব্যবহার করে নিজের তৈরি করা শক্ত নয় :

from functools import reduce  # Required in Python 3
def prod(iterable):
    return reduce(operator.mul, iterable, 1)

>>> prod(range(1, 5))
24

দ্রষ্টব্য, পাইথন 3 এ, হ্রাস () ফাংশনটি ফান্টুলস মডিউলে স্থানান্তরিত করা হয়েছে ।

সুনির্দিষ্ট ক্ষেত্রে: কারখানাগুলি

পার্শ্ব নোট হিসাবে, প্রোড () এর প্রাথমিক প্রেরণাদায়ক ব্যবহারের ক্ষেত্রে ফ্যাকটোরিয়ালগুলি গণনা করা। গণিত মডিউলটিতে এর জন্য আমাদের ইতিমধ্যে সমর্থন রয়েছে :

>>> import math

>>> math.factorial(10)
3628800

লগারিদম সহ বিকল্প

যদি আপনার ডেটাতে ভাসমান থাকে তবে আপনি এক্সটেনশন এবং লগারিদমের সাথে যোগফল () ব্যবহার করে একটি পণ্য গণনা করতে পারেন :

>>> from math import log, exp

>>> data = [1.2, 1.5, 2.5, 0.9, 14.2, 3.8]
>>> exp(sum(map(log, data)))
218.53799999999993

>>> 1.2 * 1.5 * 2.5 * 0.9 * 14.2 * 3.8
218.53799999999998

দ্রষ্টব্য, লগ () এর ব্যবহারের জন্য সমস্ত ইনপুটগুলি ইতিবাচক হওয়া দরকার।


আপনি যুক্ত করতে চাইতে পারেন যে শেষ উদাহরণে ভাসমানদের ইতিবাচক হওয়া দরকার । অন্যথায়, আপনি cmath ব্যবহার করতে পারে, কিন্তু তারপরেও এটি সব ক্ষেত্রে সত্যই কার্যকর হবে না।
ভেকি

212

আসলে, গিডো এই ধারণাটি ভেটো করেছেন: http://bugs.python.org/issue1093

তবে, যে ইস্যুতে উল্লিখিত হয়েছে, আপনি খুব সহজেই এটিকে তৈরি করতে পারেন:

from functools import reduce # Valid in Python 2.6+, required in Python 3
import operator

reduce(operator.mul, (3, 4, 5), 1)

4
গুইডো: পণ্য (ফিল্টার (কোনও কিছুই নয়, [1,2,3, কিছুই নয়])) উদ্ধৃত করার জন্য যেখানে "এর প্রয়োজন" রয়েছে তার একটি দুর্দান্ত উদাহরণ এখানে। আশা করি এটি কোনও দিন অন্তর্ভুক্ত করা হবে।
the911s

13
গাইডোও কি সেই ছেলেটি পছন্দ করে না reduce?
ক্রিস মার্টিন

3
হ্যাঁ - এবং হ্রাস এখন পাইথন 3 এ কোনও বিল্টিন নেই IM আইএমও, আমাদের যখন কোনও স্ট্যান্ডার্ড (বা তৃতীয় পক্ষ) লাইব্রেরি করবে তখন গ্লোবাল বিল্টিনগুলিতে যুক্ত প্রতিটি সম্ভাব্য তালিকা অপারেটরের দরকার নেই। আপনার যত বিল্টিন রয়েছে তত সাধারণ শব্দগুলি স্থানীয় ভেরিয়েবলের নাম হিসাবে অফ-সীমাতে পরিণত হয়।
ojrac

7
কমানোর () হ্রাস সম্পর্কে গিডোর ব্লগ পোস্টে সবেমাত্র এই নগেটটি পাওয়া গেছে । "আমাদের ইতিমধ্যে যোগফল রয়েছে (); আমি আনন্দের সাথে পণ্য () এর জন্য () হ্রাস করার বাণিজ্য করতাম ..." । যদি কেউ product()স্ট্যান্ডার্ড লাইব্রেরি অন্তর্ভুক্ত করার জন্য আবেদন করতে চান তবে এই প্রশ্নের মতামতের সংখ্যা মামলাটি তৈরি করতে সহায়তা করতে পারে।
প্যাট্রিক ম্যাকএলহানি

1
@ পেট্রিকএমসিএলহানির মতো মনে হচ্ছে পাইথন 3 ইতিমধ্যে হ্রাস বিল্টিন থেকে মুক্তি পেয়েছে। আমি মনে করি পণ্যটি তার সুযোগটি হাতছাড়া করেছে। ;)
ওজরাক

41

এখানে অন্তর্নির্মিত একটি নেই, তবে এখানে প্রদর্শিত হিসাবে এটি নিজের রোল করা সহজ :

import operator
def prod(factors):
    return reduce(operator.mul, factors, 1)

এই প্রশ্নের উত্তর দেখুন:

কোন পাইথন মডিউল কোনও তালিকায় ডেটা ম্যানিপুলেশনের জন্য উপযুক্ত?


8
পাইথন 3 এর functools.reduceপরিবর্তে ব্যবহার করুন reduce
স্টিভেন রাম্বালস্কি

1
আরও বেশি ফান্টুল মজাদার জন্য:prod = functools.partial(functools.reduce, operator.mul)
বুকজোর

39

সেখানে prod()নাম্বার রয়েছে যা আপনি যা চাইছেন তা করে।


3
দ্রষ্টব্য: পাইথন লম্বা (স্বেচ্ছাচারিত নির্ভুলতা পূর্ণসংখ্যার) সমর্থন করে না তাই np.prod(range(1,13))সঠিক উত্তরটি 12 এর সমান দেয়! কিন্তু np.prod(range(1,14))না।
জেসন এস

2
@ জেসনস np.prod(arange(1,14, dtype='object'))?
এন্ডোলিথ

1
math.prod()ফাংশন এই উত্তর অপ্রচলিত করতে হবে।
বেনোত পি

আপনি যখন সাধারণ ওয়ান-লাইনারে এটি করতে চান তখন গণিত আমদানি করতে করতে ক্লান্তিহীন। আমি হ্রাস () এবং গাইড-প্রত্যাখ্যাত পণ্য () মিস করছি।
আরসিক্রস

25
Numeric.product 

(বা

reduce(lambda x,y:x*y,[3,4,5])

)


তিনি কোনও ফাংশন চান যা তিনি মডিউল বা লাইব্রেরি থেকে লোড করতে পারেন, নিজে ফাংশনটি লেখেন না।
জেরেমি এল

2
তবে যদি এটি না থাকে তবে তিনি সম্ভবত ফাংশনটি চান।
ডিএনএস

1
ঠিক আছে, তবে তার জানা দরকার যে একটির অস্তিত্ব নেই, কারণ এটিই তার মূল প্রশ্ন।
জেরেমি এল

2
আপনাকে 1 এর ডিফল্ট মান হ্রাস করতে হবে অন্যথায় এটি নাল ক্ষেত্রে ব্যর্থ হবে। খালি সিকোয়েন্সের পণ্যটি 1 হিসাবে সংজ্ঞায়িত করা হয়
হারুন রবসন

3
@ ক্রেইগএমসিউইউন নুমারিক হ'ল ন্যাপির পূর্বসূরীদের (অন্যতম)।
টাকসওয়েল

22

এটা ব্যবহার কর

def prod(iterable):
    p = 1
    for n in iterable:
        p *= n
    return p

যেহেতু কোনও অন্তর্নির্মিত prodফাংশন নেই।


6
আপনার অবশ্যই ভাবতে হবে হ্রাস আসলেই একটি অ্যান্টিপ্যাটার্ন :)
জুইটারলিডে

1
তিনি জানতে চেয়েছিলেন যে কোনও বিদ্যমান ক্রিয়াকলাপ তিনি ব্যবহার করতে পারেন কিনা।
জেরেমি এল

এবং এই উত্তরটি ব্যাখ্যা করে যে একটি নেই।
ইবিগ্রিন

5
@ জুইটারলিন্ডে: নতুনদের জন্য, সমস্যার কারণ বাড়ে reduce এই ক্ষেত্রে, ব্যবহার করে lambda a,b: a*b, এটি কোনও সমস্যা নয়। তবে হ্রাস ভাল জেনারেলাইজ করে না, এবং আপত্তিজনক হয়। আমি শিখতে না শিখতে পছন্দ করি।
এস। লট

@ এস.লট আমি কোনও নতুন ব্যবহারকারীর ব্যবহার কমিয়ে আনতে দেখিনি, অন্য কোনও কার্যকরী-ইস্ক কমস্ট্রাক্টও কম। হেক, এমনকি "মধ্যবর্তী" প্রোগ্রামাররা সাধারণত তালিকা বোঝার বাইরে খুব বেশি কিছু জানেন না।
মতিন উলহাক

2

আমি উত্তর পছন্দ করা একটি এবং ব্যবহার করে উপরে উল্লেখিত functools.reduce () এবং উত্তর ব্যবহার numpy.prod () কিন্তু এখনো এখানে ব্যবহার করে অন্য সমাধান itertools.accumulate () :

import itertools
import operator
prod = list(itertools.accumulate((3, 4, 5), operator.mul))[-1]

2

সম্ভবত "বিল্টিন" নয়, তবে আমি এটি বিল্টিন হিসাবে বিবেচনা করি। যাইহোক শুধু নম্পটি ব্যবহার করুন

import numpy 
prod_sum = numpy.prod(some_list)

এটি বিপজ্জনকভাবে একটি "আমার মেশিনে কাজ করে" বিবৃতিটির খুব কাছাকাছি! নম্পু, মনোরম হলেও তা স্পষ্ট নয় কোনও বিল্টিন।
আরসিক্রস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.