2015-09-11 2 views
0

En m'enseignant python en ce moment et j'essaye de faire un simple script de paiement, j'ai touché un peu un bloc ici, j'ai essayé d'utiliser une fonction pour construire simple envoi paiement entre deux clients en utilisant la compréhension de la listePython: Changer la valeur d'une instance à partir d'une compréhension de liste

def sendpayment(sender, recipient, amount): 

    [(print(x.balance - amount),print(y.balance + amount)) for x in Account.accountList 
       for y in Account.accountList 
         if x.name == sender and y.name == recipient] 

Cela fonctionne bien jusqu'à ce que j'essaie de voir si le nouvel équilibre a été mis à jour pour les deux clients, Comme vous pouvez le voir ci-dessous une fois que je lance A.balance après avoir exécuté la fonction sendpayment, rien ne change sur les deux instances client. Ce que j'espérais réaliser, c'est que l'équilibre des deux attributs change une fois que cette fonction est exécutée.

>>> A = Account("Alice", 100) 
>>> B = Account("Bob", 50) 
>>> Account.sendpayment("Alice", "Bob", 10) 
90 
60 
>>> A.balance 
100 
>>> B.balance 
50 

Voici la suite du code afin que vous obteniez une idée plus large du reste des classes client et compte dans le script.

class Customer: 


    def __init__(self, name, balance): 
     self.name = name 
     self.balance = balance 

    def __repr__(self): 
     return repr(self.__dict__) 

    def __getitem__(self, i): 
     return getattr(self, i,) 

class Account: 

    accountList = [] 

    def __init__(self, name, balance): 
     self.customer = Customer(name, balance) 
     Account.accountList.append(self) 

    def __repr__(self): 
     return repr(self.__dict__) 

    def __getitem__(self, i): 
     return getattr(self, i) 

    def __getattr__(self, attr): 

     return getattr(self.customer, attr) 


    def sendpayment(sender, recipient, amount): 

     [(print(x.balance - amount),print(y.balance + amount)) for x in Account.accountList 
       for y in Account.accountList 
         if x.name == sender and y.name == recipient] 
+2

Pourquoi est-ce que modifier les instances? Vous calculez une nouvelle valeur et l'imprimez, il n'y a pas d'affectation. N'utilisez pas la compréhension des listes pour les effets secondaires, utilisez simplement les boucles 'for' normales. – jonrsharpe

+0

J'ai peut-être pensé à tort que la compréhension est en train de gérer le devoir, je pensais que tout ce que vous pouviez faire dans une boucle for que vous pourriez faire dans une liste de compréhension? – cyclopse87

+0

Non seulement il y a des choses que vous ne pouvez pas faire, mais il y en a d'autres que vous ne devriez pas faire! Un comp liste est un bon remplacement pour beaucoup de 'append's, mais il y a beaucoup de choses qui ont plus de sens que les boucles conventionnelles. – jonrsharpe

Répondre

1
def sendpayment(sender, recipient, amount): 
    #first fetch the sender and recipient accounts 
    '''Previously had 
    for s in Account.accountList: 
     if s.name == sender: 
      break 
    for r in Account.accountList: 
     if r.name == recipient: 
      break 
    ''' 
    s = filter(lambda x: x.name == sender, Account.accountList)[0] 
    r = filter(lambda x: x.name == recipient, Account.accountList)[0] 
    r.balance += amount 
    s.balance -= amount 
    print(r.balance, s.balance) 
+0

Que faire si 's.balance jonrsharpe

+0

Je vais mettre la validation bientôt, donc il n'est pas possible d'envoyer sans expéditeur ayant la valeur du montant, Comment suggéreriez-vous de faire la boucle for sans la fuite variable? – cyclopse87

+0

a supprimé la pause. Il peut y avoir plusieurs façons, mais j'ai pensé qu'il était logique pour un débutant d'utiliser des pauses. Des cloches et des sifflets supplémentaires pour «montant», etc. pourraient ne pas être le point de la question. – kmad1729