You are not logged in.
The forum to cure all your computer anxieties
Pages: 1
J’ai enfin fini le défi qui demandait de créer une fonction permettant de convertir les nombres entres différentes bases. Je pense qu’il est encore à améliorer, merci d’avance si vous m’aidez à le faire
def versbase10(nb:str,base:int)->int:
"""
Convertit un nombre dans une base comprise entre 2 et 36 inclus vers la base 10
versbase10(2F3B,16)
>>>12091
"""
nb=str(nb)
nb=nb.upper() #sert à mettre des majuscules
try:
base = int(base) #on essaie de convertir la base en un entier
assert base>1 # erreur d'assertion si la base est plus petite que 2
assert base<37 # erreur d'assertion si la base est plus grande que 36
except ValueError: #si la conversion ne marche pas
print("La base doit être un nombre")
except AssertionError: #si il y a une erreur d'assertion
print("La base doit être comprise entre 2 et 36")
else: # si il n'y a pas d'erreur
alphabet="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
nombre=[] #liste vide
for x in range(len(nb)):
for y in range(len(alphabet)):
if nb[x]==alphabet[y]:
nombre.append(y)
#on verifie pour chaque caractère à quelle nombre il correspond
#permet de remplacer les lettres par les nombres correspondants et les place dans la liste
#
result = nombre[0]
if len(nb)==1:
nombre.append(0)
for k in range (len(nb)-1):
result=result*base
result = result + nombre[k+1]
return result
def depuisbase10(nb:int,base:int)->str:
"""
Convertit un nombre en base 10 vers une base comprise entre 2 et 36
depuisbase10(12091,16)
>>>"2F3B"
"""
try:
nb=int(nb)
base=int(base)
assert base>1
assert base<37
except ValueError:
print("Il faut saisir des nombres")
except AssertionError:
print("La base doit être comprise entre 2 et 36")
else:
alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
result = ""
while nb!=0:
reste=nb%base
nb=int(nb/base)
result=alphabet[reste]+result
return result
def conv_base(nombre:str,base_depart:int,base_arrivee:int):
"""
Convertit un nombre d'une base vers une autre
conv_base("1101",2,16)
>>>"D"
"""
result=versbase10(nombre,base_depart)
result=depuisbase10(result,base_arrivee)
return result
Offline
Louis, ce n'est pas lisible. En s'intéressant de temps en temps à ce qui se passe en classe, vous sauriez que l'on doit mettre le code entre des balises pour utiliser une mise en forme adaptée.
Il serait d'ailleurs PLUS D'ACTUALITÉ de programmer tout ceci en BASH
Donc, avec la coloration syntaxique cela donne :
def depuisbase10(nb:int,base:int)->str:
"""
Convertit un nombre en base 10 vers une base comprise entre 2 et 36
depuisbase10(12091,16)
>>>"2F3B"
"""
try:
nb=int(nb)
base=int(base)
assert base>1
assert base<37
except ValueError:
print("Il faut saisir des nombres")
except AssertionError:
print("La base doit être comprise entre 2 et 36")
else:
alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
result = ""
while nb!=0:
reste=nb%base
nb=int(nb/base)
result=alphabet[reste]+result
return result
def conv_base(nombre:str,base_depart:int,base_arrivee:int):
"""
Convertit un nombre d'une base vers une autre
conv_base("1101",2,16)
>>>"D"
"""
result=versbase10(nombre,base_depart)
result=depuisbase10(result,base_arrivee)
return result
Offline
Il ne faut pas utiliser try except car on n'en a pas parlé. L'usage qui en est fait ici est maladroit. Mieux vaut se contenter d'assert.
De plus, pourquoi passer par la base 10 ?
Offline
Le principe est cependant bon. Voici une version un peu simplifiée :
et par exemple:
In [27]: convert(0o755, 16)
Out[27]: '1ED'
In [28]: convert(0o755, 10)
Out[28]: '493'
In [29]: convert(755, 10)
Out[29]: '755'
In [30]: convert(755, 16)
Out[30]: '2F3'
In [31]: convert(755, 36)
Out[31]: 'KZ'
Défi : l'écrire en Bash
Offline
Pages: 1