Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Autre exercice : calculer la somme de x chiffres.

18 réponses
Avatar
Dominique
Je trouve ce script qui fonctionne très bien et qui est en accord avec
(n²+n)/2 :

def addition(x):
return sum([i for i in range(0,x+1)])
print (addition(int(input('Fin de la sommielle '))))

Est-ce propre ?

Chercher la concision Í  tout prix est-ce un bon pari ? Je suis de
l'ancienne école : j'ai commencé Í  programmer avec un Sharp PC1211 qui
avait 1 KO de RAM. On apprenait Í  compacter...

Merci pour votre éclairage,

Dominique

10 réponses

1 2
Avatar
Dominique
Le 22/05/2022 Í  17:00, Dominique a écrit :
Inutile de passer par une composition de liste :
def addition(x):
return sum(range(x+1))
print (addition(int(input('Fin de la sommielle '))))
Difficile sans doute d'être plus concis...
Avatar
Damien Wyart
* Dominique in fr.comp.lang.python:
Inutile de passer par une composition de liste :
def addition(x):
return sum(range(x+1))
print (addition(int(input('Fin de la sommielle '))))
Difficile sans doute d'être plus concis...

Je trouve qu'imbriquer tous les appels n'est pas très lisible ; je
proposerais plutÍ´t :
def sum_of_first_ints(n):
return sum(range(n+1))
N = int(input("Please enter an integer: "))
print("The sum from 1 to", N, "is", sum_of_first_ints(N))
--
DW
Avatar
Benoit Izac
Bonjour,
Le 22/05/2022 Í  17:11, Dominique a écrit dans le message
<t6djq7$1570$ :
Inutile de passer par une composition de liste :
def addition(x):
return sum(range(x+1))
print (addition(int(input('Fin de la sommielle '))))
Difficile sans doute d'être plus concis...

Mais on peut faire mieux en terme d'algorithme :
def accumulate_sum_of(n):
return (n + 1) // 2 * (n + (n + 1) % 2)
Ce qui fait du O(1) au lieu du O(n).
--
Benoit Izac
Avatar
Alain Ketterlin
Benoit Izac writes:
Le 22/05/2022 Í  17:11, Dominique a écrit dans le message
<t6djq7$1570$ :
Inutile de passer par une composition de liste :
def addition(x):
return sum(range(x+1))
print (addition(int(input('Fin de la sommielle '))))
Difficile sans doute d'être plus concis...

Mais on peut faire mieux en terme d'algorithme :
def accumulate_sum_of(n):
return (n + 1) // 2 * (n + (n + 1) % 2)

Hmm, pourquoi pas simplement n * (n+1) // 2 ? (Ou (n+1)*(n+2)//2 si on
veut la somme jusqu'Í  n+1.)
-- Alain.
Avatar
Benoit Izac
Bonjour,
Le 23/05/2022 Í  12:56, Alain Ketterlin a écrit dans le message
 :
Inutile de passer par une composition de liste :
def addition(x):
return sum(range(x+1))
print (addition(int(input('Fin de la sommielle '))))
Difficile sans doute d'être plus concis...

Mais on peut faire mieux en terme d'algorithme :
def accumulate_sum_of(n):
return (n + 1) // 2 * (n + (n + 1) % 2)

Hmm, pourquoi pas simplement n * (n+1) // 2 ? (Ou (n+1)*(n+2)//2 si on
veut la somme jusqu'Í  n+1.)

Parce que c'est toujours plus compliqué de faire simple. ;-)
--
Benoit Izac qui n'a s'en doute pas assez réfléchi au problème
Avatar
Dominique
Le 23/05/2022 Í  14:20, Benoit Izac a écrit :
Bonjour,
Le 23/05/2022 Í  12:56, Alain Ketterlin a écrit dans le message
 :
Inutile de passer par une composition de liste :
def addition(x):
return sum(range(x+1))
print (addition(int(input('Fin de la sommielle '))))
Difficile sans doute d'être plus concis...

Mais on peut faire mieux en terme d'algorithme :
def accumulate_sum_of(n):
return (n + 1) // 2 * (n + (n + 1) % 2)

Hmm, pourquoi pas simplement n * (n+1) // 2 ? (Ou (n+1)*(n+2)//2 si on
veut la somme jusqu'Í  n+1.)

Parce que c'est toujours plus compliqué de faire simple. ;-)

J'avais bien pensé Í  aller au plus court avec (n2+n)/2. Mais l'exercice
voulait qu'on balaye la plage de 1 Í  n :-)
Avatar
Dominique
Le 23/05/2022 Í  09:36, Damien Wyart a écrit :
print("The sum from 1 to", N, "is", sum_of_first_ints(N))

Cette présentation est intéressante. Je me la garde :-)
Merci,
Dominique
Avatar
Dominique
Le 23/05/2022 Í  12:56, Alain Ketterlin a écrit :
Hmm, pourquoi pas simplement n * (n+1) // 2 ? (Ou (n+1)*(n+2)//2 si on
veut la somme jusqu'Í  n+1.)

J'y ai bien pensé, mais l'exercice ne voulait pas de cette solution :-)
Au passage, elle ne fonctionne que pour une plage de 1 Í  n, pas de x
(1<x<n) jusqu'Í  n. De plus, elle est plus compliquée Í  gérer si on veut
ne travailler que sur une valeur sur deux : 1, 3, 5 ou 2, 4, 6...
Merci Í  vous tous,
Dominique
Avatar
Alain Ketterlin
Benoit Izac writes:
def accumulate_sum_of(n):
return (n + 1) // 2 * (n + (n + 1) % 2)

Hmm, pourquoi pas simplement n * (n+1) // 2 ?

Parce que c'est toujours plus compliqué de faire simple. ;-)

Cela étant, ta version est mieux adaptée aux contextes o͹ la précision
est limitée, parce qu'elle évite les overflows quand n*(n+1) n'est pas
représentable mais que n*(n+1)/2 l'est.
(Ça ne concerne pas Python, mais c'est la même idée qu'un bug qui a été
célèbre en Java, dont la correction a consisté Í  remplacer (a+b)/2 par
a + (b-a)/2.)
-- Alain.
Avatar
Benoit Izac
Bonjour,
Le 24/05/2022 Í  14:33, Alain Ketterlin a écrit dans le message
 :
(Ça ne concerne pas Python, mais c'est la même idée qu'un bug qui a été
célèbre en Java, dont la correction a consisté Í  remplacer (a+b)/2 par
a + (b-a)/2.)

Il y a intérêt a avoir un beau commentaire juste Í  cÍ´té car il y a fort
Í  parier que quelqu'un qui passe sur le code sans être courant risque de
simplifier (et c'est logique).
Question bête : si c'est (a+b) qui provoque le dépassement, pourquoi pas
«Â a/2 + b/2 »Â ? Perte de précision ?
Et pour ma culture, il vient d'o͹ ce bug ?
--
Benoit Izac
1 2