sum()
ฟังก์ชันPython ส่งคืนผลรวมของตัวเลขใน iterable
sum([3,4,5]) == 3 + 4 + 5 == 12
ฉันกำลังมองหาฟังก์ชั่นที่ส่งคืนผลิตภัณฑ์แทน
somelib.somefunc([3,4,5]) == 3 * 4 * 5 == 60
ฉันค่อนข้างแน่ใจว่ามีฟังก์ชั่นดังกล่าวอยู่ แต่ฉันหามันไม่เจอ
sum()
ฟังก์ชันPython ส่งคืนผลรวมของตัวเลขใน iterable
sum([3,4,5]) == 3 + 4 + 5 == 12
ฉันกำลังมองหาฟังก์ชั่นที่ส่งคืนผลิตภัณฑ์แทน
somelib.somefunc([3,4,5]) == 3 * 4 * 5 == 60
ฉันค่อนข้างแน่ใจว่ามีฟังก์ชั่นดังกล่าวอยู่ แต่ฉันหามันไม่เจอ
คำตอบ:
ใน Python 3.8 ฟังก์ชันprodถูกเพิ่มเข้ากับโมดูลคณิตศาสตร์ ดู: math.prod ()
ฟังก์ชันที่คุณต้องการจะเรียกว่าprod ()หรือproduct ()แต่ Python ไม่มีฟังก์ชันนั้น ดังนั้นคุณต้องเขียนของคุณเอง (ซึ่งง่าย)
ใช่มันเป็นสิ่งที่ถูก. กุยโด้ปฏิเสธความคิดสำหรับฟังก์ชัน prod () ในตัวเพราะเขาคิดว่าไม่ค่อยจำเป็น
ตามที่คุณแนะนำก็ไม่ยากที่จะทำด้วยตัวเองโดยใช้ลด ()และoperator.mul () :
from functools import reduce # Required in Python 3
def prod(iterable):
return reduce(operator.mul, iterable, 1)
>>> prod(range(1, 5))
24
หมายเหตุในหลาม 3, ลด ()ฟังก์ชั่นถูกย้ายไปโมดูล functools
ในฐานะที่เป็นบันทึกด้านข้าง, กรณีการใช้หลักที่สร้างแรงจูงใจสำหรับprod ()คือการคำนวณแฟคทอเรียล เราได้รับการสนับสนุนในโมดูลคณิตศาสตร์แล้ว :
>>> 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
หมายเหตุการใช้log ()ต้องการให้อินพุตทั้งหมดเป็นค่าบวก
จริงๆแล้ว Guido คัดค้านความคิด: 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)
reduce
เหรอ?
product()
ไว้ในห้องสมุดมาตรฐานจำนวนการดูคำถามนี้อาจช่วยได้
ไม่มีหนึ่งในตัว แต่มันง่ายที่จะม้วนของคุณเองดังที่แสดงไว้ที่นี่ :
import operator
def prod(factors):
return reduce(operator.mul, factors, 1)
ดูคำตอบสำหรับคำถามนี้:
functools.reduce
reduce
prod = functools.partial(functools.reduce, operator.mul)
มีจำนวนมากที่ทำprod()
ในสิ่งที่คุณต้องการ
np.prod(range(1,13))
ให้คำตอบที่ถูกต้องเท่ากับ 12! แต่np.prod(range(1,14))
ไม่ได้
np.prod(arange(1,14, dtype='object'))
?
math.prod()
ฟังก์ชั่นที่จะทำให้คำตอบนี้ล้าสมัย
Numeric.product
( หรือ
reduce(lambda x,y:x*y,[3,4,5])
)
ใช้สิ่งนี้
def prod(iterable):
p = 1
for n in iterable:
p *= n
return p
เนื่องจากไม่มีprod
ฟังก์ชั่นในตัว
lambda a,b: a*b
มันไม่มีปัญหา แต่ลดไม่ได้พูดคุยกันได้ดีและถูกทารุณกรรม ฉันชอบผู้เริ่มต้นที่ไม่ได้เรียนรู้
ฉันชอบคำตอบaและbข้างต้นโดยใช้functools.reduce ()และคำตอบโดยใช้numpy.prod ()แต่ที่นี่ยังเป็นอีกวิธีใช้itertools.accumulate () :
import itertools
import operator
prod = list(itertools.accumulate((3, 4, 5), operator.mul))[-1]
อาจไม่ใช่ "builtin" แต่ฉันคิดว่ามันสร้างขึ้น ยังไงก็ใช้ numpy
import numpy
prod_sum = numpy.prod(some_list)