Et voici la mienne, qui est un peu plus "traditionnel" :
import os
import time
T1 = time.clock() # temps d'execution
def impairs(n,m):
i = 0
while i<=m:
if n%2 == 0 and i == 0: # pairs
i = n + 1
continue
elif n%2 != 0 and i == 0: # impairs
i = n + 2
continue
print(i, end=' ')
i+=2
# test de la fonction
if __name__ == "__main__":
# avoir les deux valeurs entrées sur la même ligne
chaine = input()
chaine = str(chaine) # on crée une chaine
liste = chaine.split(" ") # on sépare les nombres en créant une liste qui délimite les nb par " "
n = int(liste[0]) # on récupère dans des variables
m = int(liste[1])
impairs(n,m) # appel de la fonction impairs avec en paramètre l'intervalle
T2 = time.clock() # temps d'execution
print ("\n\n\n", T2-T1)
os.system("pause")
Je l'ai donc un peu amélioré :
import os
import time
T1 = time.clock() # temps d'execution
def impairs(n,m):
for i in range(n,(m+1)):
if i%2!=0:
print(i, end=" ")
# test de la fonction
if __name__ == "__main__":
# avoir les deux valeurs entrées sur la même ligne
chaine = input()
liste = chaine.split(" ") # on sépare les nombres en créant une liste qui délimite les nb par " "
n = int(liste[0]) # on récupère dans des variables
m = int(liste[1])
impairs(n,m) # appel de la fonction impairs avec en paramètre l'intervalle
T2 = time.clock() # temps d'execution
print ("\n\n\n", T2-T1)
os.system("pause")
EPonix >>>C'est sure c'est très bien d'apporter des solutions plus difficiles, ca rend le sujet plus intéressant mais tu ne peux pas assurer qu'un code utilisant les "list compréhension" est dans le bagage d'un débutant
Sache que ton code est bien plus compliqué que nos compréhensions de listes.
@nicodec57 : à quoi ça te sert pour un ptit programme comme ça de tester le main ?
@nicodec57 : à quoi ça te sert pour un ptit programme comme ça de tester le main ?
Oui c'est vrai
Souvent quand j'apprends quelque chose de récent ou nouveau, je le place dans les codes
Donc voilà le nouveau code :
import os
import time
T1 = time.clock() # temps d'execution
def impairs(n,m):
for i in range(n,(m+1)): # boucle avec total des nombres dans l'intervalle (borne incluses)
if i%2: # selection des impairs seulement
print(i, end=" ")
# avoir les deux valeurs entrées sur la même ligne
chaine = input()
liste = chaine.split(" ") # on sépare les nombres en créant une liste qui délimite les nb par " "
n = int(liste[0]) # on récupère dans des variables
m = int(liste[1])
impairs(n,m) # appel de la fonction impairs avec en paramètre l'intervalle
T2 = time.clock() # temps d'execution
print ("\n\n\n", T2-T1)
os.system("pause")
Pour python et pour beaucoup de langage, les chaines vide, listes vide, tuples vides, ... vides et 0 sont considérés comme False et le reste comme True.
Donc i%2 != 0 devient i%2 != False devient i%2 == True devient i%2
Je trouve que la solution la plus simple est quand même la boucle for contenant un if (la dernière solution de fred). Après, entre cette solution et celle de vieks, il est difficile de dire laquelle est la plus simple, pour celle de fred il faut encore savoir l'astuce de la virgule pour séparer juste d'un espace. En C, on aurait placé l'espace dans une chaîne formatée, un peu comme la solution de vieks.
La solution avec les listes en compréhension est plus expressive et plus courte. Néanmoins, dans la pratique d'apprentissage, les listes en compréhension sont apprises APRÈS les boucles for. En outre, pour un vrai débutant, c'est accroître la difficulté que de placer en plus un ternaire. Noter aussi que la solution avec les listes en compréhension utilise de la mémoire ce qui n'est pas le cas de la solution avec la boucle for.
Bon, de toutes façons, sur prologin et tous les sites de ce genre, on s'en fout de produire du beau code pythonnique c'est juste la cerise sur le gâteau. Ce qui compte c'est l'algo, il peut y a voir des maladresses de codage, ce n'est pas grave, tant que ce n'est pas pénalisant. A moins d'être tombé dedans quand on était petit, il faut un certain temps pour acquérir toutes les routines de l'"algorithmicien" entraîné.
Citation : EPonix
Donc i%2 != 0 devient i%2 != False devient i%2 == True devient i%2
et c'est à cause de tout cet enchaînement que je n'aime pas la dernière expression mais bon, les goûts et les couleurs ...
def impair(x,y):
if not x%2:
x+=1
y+=1
return range(x,y,2)
J'ai essayé de faire une code un peu plus "algorithme conventionnel" que celui de Eponix et fred1599, j'ai quand même une préférence pour le tiens fred.
Désolé j'ai cité au lieu d'éditer, j'ai voulu corriger l'erreur qu'a soulevé candide.
Je trouve que la solution la plus simple est quand même la boucle for contenant un if (la dernière solution de fred).
J'ai également fais un for avec un if
import os
import time
T1 = time.clock() # temps d'execution
def impairs(n,m):
for i in range(n,(m+1)): # boucle avec total des nombres dans l'intervalle (borne incluses)
if i%2!=0: # selection des impairs seulement
print(i, end=" ")
# avoir les deux valeurs entrées sur la même ligne
chaine = input()
liste = chaine.split(" ") # on sépare les nombres en créant une liste qui délimite les nb par " "
n = int(liste[0]) # on récupère dans des variables
m = int(liste[1])
impairs(n,m) # appel de la fonction impairs avec en paramètre l'intervalle
T2 = time.clock() # temps d'execution
print ("\n\n\n", T2-T1)
os.system("pause")
def f(x,y):
if x>y:
x, y = y, x
if x%2 == 0:
for i in range(x+1,y+1,2):
print(i, end=' ')
else:
for i in range(x,y+1,2):
print(i, end=' ')
x = int(input('x = '))
y = int(input('y = '))
f(x,y)
x = 42
y = 51
43 45 47 49 51
x = 43
y = 60
43 45 47 49 51 53 55 57 59
J'aime bien ta solution. J'avais pas pensé au x>y !
Mais je pense que ce code :
def impairs(n,m):
for i in range(n,(m+1)): # boucle avec total des nombres dans l'intervalle (borne incluses)
if i%2!=0: # selection des impairs seulement
print(i, end=" ")
J'aime bien ta solution. J'avais pas pensé au x>y !
Mais je pense que ce code :
def impairs(n,m):
for i in range(n,(m+1)): # boucle avec total des nombres dans l'intervalle (borne incluses)
if i%2!=0: # selection des impairs seulement
print(i, end=" ")
Est plus court.
L'un des avantage de mon code sur le tien, c'est le nombre de test de parité.
Mon code fait :
un seul test de parité
un parcours les éléments de l'intervalle [x;y] de 2 en 2
Le tien en plus de parcourir tout l'intervalle par pas d'un fait des test de parité à chaque fois.
J'aime bien ta solution. J'avais pas pensé au x>y !
Mais je pense que ce code :
def impairs(n,m):
for i in range(n,(m+1)): # boucle avec total des nombres dans l'intervalle (borne incluses)
if i%2!=0: # selection des impairs seulement
print(i, end=" ")
Est plus court.
L'un des avantage de mon code sur le tien, c'est le nombre de test de parité.
Mon code fait :
un seul test de parité
un parcours les éléments de l'intervalle [x;y] de 2 en 2
Le tien en plus de parcourir tout l'intervalle par pas d'un fait des test de parité à chaque fois.
Range ne vérifie pas déjà si x > y ?
Et ici l'exercice est un exercice de base où une optimisation est superflue et ne servirait pas à grand chose.
Le tien en plus de parcourir tout l'intervalle par pas d'un fait des test de parité à chaque fois.
C'est vrai, étant débutant, j'ai pas pensé à tout ça
ça viendra je pense !
Voici donc mon code qui est pas mal basé sur celui de Skety :
import os
import time
T1 = time.clock() # temps d'execution
def impairs(n,m):
if n>m:
n, m = m, n
if n%2==0: # pairs
for i in range(n+1,m+1,2):
print(i, end=" ")
else: #impairs
for i in range(n,m+1,2):
print(i, end=" ")
# avoir les deux valeurs entrées sur la même ligne
chaine = input()
liste = chaine.split(" ") # on sépare les nombres en créant une liste qui délimite les nb par " "
n = int(liste[0]) # on récupère dans des variables
m = int(liste[1])
impairs(n,m) # appel de la fonction impairs avec en paramètre l'intervalle
T2 = time.clock() # temps d'execution
print ("\n\n\n", T2-T1)
os.system("pause")
Et ici l'exercice est un exercice de base où une optimisation est superflue et ne servirait pas à grand chose.
Si x < y, range ne génère apparemment rien.
Oui, c'est vrai mais cela n'empêche de faire quelque considération d'efficacité (complexité?)
Pour un exercice de débutants, les listes en compréhensions sont pas aussi à la portée de tous.
Je trouve que la solution la plus simple est quand même la boucle for contenant un if (la dernière solution de fred).
J'ai également fais un for avec un if
Oui, sauf que ta solution était celle-ci au départ et assez compliquée :
import os
import time
T1 = time.clock() # temps d'execution
def impairs(n,m):
i = 0
while i<=m:
if n%2 == 0 and i == 0: # pairs
i = n + 1
continue
elif n%2 != 0 and i == 0: # impairs
i = n + 2
continue
print(i, end=' ')
i+=2
# test de la fonction
if __name__ == "__main__":
# avoir les deux valeurs entrées sur la même ligne
chaine = input()
chaine = str(chaine) # on crée une chaine
liste = chaine.split(" ") # on sépare les nombres en créant une liste qui délimite les nb par " "
n = int(liste[0]) # on récupère dans des variables
m = int(liste[1])
impairs(n,m) # appel de la fonction impairs avec en paramètre l'intervalle
Citation : Skety
Pour un exercice de débutants, les listes en compréhensions sont pas aussi à la portée de tous.
Je propose donc ma correction qui comporte la fonction, le temps d'exécution et qui respecte les contraintes de présentation (Entrées sur 1 ligne, Sorties sur 1 ligne tout deux séparés par des espaces).
import os
import time
T1 = time.clock() # temps d'execution
def impairs(n,m):
if n>m:
n, m = m, n
if n%2==0: # pairs
for i in range(n+1,m+1,2):
print(i, end=" ")
else: #impairs
for i in range(n,m+1,2):
print(i, end=" ")
# avoir les deux valeurs entrées sur la même ligne
chaine = input()
liste = chaine.split(" ") # on sépare les nombres en créant une liste qui délimite les nb par " "
n = int(liste[0]) # on récupère dans des variables
m = int(liste[1])
impairs(n,m) # appel de la fonction impairs avec en paramètre l'intervalle
T2 = time.clock() # temps d'execution
print ("\n\n\n", T2-T1)
os.system("pause")
Un exemple de code utilisant une expression génératrice (genre liste en compréhension sauf que c'est un itérateur au lieu d'une liste) à la ligne 2 :
def f(a, b):
return (i for i in range(a, b+1) if i % 2 != 0)
a,b = [int(k) for k in raw_input().split()]
for k in f(a,b):
print k,
Ce code (python 2.6) tel quel passe les tests du serveur.
Les exos des QCM de Prologin sont très biens (parmi les quatre ou cinq exos il y en a un souvent d'assez difficile), je vous conseille de les essayer et surtout de soumettre vos codes sur le serveur, ça aide bien à progresser.
Les exos des QCM de Prologin sont très biens (parmi les quatre ou cinq exos il y en a un souvent de d'assez difficile), je vous conseille de les essayer et surtout de soumettre vos codes sur le serveur, ça aide bien à progresser.
Le seul problème est pour les codeurs en Python 3. Un serveur avec Python 2 n'aide pas beaucoup
Le seul problème est pour les codeurs en Python 3. Un serveur avec Python 2 n'aide pas beaucoup
En te lisant on pourrait croire qu'il y a autant de différence entre un codeur en lisp et un codeur en C qu'entre un codeur Python 2 vs Python 3
Je sais que pour un débutant c'est pas forcément immédiat de passer de l'un à l'autre mais pour les codes que tu vas poster sur prologin, les différences sont minimes.
Il faudra un jour faire un topic sur les différences entre Python 2 et Python 3 avec des dictionnaires 2to3 et 3to2.
Pour l'instant, je suis exclusivement sous Python 2 mais je sens que je vais bientôt devoir faire le shift.
En te lisant on pourrait croire qu'il y a autant de différence entre un codeur en lisp et un codeur en C qu'entre un codeur Python 2 vs Python 3
Je sais que pour un débutant c'est pas forcément immédiat de passer de l'un à l'autre mais pour les codes que tu vas poster sur prologin, les différences sont minimes.
Il faudra un jour faire un topic sur les différences entre Python 2 et Python 3 avec des dictionnaires 2to3 et 3to2.
+42
Passer d'une version à l'autre de Python n'est pas, en soi, une telle horreur, pour peu que l'on soit averti des principales évolutions (qui restent très ponctuelles dans l'ensemble). La philosophie du langage reste la même, et la lecture de la documentation des modules de l'API standard lorsque l'on les utilise permet d'anticiper plutôt facilement les problèmes de compatibilité éventuels.
Citation : candide
Pour l'instant, je suis exclusivement sous Python 2 mais je sens que je vais bientôt devoir faire le shift.
Personnellement, je travaille en Python2, mais j'essaye de faire le plus souvent possible (c'est-à-dire quand j'y pense) les exos en Python3 sur le forum... Je ne pense pas que la nécessité du shift définitif soit aussi imminente, pour la simple et bonne raison que le support de Python3 pour les bibliothèques tierces est encore assez faible, si ce n'est anecdotique dans certains cas.
Je re-post simplement pour donner une version amélioré de mon code, maintenant que j'ai lu les listes de compréhensions, pour les futur lecteurs.
import os
import time
T1 = time.clock() # temps d'execution
def impairs(n,m):
return([nb_impairs for nb_impairs in range(n,m+1) if nb_impairs%2!=0]) # il faut m compris
# avoir les deux valeurs entrées sur la même ligne
chaine = input()
liste = chaine.split(" ") # on sépare les nombres en créant une liste qui délimite les nb par " "
n = int(liste[0]) # on récupère dans des variables
m = int(liste[1])
print(*impairs(n,m)) # appel de la fonction impairs avec en paramètre l'intervalle
T2 = time.clock() # temps d'execution
print ("\n\n\n", T2-T1)
os.system("pause")
Il s'agit d'écrire une fonction qui prend deux entiers en paramètres, et qui affiche, dans l'ordre croissant, tous les nombres impairs se trouvant entre ces deux entiers, inclus. Vous devez afficher ces nombres, en les séparant uniquement d'un espace.
si je lis bien, il n'est pas question de manipuler des strings, ni de retourner quoi que ce soit ... ?
def impair(x,y):
x,y = sorted((x,y))
for i in range(x|1,y+1,2): print i,
EDIT:
damned, j'avais pas vu que Dentuk l'avait déjà proposé ...
Bonjour, je ne comprends pas pourquoi mon code marche pas, le voici:
print("Entrez le premier nombre:")
A = int(input())
print("Entrez un second nombre")
B = int(input())
print("Les nombres impaires entre", A, "et", B, "sont:")
for i in range(abs(B-A)):
if i == 1 % 2:
print(i)
Aussi, comment pourrais-je faire en sorte de récupérer les deux nombres en meme temps? Du style "Entrez deux nombres"
Ta boucle for ne peut pas fonctionner. Si je te demande les nombres impairs entre 10 et 20, ta boucle for va de 0 à 9, impossible qu'il sélectionne les bons chiffres.
Pour récupérer deux nombres en même temps, tu pourrais demander d'entrer les nombres sous la forme "X Y" puis split la chaîne avec l'espace et transtyper X et Y en entier, mais bon, c'est compliqué pour pas grand-chose.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Python c'est bon, mangez-en.