वहाँ एक और अधिक संक्षिप्त, कुशल या बस पायथोनिक तरीका निम्नलिखित है?
def product(list):
p = 1
for i in list:
p *= i
return p
संपादित करें:
मुझे वास्तव में पता चला है कि यह आपरेटर की तुलना में मामूली रूप से तेज है।
from operator import mul
# from functools import reduce # python3 compatibility
def with_lambda(list):
reduce(lambda x, y: x * y, list)
def without_lambda(list):
reduce(mul, list)
def forloop(list):
r = 1
for x in list:
r *= x
return r
import timeit
a = range(50)
b = range(1,50)#no zero
t = timeit.Timer("with_lambda(a)", "from __main__ import with_lambda,a")
print("with lambda:", t.timeit())
t = timeit.Timer("without_lambda(a)", "from __main__ import without_lambda,a")
print("without lambda:", t.timeit())
t = timeit.Timer("forloop(a)", "from __main__ import forloop,a")
print("for loop:", t.timeit())
t = timeit.Timer("with_lambda(b)", "from __main__ import with_lambda,b")
print("with lambda (no 0):", t.timeit())
t = timeit.Timer("without_lambda(b)", "from __main__ import without_lambda,b")
print("without lambda (no 0):", t.timeit())
t = timeit.Timer("forloop(b)", "from __main__ import forloop,b")
print("for loop (no 0):", t.timeit())
मुझे देता है
('with lambda:', 17.755449056625366)
('without lambda:', 8.2084708213806152)
('for loop:', 7.4836349487304688)
('with lambda (no 0):', 22.570688009262085)
('without lambda (no 0):', 12.472226858139038)
('for loop (no 0):', 11.04065990447998)
listएक चर नाम के रूप में उपयोग नहीं करता है ...
+उस प्रकार की सूची के लिए पहचान तत्व है (इसी तरह उत्पाद / के लिए *)। अब मुझे एहसास हुआ कि पायथन गतिशील रूप से टाइप किया गया है जो चीजों को कठिन बनाता है, लेकिन यह सेंस भाषाओं में हलस्केल जैसी स्थिर प्रकार प्रणालियों के साथ एक हल की गई समस्या है। लेकिन Pythonकेवल sumनंबर पर काम करने की अनुमति देता है, क्योंकि sum(['a', 'b'])यह भी काम नहीं करता है, इसलिए मैं फिर से कहता हूं कि उत्पाद के 0लिए sumऔर इसके 1लिए समझ में आता है ।

reduceउत्तर एक उठाते हैंTypeError, जबकिforलूप उत्तर देता है। 1. यह लूप उत्तर में एक बग हैfor(खाली सूची का उत्पाद 17 से अधिक नहीं है 1) या 'आर्मडिलो')।