سؤال

قانون بلدي

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 الطريقة ؟ أوههه.....

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top