غير قادر على جعل مضروب وظيفة في بايثون
سؤال
قانون بلدي
import sys
number=int(sys.argv[1])
if number == 0
fact=1
else
fact=number
for (x=1; x<number; x++)
fact*=x; // mistake probably here
print fact
أحصل على خطأ
File "factorial.py", line 5
if number == 0
^
SyntaxError: invalid syntax
كيف يمكنك أن تجعل مضروب وظيفة في الثعبان ؟
المحلول
هنا هو رمز ثابت و العمل:
import sys
number = int(sys.argv[1])
fact = 1
for x in range(1, number+1):
fact *= x
print fact
(مضروب الصفر هو واحد بالنسبة لمن لا يعرف - كان علي أن أبحث عنه.8-)
كنت بحاجة إلى نقطتين بعد if
, else
, for
, ، وما إلى ذلك ، والطريقة for
يعمل في بيثون مختلفة من C.
نصائح أخرى
الخط هذا الخطأ على قراءة
if number == 0:
ملاحظة القولون على النهاية.
بالإضافة إلى ذلك, سوف تحتاج إلى إضافة نفس القولون بعد آخر و أجل.الفواصل العمل بالمثل {} في اللغات الأخرى.
أخيرا, هذا ليس لحلقات العمل في بيثون.مدونة كنت ترغب في استخدام هذه القائمة
for x in range(1,number):
والذي سوف يكون له نفس التأثير من ما كتبت ، إذا وضعت ذلك في ج نمط اللغة.
تحرير:عفوا, لحلقة أعطى خطأ ، بل قد شملت 0.لقد قمت بتحديث الكود الصحيح هذا.
أنا أفهم أنه ربما تحاول تنفيذ ذلك بنفسك لأسباب تربوية.
ومع ذلك ، إذا لم يكن كذلك ، أوصي باستخدام math
وحدات المدمج في وظيفة مضروب (ملاحظة:يتطلب بيثون 2.6 أو أعلى):
>>> import math
>>> math.factorial(5)
120
هذه الوحدة هو مكتوب في C ، وعلى هذا النحو ، فإنه سيكون أسرع بكثير من الكتابة في بيثون.(على الرغم من أن إذا كنت لا الحوسبة كبيرة factorials ، لن تكون بطيئة جدا في كلتا الحالتين).
السبب مارك Rushakoff حقيقة(ن) وظيفة أكثر من ذلك بكثير كفاءة أنه غاب عن الحد() وظيفة.وبالتالي فإنه في الحقيقة لم فعلت الحساب.
تصحيح يقرأ (و أحصل على):
import operator, timeit, math
#
def fact1(n): return reduce(lambda x,y: x*y, range(1,n+1),1)
def fact1x(n): return reduce(lambda x,y: x*y, xrange(1,n+1),1)
def fact2(n): return reduce(operator.mul , range(1,n+1),1)
def fact2x(n): return reduce(operator.mul , xrange(1,n+1),1)
#
def factorialtimer():
for myfunc in [ "fact1", "fact1x", "fact2", "fact2x" ]:
mytimer = timeit.Timer(myfunc+"(1500)", "from __main__ import "+myfunc)
print("{0:15} : {1:2.6f}".format(myfunc, mytimer.timeit(number=1000)))
mytimer = timeit.Timer("factorial(1500)", "from math import factorial")
print("{0:15} : {1:2.6f}".format("math.factorial", mytimer.timeit(number=1000)))
الناتج عن 1500!, 1000x:
fact1 : 3.537624
fact1x : 4.448408
fact2 : 4.390820
fact2x : 4.333070
math.factorial : 4.091470
و نعم لقد تحققت جميعها تعطي نفس القيمة!لا أستطيع أن أفهم لماذا لامدا xrange هو أسوأ بكثير مما لامدا مجموعة.هممم.الإصدار:PythonWin 2.6.2 (r262:71605 ، أبريل 14 2009, 22:40:02) [MSC v. 1500 32 بت (Intel)] على win32.
همم...على إعادة تشغيل أحصل على شيء أكثر تصديقا
fact1 : 7.771696
fact1x : 7.799568
fact2 : 7.056820
fact2x : 7.247851
math.factorial : 6.875827
و على الثعبان 2.6.5 (r265:79063, يونيو 12 2010, 17:07:01) [دول مجلس التعاون الخليجي 4.3.4 20090804 (الإصدار) 1] في سيغوين:
fact1 : 6.547000
fact1x : 6.411000
fact2 : 6.068000
fact2x : 6.246000
math.factorial : 6.276000
كل ما في الضوضاء حقا, أليس كذلك ؟
وهنا وظيفية مضروب التي كنت تقريبا طلبت:
>>> def fact(n): return reduce (lambda x,y: x*y, range(1,n+1))
...
>>> fact(5)
120
أنها لا تعمل من أجل الحقيقة(0), ولكن يمكنك تقلق بشأن ذلك خارج نطاق fact
:)
ماسي وقد سئل عما إذا كان نمط وظيفي أكثر كفاءة من ريتشي التنفيذ.وفقا بلدي سريعة المعيار (و لدهشتي!) نعم, أنا هو أسرع.ولكن هناك بعض الأشياء التي يمكننا القيام به من أجل التغيير.
أولا, نحن يمكن أن تكون بديلا lambda x,y: x*y
مع operator.mul
كما اقترح في تعليق آخر.بايثون lambda
المشغل يأتي مع مجموعة لا يستهان بها في سماء المنطقة.ثانيا ، لا يمكن أن تكون بديلا xrange
بالنسبة range
. xrange
يجب أن تعمل في الفضاء الخطي ، والعودة الأرقام كما ضروريا ، range
يخلق كل قائمة في كل مرة.(ملاحظة إذا أن كنت يكاد يكون من المؤكد أن استخدام xrange
على نحو مفرط مجموعة كبيرة من الأرقام)
وبالتالي فإن التعريف الجديد يصبح:
>>> import operator
>>> def fact2(n): return reduce(operator.mul, xrange(1,n+1))
...
>>> fact2(5)
120
لدهشتي, هذا الواقع أدى إلى تباطؤ الأداء.وهنا Q&D المعايير:
>>> def fact(n): return (lambda x,y: x*y, range(1,n+1))
...
>>> t1 = Timer("fact(500)", "from __main__ import fact")
>>> print t1.timeit(number = 500)
0.00656795501709
>>> def fact2(n): return reduce(operator.mul, xrange(1,n+1))
...
>>> t2 = Timer("fact2(500)", "from __main__ import fact2")
>>> print t2.timeit(number = 500)
0.35856294632
>>> def fact3(n): return reduce(operator.mul, range(1,n+1))
...
>>> t3 = Timer("fact3(500)", "from __main__ import fact3")
>>> print t3.timeit(number = 500)
0.354646205902
>>> def fact4(n): return reduce(lambda x,y: x*y, xrange(1,n+1))
...
>>> t4 = Timer("fact4(500)", "from __main__ import fact4")
>>> print t4.timeit(number = 500)
0.479015111923
>>> def fact5(n):
... x = 1
... for i in range(1, n+1):
... x *= i
... return x
...
>>> t5 = Timer("fact5(500)", "from __main__ import fact5")
>>> print t5.timeit(number = 500)
0.388549804688
هنا هو بلدي الثعبان الإصدار في حالة أي شخص يريد التحقق من النتائج:
Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41)
[GCC 4.3.3] on linux2
حقا أبسط الخيار ليكون:
def factorial(n):
x = n
for j in range(1, n):
x = j*x
return x
نعم ، إلى حد ما ، يعمل.
كيف لم أفكر في هذا ؟ أنا لا أعرف.
A for
حلقة مضاعف حقا البساطة هي أفضل وسيلة للذهاب ، أليس كذلك ؟
تحرير:مهلا, نحن نعمل على أكثر من وحدة المعالجة المركزية-efficeint الطريقة ؟ أوههه.....