Οι περισσότεροι Pythonic τρόπο ισοδύναμο για: while (! (X = next ()) = END)

ψήφοι
9

Ποια είναι η καλύτερη ιδίωμα Python για αυτό το κατασκεύασμα C;

while ((x = next()) != END) {
    ....
}

Δεν έχω τη δυνατότητα να recode επόμενη ().

ενημέρωση: και η απάντηση φαίνεται να είναι:

for x in iter(next, END):
    ....
Δημοσιεύθηκε 26/08/2008 στις 17:37
πηγή χρήστη
Σε άλλες γλώσσες...                            


7 απαντήσεις

ψήφοι
2

Ίσως δεν είναι τρομερά ιδιωματισμούς, αλλά θα ήθελα να έχουν την τάση να πάει με

x = next()
while x != END:
    do_something_with_x
    x = next()

... αλλά αυτό είναι επειδή θεωρώ ότι το είδος του πράγματος είναι εύκολο να διαβάσει

Απαντήθηκε 26/08/2008 στις 17:42
πηγή χρήστη

ψήφοι
1

Τι προσπαθούμε να κάνουμε εδώ; Εάν επανάληψη πάνω από μια λίστα, μπορείτε να χρησιμοποιήσετε for e in Lόπου e είναι το στοιχείο και L είναι η λίστα. Εάν το φιλτράρισμα μια λίστα, μπορείτε να χρησιμοποιήσετε λίστα Η κατανόηση (δηλαδή [ e for e in L if e % 2 == 0 ]να πάρετε όλα τα ζυγοί αριθμοί σε μια λίστα).

Απαντήθηκε 26/08/2008 στις 17:42
πηγή χρήστη

ψήφοι
5

Εξαρτάται λίγο τι θέλετε να κάνετε. Για να ταιριάζει με το παράδειγμά σας όσο το δυνατόν περισσότερο, θα ήθελα να κάνω την επόμενη γεννήτρια και επαναλήψεις πάνω του:

def next():
   for num in range(10):
      yield num

for x in next():
   print x
Απαντήθηκε 26/08/2008 στις 17:44
πηγή χρήστη

ψήφοι
1

Αν χρειαστεί να το κάνετε αυτό περισσότερο από μία φορά, η pythonic τρόπος θα ήταν να χρησιμοποιήσετε ένα iterator

for x in iternext():
    do_something_with_x

όπου iternextθα ορίζεται χρησιμοποιώντας κάτι σαν ( ρητή είναι καλύτερη από ό, τι υπονοείται! ):

def iternext():
    x = next()
    while x != END:
        yield x
        x = next()        
Απαντήθηκε 26/08/2008 στις 17:49
πηγή χρήστη

ψήφοι
4

Σύντομη απάντηση: δεν υπάρχει τρόπος να γίνει ανάθεση σε σειρά μεταβλητών σε ένα βρόχο, ενώ στην Python. Αυτό σημαίνει ότι εγώ δεν μπορούμε να πούμε:

while x=next():
    // do something here!

Επειδή αυτό δεν είναι δυνατό, υπάρχουν μια σειρά από «ιδιωματικά σωστό» τρόπο για να γίνει αυτό:

while 1:
    x = next()
    if x != END:
        // Blah
    else:
        break

Προφανώς, αυτό είναι το είδος άσχημο. Μπορείτε επίσης να χρησιμοποιήσετε μια από τις προσεγγίσεις «iterator» που αναφέρονται παραπάνω, αλλά, και πάλι, που μπορεί να μην είναι ιδανική. Τέλος, μπορείτε να χρησιμοποιήσετε την προσέγγιση «πίτα τσέπη» που στην πραγματικότητα μόλις βρήκα ενώ googling:

class Pita( object ):
    __slots__ = ('pocket',)
    marker = object()
    def __init__(self, v=marker):
        if v is not self.marker:
            self.pocket = v
    def __call__(self, v=marker):
        if v is not self.marker:
            self.pocket = v
        return self.pocket

Τώρα μπορείτε να κάνετε:

p = Pita()
while p( next() ) != END:
    // do stuff with p.pocket!

Ευχαριστώ για αυτό το θέμα? μαθαίνοντας για το __call__ιδίωμα ήταν πραγματικά δροσερό! :)

EDIT: Θα ήθελα να δώσω πίστωση όπου η πίστωση αυτή οφείλεται. Ιδίωμα της «τσέπης πίτα» βρέθηκε εδώ

Απαντήθηκε 26/08/2008 στις 18:50
πηγή χρήστη

ψήφοι
1

Μπορείτε να μας δώσετε περισσότερες πληροφορίες σχετικά με το τι προσπαθείτε να πετύχετε; Δεν είναι σαφές για μένα γιατί δεν μπορούμε απλά να λέμε

for x in everything():
    ...

και έχουν την λειτουργία πάντα να επιστρέψει τα πάντα, αντί να γράφει ένα δίπλα συνάρτηση στο να επιστρέψει μόνο ένα πράγμα τη φορά. Γεννήτριες μπορεί ακόμη και να το κάνετε αυτό αρκετά αποτελεσματικά.

Απαντήθηκε 26/08/2008 στις 19:18
πηγή χρήστη

ψήφοι
14

απάντηση @Mark του Harrison:

for x in iter(next_, END):
    ....

Εδώ είναι ένα απόσπασμα από την τεκμηρίωση της Python :

iter(o[, sentinel])

Επιστροφή ένα αντικείμενο iterator. ... (απόκομμα) ... Αν το δεύτερο επιχείρημα, sentinel, είναι δεδομένη, τότε oπρέπει να είναι απαιτητών αντικείμενο. Η iterator που δημιουργήθηκε σε αυτή την περίπτωση θα καλέσει o χωρίς επιχειρήματα για κάθε κλήση προς της next()μεθόδου? αν η τιμή που επιστρέφεται είναι ίσο με sentinel, StopIterationθα αυξηθεί, διαφορετικά η τιμή θα πρέπει να επιστραφεί.

Απαντήθηκε 09/01/2009 στις 00:06
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more