Here's my code: I don't know why but I cant find my errors. It's a game that aims to remove pairs from your deck and have no more pairs. The name of the game is called mistrigry or lousy.
import random
def attend_le_joueur():
'''()->None
Pause le programme jusqu'au l'usager appui Enter
'''
try:
input("Appuyez Enter pour continuer. ")
except SyntaxError:
pass
def prepare_paquet():
'''()->list of str
Retourne une liste des chaines de caractères qui représente tous les cartes,
sauf le valet noir.
'''
paquet=[]
couleurs = ['\u2660', '\u2661', '\u2662', '\u2663']
valeurs = ['2','3','4','5','6','7','8','9','10','J','Q','K','A']
for val in valeurs:
for couleur in couleurs:
paquet.append(val+couleur)
paquet.remove('J\u2663') # élimine le valet noir (le valet de trèfle)
return paquet
def melange_paquet(p):
'''(list of str)->None
Melange la liste des chaines des caractères qui représente le paquet des cartes
'''
random.shuffle(p)
def donne_cartes(p):
'''(list of str)-> tuple of (list of str,list of str)
Retournes deux listes qui représentent les deux mains des cartes.
Le donneur donne une carte à l'autre joueur, une à lui-même,
et ça continue jusqu'à la fin du paquet p.
'''
donneur=[]
autre=[]
var = 1
for i in range(len(p)):
if var == 0:
donneur.append(p[i])
var = 1
elif var == 1:
autre.append(p[i])
var = 0
return(donneur,autre)
def elimine_paires(l):
'''
(list of str)->list of str
Retourne une copy de la liste l avec tous les paires éliminées
et mélange les éléments qui restent.
Test:
(Notez que l’ordre des éléments dans le résultat pourrait être différent)
>>> elimine_paires(['9♠', '5♠', 'K♢', 'A♣', 'K♣', 'K♡', '2♠', 'Q♠', 'K♠', 'Q♢', 'J♠', 'A♡', '4♣', '5♣', '7♡', 'A♠', '10♣', 'Q♡', '8♡', '9♢', '10♢', 'J♡', '10♡', 'J♣', '3♡'])
['10♣', '2♠', '3♡', '4♣', '7♡', '8♡', 'A♣', 'J♣', 'Q♢']
>>> elimine_paires(['10♣', '2♣', '5♢', '6♣', '9♣', 'A♢', '10♢'])
['2♣', '5♢', '6♣', '9♣', 'A♢']
'''
resultat=[]
if len(l) < 2:
return 1
l.sort()
l.append([''])
a = 1
while a < len(l):
if l[a-1][:-1] != l[a][:-1]:
resultat.append(l[a-1])
a = a + 1
else:
a = a + 2
random.shuffle(resultat)
return resultat
def affiche_cartes(p):
'''
(list)-None
Affiche les éléments de la liste p séparées par d'espaces
'''
for i in p:
print(p[i], end = ' ')
def entrez_position_valide(n):
'''
(int)->int
Retourne un entier du clavier, de 1 à n (1 et n inclus).
Continue à demander si l'usager entre un entier qui n'est pas dans l'intervalle [1,n]
Précondition: n>=1
'''
v = str(n)
s = int(input("S'il vous plait, veuillez entrer un entier de 1 à "+ v +":"))
while s > n or n < 1:
s = int(input("S'il vous plait, veuillez entrer un entier de 1 à "+ v +":"))
return (s)
def joue():
'''()->None
Cette fonction joue le jeu'''
p=prepare_paquet()
melange_paquet(p)
tmp=donne_cartes(p)
donneur=tmp[0]
humain=tmp[1]
donneur=elimine_paires(donneur)
humain=elimine_paires(humain)
print("Bonjour. Je m'appelle Robot et je distribue les cartes.")
print("Votre main est:")
affiche_cartes(humain)
print("Ne vous inquiétez pas, je ne peux pas voir vos cartes ni leur ordre.")
print("Maintenant défaussez toutes les paires de votre main. Je vais le faire moi aussi.")
attend_le_joueur()
tour = 0
while (tour <= 1 and tour >= 0):
if len(humain) == 0:
print("J'ai fini avec toutes mes cartes")
print("L'humain, vous avez gagné")
break
elif len(donneur) == 0:
print("J'ai fini avec toutes mes cartes")
print("Le robot à gagné")
break
else:
if tour == 0:
print("C'est à votre tour")
print("Vos cartes sont:")
affiche_cartes(humain)
v = len(donneur)
print("J'ai", n, "carte(s). Si 1 est ma première carte" + str(v), "la position de ma dernière carte, quelle carte voudriez-vous dans votre paquet?")
alt = entrez_position_valide(v)
if alt == 1:
print("voici la première carte que vous avez demandé")
else:
print("vous m'avez demandé cette n-ième carte:"+str(alt)+".")
print("voila" +donneur[int(alt)-1])
print(donneur[int(alt)-1], "votre nouvelle main est:")
humain.append(donneur[int(alt)-1])
donneur.remove(donneur[int(alt)-1])
affiche_cartes(humain)
print("Après avoir enlever les paires, votre main est:")
humain = elimine_paires(humain)
affiche_cartes(humain)
tour = 1
attend_le_joueur()
if tour == 1:
print("mon tour")
c = len(humain)
alt = random. randit(1, c)
if alt == 1:
print('Jai pris la première carte')
else:
print('Jai pris votre' + str(alt) + 'carte')
donneur.append(humain[int(alt) - 1])
humain.remove(humain[int(alt) - 1])
donneur = elimine_paires(donneur)
tour = 0
attend_le_joueur()
joue()
You have to change this
def affiche_cartes(p):
'''
(list)-None
Affiche les éléments de la liste p séparées par d'espaces
'''
for i in p:
print(p[i], end = ' ')
To
def affiche_cartes(p):
'''
(list)-None
Affiche les éléments de la liste p séparées par d'espaces
'''
for i in p:
print(i, end = ' ')
Your p Variable is a list of strings and you used a for each loop, which means i is an element of p and not an index.
Related
I have an exercise where I need to know how much the distributor will give back to the customer who bought a product. (constraint: the refund has to be done just with 50 cents, 1€(100 cents) and 2€(200 cents) coins
I can do the calculation to find out how much the distributor should refund.
But the problem I encounter is to try to display the number of coins that make up the total refunded to the customer
Here is what I have done so far :
coins = {200: 5, 100: 3, 50: 2, 20: 4, 10: 10, 5: 20, 2: 100, 1: 100}
# Dictionnaire des quantités de chaque valeur de pièce rendue
change_given = {200: 0, 100: 1, 50: 0, 20: 0, 10: 0, 5: 0, 2: 0, 1: 0}
def min_num_coins(amount, change_given):
# Initialiser le compteur de pièces à zéro
num_coins = 0
# Pour chaque valeur de pièce, tant que la somme est supérieure à la valeur de la pièce
for value in sorted(coins, reverse=True):
while amount >= value and coins[value] > 0:
# Incrémenter le compteur de pièces
num_coins += 1
# Soustraire la valeur de la pièce de la somme
amount -= value
# Décrémenter la quantité disponible de cette valeur de pièce
coins[value] -= 1
# Incrémenter la quantité de cette valeur de pièce rendue
change_given[value] += 1
# Retourner le nombre de pièces et les pièces rendues
return num_coins, change_given
# Demander au client de saisir le montant du produit
amount_owed = int(input("Entrez le montant du produit (en euros): "))
# Demander au client de saisir le montant payé
amount_given = int(input("Entrez le montant payé (en euros): "))
# Calculer la somme due
change_due = amount_given - amount_owed
# Séparer la somme due en euros et centimes
euros, centimes = divmod(change_due, 100)
# Appeler la fonction pour obtenir le nombre minimum de pièces
num_coins, coins_given = min_num_coins(centimes, change_given)
# Afficher le résultat
print(f"Il faut rendre {centimes} € et {euros} centimes en {num_coins} pièce(s)")
# Générer un message qui affiche les pièces rendues au client
change_message = "Pièces rendues: "
for value, quantity in coins_given.items():
if quantity > 0:
change_message += f"{quantity} x {value // 100} €, "
change_message = change_message[:-2]
# Afficher le message
print(change_message)
The error I get when I want to get the number of coins (the example is: the product costs 5€, the customer gives 10€, the distributor gives back 5€ but says he gives 5€ in one coin).
Here is the message I get:
20 € and 0 cents must be returned in 1 coin(s)
Coins returned: 1 x €1, 1 x €0.
Closed. This question is not reproducible or was caused by typos. It is not currently accepting answers.
This question was caused by a typo or a problem that can no longer be reproduced. While similar questions may be on-topic here, this one was resolved in a way less likely to help future readers.
Closed 2 years ago.
Improve this question
for school I have to make a chained list in python with all the useful command. I made it with a friend on his windows computer and it work well.
The problem is, when i launch it on Linux, on Arch or on my Debian docker, it return :
>>> A= Liste(1,2,3,4,3,5,6,7)
>>> A
<Liste.Liste object at 0x7f26a0903278>
I can copy-paste the code, but as a french, my professor don't want that I write my code in English.
class Liste: #création de la classe
#initialisation de l'objet
def __init__(self, *elements):
self.list = [None, None] #inititialisation de la liste
for element in elements: #pour chaque élémment de la liste
if self.list[0] == None: #si le 1er élément la liste est vide
self.list[0] = element #le 1er élement de la liste devient élément
suivant = self.list #et suivant deviens la liste
else:
suivant[1] = [element, None] #sinon, le 2e élément de la liste devient [élément, None]
suivant = suivant[1] #et suivant avance dans la liste chainée
#ajouter un élément à la liste
def ajouter(self, element):
suivant = self.list #suivant devient la liste
while suivant[1] != None: #tant que le deuxième émént du duo n'est pas None
suivant = suivant[1] #suivant avance dans la liste chainée
suivant[1] = [element, None] #quand suivant à atteind le None, il remplace le None par l'élément
#inserer un élément dans une liste à un indice donné
def inserer(self, index, element):
suivant = self.list #suivant devient la liste
for _ in range(index-1): #on atteind le
suivant = suivant[1] #bon rang
suivant[1] = [element, suivant[1]] #on insère le bon élément à la bonne place
#acceder à un rang particulier
def acceder(self, index):
suivant = self.list #suivant devient la liste
for _ in range(index): #on atteind le bon rang
suivant = suivant[1]
return suivant[0]
#longueur de la liste avec len
def __len__(self):
suivant = self.list #suivant devient la liste
i = 0 #on crée un indice pour compter
if self.list[0] == None: #si le première élément du duo est vaut None
return i #la liste fait i éléments
else:
while suivant[1] != None: #sinon, tant que la dervière valeur du duo n'est pas nulle
i += 1 # i prend un point en plus
suivant = suivant[1] #et on avance dans la liste
return i+1 # et on retourne i+1
#supprimer un valeur à un indice donné
def supprimer_ind(self, index):
suivant = self.list #suivant devient la liste
for _ in range(index-1): #on se déplace
suivant = suivant[1] #jusqu'à l'élément que l'on veut supprimer
suivant[1] = suivant[1][1] #et on l'écrase avec la valeur suivante
#pour remplacer la liste
def remplacer(self, index, valeur):
suivant = self.list #On lui donne la valeur de la liste
for _ in range(index): #on se déplace
suivant = suivant[1] #jusqu'à l'élément que l'on veut modifier
suivant[0] = valeur #et on modifie la valeur
def supprimer_val(self, valeur):
ancien = None
suivant = self.list #On lui donne la valeur de la liste
while suivant[0] != valeur: #tant que la valeur de suivant[0] n'est pas égale à la valeur demandée,
ancien = suivant #on sauvegarde suivant
suivant = suivant[1] #et on avance dans la liste
if ancien == None: #si ancien est vide, alors on supprime la premiève valeur
suivant[0] = suivant[1][0]
suivant[1] = suivant[1][1]
else:
ancien[1] = suivant[1] #sinon, on remplace ancien par suivant[1]
#on vide la liste
def vider(self):
self.list = [None, None] #on remet à zéro la valeur de la liste
def __repr__(self):
suivant = self.list #suivant devient la liste
objet = "|"
while suivant[1] != None: #tant que le deuxième émént du duo n'est pas None
objet += str(suivant[0]) + ", "
suivant = suivant[1] #suivant avance dans la liste chainée
objet += str(suivant[0]) + "|"
return f'{objet}'
__repr__ magic is responsible for object representation formatting. You've messed up the indentation in def vider ... line. Here is a quickfix:
#on vide la liste
def vider(self):
self.list = [None, None] #on remet à zéro la valeur de la liste
def __repr__(self):
suivant = self.list #suivant devient la liste
objet = "|"
while suivant[1] != None: #tant que le deuxième émént du duo n'est pas None
objet += str(suivant[0]) + ", "
suivant = suivant[1] #suivant avance dans la liste chainée
objet += str(suivant[0]) + "|"
return f'{objet}'
Liste(1, 2, 3) returns |1, 2, 3|, as expected.
the value which is supposed to be returned is valid!!!!
The print(self.affichage) just above shows that it works!!!!
Why does it not return it ??? (the very last return)
so this code is a Polish Reverse Notation calculus :
you read it from left to right, the numbers are stored in a pile, and the operands apply to the two upper numbers of the pile (the two most recent)
# here comes the actual code :
class Calculatrice():
# création de la mémoire de la calculatrice
def __init__(self):
self.pile = []
self.affichage = []
def traitement(self,element):
# opérateur
if element in "+-*/":
# on vérifie qu'il y a les nombres suffisants pour effectuer ces opérations
if len(self.pile) > 1:
# addition
if element == "+":
resultat = self.pile[-2] + self.pile[-1]
# soustraction
elif element == "-":
resultat = self.pile[-2] - self.pile[-1]
# multiplication
elif element == "*":
resultat = self.pile[-2] * self.pile[-1]
# division
elif element == "/":
resultat = self.pile[-2] / self.pile[-1]
# ATTENTION : dans les cas de ces opérations, seuls deux nombres sont nécessaire,
# donc on peut généraliser les deux actions suivantes, mais ça ne devrait pas forcément être le cas.
# on dépile les nombres traités
del self.pile[len(self.pile)-2:]
# on empile le résultat
self.pile.append(resultat)
return True
elif len(self.pile) == 1:
if element == "*":
# erreur : pas assez de nombres pour effectuer une multiplication
print("Erreur 03 : Pas assez de nombres pour effectuer la multiplication.")
return False
elif element == "/":
# erreur : pas assez de nombres pour effectuer une division
print("Erreur 04 : Pas assez de nombres pour effectuer la division.")
return False
# si c'est une addition, on considère qu'on ajoute le nombre à 0, donc la pile ne change pas
else:
# si c'est une soustraction, on empile son opposé à la place du nombre
if element == "-":
self.pile[-1] = (self.pile[-1] * (-1))
return True
# la taille de la pile = 0, c-à-d. qu'aucun nombre n'a été stocké au préalable
else:
print("Erreur 02 : Pas assez de nombres pour effectuer une opération.")
return False
else:
for car in element:
if car not in "0123456789.":
# erreur : caractère non reconnu
print("Erreur 01 : La commande n'a pas été comprise.")
return False
# si on est arrivé jusqu'ici, on va considérer que c'est bon et que c'est un nombre
# on empile l'élément
self.pile.append(float(element))
return True
def npi(self,chaine):
# si la récurrence n'est pas à sa limite
if len(chaine) != 0:
# on vérifie qu'il y a des espaces
if " " in chaine:
# on parcourt la chaine jusqu'à l'espace suivant
i = 0
temp = ""
while chaine[i] != " ":
temp = temp+chaine[i]
i += 1
# on a fini d'extraire cet élément : on le traite.
traitement = self.traitement(temp)
# si il y a eu des erreurs de traitement : on arrête tout.
if traitement == False:
return ["Erreur"]
else:
# on continue de traiter le reste de la chaîne
self.npi(chaine[i+1:])
else:
# il n'y a pas d'espace, donc il n'y a qu'un seul élément : on le traite.
traitement = self.traitement(chaine)
# si il y a eu des erreurs de traitement : on arrête tout.
if traitement == False:
return ["Erreur"]
# on a fini, on sort du if
self.npi("")
else:
# la chaîne est vide : tous les éléments ont été traités. On renvoie le résultat final et on réinitialise la pile.
self.affichage = self.pile.pop()
print(self.affichage)
return self.affichage
c = Calculatrice()
print(c.npi("2 3 + 4 -"))
# doit retourner 1
You are returning a value only in the base-case. For the recursive cases in npi you are not returning anything (i.e. returning None). The printed value comes from inside a recursive call, the return value from that call is lost once you go back to the calling method.
You need to add return statements for the recursive cases in npi
def npi(self,chaine):
# si la récurrence n'est pas à sa limite
if len(chaine) != 0:
# on vérifie qu'il y a des espaces
if " " in chaine:
# on parcourt la chaine jusqu'à l'espace suivant
i = 0
temp = ""
while chaine[i] != " ":
temp = temp+chaine[i]
i += 1
# on a fini d'extraire cet élément : on le traite.
traitement = self.traitement(temp)
# si il y a eu des erreurs de traitement : on arrête tout.
if traitement == False:
return ["Erreur"]
else:
# on continue de traiter le reste de la chaîne
return self.npi(chaine[i+1:]) # HERE
else:
# il n'y a pas d'espace, donc il n'y a qu'un seul élément : on le traite.
traitement = self.traitement(chaine)
# si il y a eu des erreurs de traitement : on arrête tout.
if traitement == False:
return ["Erreur"]
# on a fini, on sort du if
return self.npi("") # HERE
else:
# la chaîne est vide : tous les éléments ont été traités. On renvoie le résultat final et on réinitialise la pile.
self.affichage = self.pile.pop()
print(self.affichage)
return self.affichage
You call npi recursively. In the last call the traitement variable is True.
But your code looks like the following:
if traitement == False:
return ["Erreur"]
else:
# on continue de traiter le reste de la chaîne
self.npi(chaine[i+1:])
and exits the function without returning anything. Therefore, you get the None object, when trying to print.
I am writing a code to solve second-grade equations and it works just well.
However, when I input the following equation:
x^2 + (10^(20) + 10^(-20)) + 1 = 0
(Yes, my input is 10**20 + 10**(-20)
I get:
x1 = 0 x2 = -1e+20
However, it is taking (10^(20) + 10^(-20) as 10e+20 while, if you do the math:
Here is the LaTeX formatted formula:
Which is almost 10^20 but not 10^20.
How can I get the exact result of that operation so I can get the exact value of the equation in x2?
My code is the following:
#===============================Función para obtener los coeficientes===============================
#Se van a anidar dos funciones. Primero la de coeficientes, luego la de la solución de la ecuación.
#Se define una función recursiva para obtener los coeficientes de la ecuación del usuario
def cof():
#Se determina si el coeficiente a introducir es un número o una cadena de operaciones
op = input("Si tu coeficiente es un número introduce 1, si es una cadena de operaciones introduce 2")
#Se compara la entrada del usuario con la opción.
if op == str(1):
#Se le solicita el número
num = input("¿Cuál es tu número?")
#Se comprueba que efectívamente sea un número
try:
#Si la entrada se puede convertir a flotante
float(num)
#Se establece el coeficiente como el valor flotante de la entrada
coef = float(num)
#Se retorna el valor del coeficiente
return coef
#Si no se pudo convertir a flotante...
except ValueError:
#Se le informa al usuario del error
print("No introdujiste un número. Inténtalo de nuevo")
#Se llama a la función de nuevo
return cofa()
#Si el coeficiente es una cadena (como en 10**20 + 10**-20)
elif op == str(2):
#La entrada se establece como la entrada del usuario
entrada = input("Input")
#Se intenta...
try:
#Evaluar la entrada. Si se puede...
eval(entrada)
#El coeficiente se establece como la evaluación de la entrada
coef = eval(entrada)
#Se regresa el coeficiente
return coef
#Si no se pudo establecer como tal...
except:
#Se le informa al usuario
print("No introdujiste una cadena de operaciones válida. Inténtalo de nuevo")
#Se llama a la función de nuevo
return cofa()
#Si no se introdujo ni 1 ni 2 se le informa al usuario
else:
#Se imprime el mensaje
print("No introdujiste n ni c, inténtalo de nuevo")
#Se llama a la función de nuevo
return cof()
#===============================Función para resolver la ecuación===============================
#Resuelve la ecuación
def sol_cuadratica():
#Se pide el valor de a
print("Introduce el coeficiente para a")
#Se llama a cof y se guarda el valor para a
a = cof()
#Se pide b
print("Introduce el coeficiente para b")
#Se llama cof y se guarda b
b = cof()
#Se pide c
print("Introduce el coeficiente para c")
#Se llama cof y se guarda c
c = cof()
#Se le informa al usuario de la ecuación a resolver
print("Vamos a encontrar las raices de la ecuación {}x² + {}x + {} = 0".format(a, b, c))
#Se analiza el discriminante
discriminante = (b**2 - 4*a*c)
#Si el discriminante es menor que cero, las raices son complejas
if discriminante < 0:
#Se le informa al usuario
print("Las raices son imaginarias. Prueba con otros coeficientes.")
#Se llama a la función de nuevo
return sol_cuadratica()
#Si el discriminante es 0, o mayor que cero, se procede a resolver
else:
#Ecuación para x1
x1 = (-b + discriminante**(1/2))/(2*a)
#Ecuación para x2
x2 = (-b - discriminante**(1/2))/(2*a)
#Se imprimen los resultados
print("X1 = " + str(x1))
print("X2 = " + str(x2))
sol_cuadratica()
Ignore the comments, I'm from a Spanish-speaking country.
The limitations of the machine floating point type is the reason why when adding a very small number to a very big number, the small number is just ignored.
This phenomenon is called absorption or cancellation.
With custom floating point objects (like the ones decimal module) you can achieve any precision (computations are slower, because floating point is now emulated, and not relying on the machine FPU capabilities anymore)
From the decimal module docs:
Unlike hardware based binary floating point, the decimal module has a user alterable precision (defaulting to 28 places) which can be as large as needed for a given problem
This can be achieved by changing the following global parameter decimal.getcontext().prec
import decimal
decimal.getcontext().prec = 41 # min value for the required range
d = decimal.Decimal(10**20)
d2 = decimal.Decimal(10**-20)
now
>>> d+d2
Decimal('100000000000000000000.00000000000000000001')
As suggested in comments, for the small number it's safer to let decimal module handle the division by using power operator on an already existing Decimal object (even if here, the result is the same):
d2 = decimal.Decimal(10)**-20
So you can use decimal.Decimal objects for your computations instead of native floats.
I'm coding a project, in which I have 2 files (dataStructure.py and calculUser.py) working together and 1 which is a test file.
In structureDonnees.py I have this function which reads a dataset containing cars and builds data structures :
# -*-encoding:utf-8-*-
import csv
import sys #pour utiliser maximum et minimum du type float
from calculUser import *
from trajetUser import *
def recupVoiture() :
#nom de la base de donnée
nomFichier = 'CO2_passenger_cars_v10.csv'
#on ouvre le fichier en lecture
opener = open(nomFichier, "r")
#On ouvre le fichier nomFichier en lecture
lectureFichier = csv.reader(opener, delimiter='\t')
#le dico contenant les carburants
fuelType = dict()
#le dico contenant les voitures
voiture = dict()
#le dico contenant les émissions de CO2 en g/km
emission = dict()
#minimum et maximum emission
min_emission = sys.float_info.max #initialisé à max(float) pour que l'on soit sûr que toutes les emissions soient plus petites
max_emission = sys.float_info.min #initialisé à min(float) pour que l'on soit sûr que toutes les emissions soient plus grandes
for row in lectureFichier :
#Si la colonne existe
if row:
#construction du dictionnaire voiture
if voiture.has_key(row[10]) :
if row[11].upper() not in voiture[row[10]] : voiture[row[10]].append("%s" %row[11].upper()) #on ajoute le modèle
else :
voiture[row[10]] = [] #on crée une liste vide contenant les modèles et leurs versions
voiture[row[10]].append("%s" %row[11]) #on ajoute le modèle et sa version
#construction du dictionnaire fuelType
if fuelType.has_key(row[10]) : fuelType[row[10]].append(row[19].upper()) #ajout du type de carburant utilisé par la voiture correspondante dans voiture{}
else :
fuelType[row[10]] = [] #on crée une liste vide contenant les carburants
fuelType[row[10]].append(row[19]) #ajout du type de carburant utilisé par la voiture correspondante dans voiture{}
#construction du dictionnaire emission
if emission.has_key(row[10]) :
emission[row[10]].append(row[14]) #ajout de la quantité de CO2 émise par la voiture correspondante dans voiture{}
min_emission = minEmission(float(row[14]), min_emission)
max_emission = maxEmission(float(row[14]), max_emission)
else :
emission[row[10]] = [] #on crée une liste vide contenant les émissions en CO2
fuelType[row[10]].append(row[14]) #ajout de la quantité de CO2 émise par la voiture correspondante dans voiture{}
min_emission = minEmission(float(row[14]), min_emission)
max_emission = maxEmission(float(row[14]), max_emission)
#On ferme le fichier
opener.close()
#La valeur de retour est un tableau contenant les structures de données générées.
res = [voiture, fuelType, emission, min_emission, max_emission]
return res
In the calculUser.py, I defined the minEmission and maxEmission function :
def minEmission(emissionFichier, min_emission) :
if emissionFichier < min_emission :
min_emission = emissionFichier
return min_emission
def maxEmission(emissionFichier, max_emission) :
if emissionFichier > max_emission :
max_emission = emissionFichier
return max_emission
When I'm executing test.py, I get an error with this line :
table = recupVoiture()
Traceback (most recent call last):
File "test.py", line 13, in <module>
tableau = recupVoiture()
File "/home/user/Polytech/ge3/ProjetPython/structureDonnees.py", line 60, in recupVoiture
min_emission = minEmission(float(row[14]), min_emission)
NameError: global name 'minEmission' is not defined
I don't understand why I get this error. By executing everything except test.py I get no error but when I do it doesn't execute due to this minEmission and maxEmission not defined.
Is it because I'm calling a function when I'm defining a function?
How could I fix it?
I fixed the problem, it seems like my functions minEmission() and maxEmission() couldn't do a reference to max_emission and min_emission since those variables are declared in structureDonnees.py and not in calculUser.py.
I fixed it by creating an intermediary variable which takes the value of min_emission and max_emission and which is returned, instead of min_emission and max_emission.
Plus, I had to do a : from calculUser import minEmission, maxEmissiondirectly in the recupVoiture() function. I know that's awful but it solved the problem. I'll use it until I find a better, cleaner solution.
Thanks for the help guys, I'll do a better post/code if I have to ask any other help ! :)