2016-07-29 6 views
0

In meinem Programm gibt Benutzer eine Zahl (input_n) ein, die durchlaufen wird:
0 + 1 + 2 + ... + n = n * (n +1)/2 Axiom..join() Elemente einer benutzerdefinierten Liste mit Bereich in Python

My gewünschten Ausgang für ein Eingang_n < = 10 (in diesem Fall: 5)

My gewünschten Ausgang für ein Eingang_n> 10 (in diesem Fall: 999)

[0, 1, 2, 3, 4, 5, ... , 995 , 996, 997, 998, 999] 
0 + 1 + 2 + 3 + 4 + 5 + ... + 995 + 996 + 997 + 998 + 999 = 499500 
999*(999+1)/2 = 499500 

I Ich dachte, ich könnte zwei Bereichsfunktionen mit einer "+ ... +" - Zeichenfolge zwischen ihnen in einer Druckanweisung verwenden. Aber was ich eingeben muss unsinnig sein, da ich einen Syntaxfehler erhalten:

SyntaxError: Generator expression must be parenthesized if not sole argument 

Was bedeutet, dass Fehler entdeckt? Ich verstehe, dass der betreffende Ausdruck in Klammern gesetzt werden muss. Ich versuchte den Fehler mit meiner Anfängerlogik zu korrigieren, aber meine Versuche scheiterten.

Hier ist mein Code:

input_n = int(input("Choisissez un nombre : ")) 

input_list = list() 
for i in range(0,input_n+1): 
    input_list.append(i) 

if input_n <= 10: 
    print ("+".join(str(i) for i in input_list) + " = ", sum(input_list)) 
    print (str(input_n)+'*'+'('+str(input_n)+'+1)/2 = ', int(input_n*(input_n+1)/2)) 
elif input_n > 10: 
    print("+".join(str(i) for i in range(5)) + " + ... +" + "+".join(str(i) for i in range(input_n-5,input_n+1), sum(input_list))) 
    print (str(input_n)+'*'+'('+str(input_n)+'+1)/2 = ', int(input_n*(input_n+1)/2)) 

Für noobs wie ich: ich schon Antworten in diesem topic für frühere aufgetretenen Probleme bekam, sollten Sie auf jeden Fall die Antworten gegeben überprüfen.

+0

Können Sie mit einem leeren String beginnen, bei jeder Iteration verketten und dann das Endergebnis drucken ? – Pedro

+0

Ich verstehe nicht, warum Sie 'print schreiben ('+'. Join (...) + '=', sum (...))' anstelle von 'print ('+'. Join (...), '=', Summe (...)) '. Entweder verketten Sie zuerst die Zeichenkette und übergeben das Endergebnis an 'print' oder Sie benutzen' print's mehrere Argumente. Das Mischen der beiden macht keinen Sinn, besonders in diesem Fall. – Bakuriu

+0

Danke. Das werde ich mir auf jeden Fall merken. Alle Formatierungen, entweder richtig oder zirkusähnlich, sind für mich ebenso neu. Ich bin bereit, etwas Ordnung in meine Programmierung zu bekommen, sobald ich die Grundlagen besser verstanden habe. – randomhopeful

Antwort

1

Sie haben vergessen, den Halter der join integrierte Methode zu schließen, so dass ich denke, das ist, was Sie wollen:

>>> input_list = list(range(21)) 
>>> 
>>> input_n = 20 
>>> print("+".join(str(i) for i in range(5)) + " + ... +" + "+".join(str(i) for i in range(input_n-5,input_n+1)) + ' = ', sum(input_list)) 
0+1+2+3+4 + ... +15+16+17+18+19+20 = 210 
+0

Danke, du hast mich aus einer verrückten Richtung zurückgebracht, in die ich gegangen bin. Ich habe noch gut zehn Minuten gebraucht, um herauszufinden, dass ich die richtige Anzahl an Klammern hatte, aber eine war komisch verlegt. Ich bin dankbar, dass ich nicht downvoted wurde. – randomhopeful

+0

@randomhopeful .. sicher;) –

3

Die Zurückverfolgungs zeigt Ihnen:

....join(str(i) for i in range(input_n-5,input_n+1), sum(input_list))) 

Was hier geschrieben wird, macht keinen Sinn. Überarbeiten Sie es, bis es funktioniert.

+0

Ich sehe; In diesem Fall muss sum (input_list) als zweiter Bereich interpretiert worden sein. Ich versuche, einen String hinzuzufügen und die Funktion {} .format – randomhopeful

+1

nicht als zweiten Bereich, sondern entweder als zweites Element eines Tupels (mit dem Ergebnis von 'range()' als erstes) * oder * as das zweite Argument zu 'join()'. Der Lexer hat entschieden, dass mehrdeutige Fälle wie dieser ein Fehler sind. –

+0

Danke. Die andere Antwort bekam, was ich durch meinen Kopf falsch gemacht habe. Ihr erklärt das Kauderwelsch, das der Lexer ertragen musste. – randomhopeful