Τα πάντα για την Python

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Re: Τα πάντα για την Python

Δημοσίευσηαπό Ilias95 » 28 Ιουν 2011, 17:03

Και μια ακόμη απορία.
Αν δώσουμε:

Κώδικας: Επιλογή όλων
lista = ['a', 'b', 'c', 'd', 'e']
for kati in lista:
print(kati)


Θα πάρουμε έξοδο τυπωμένο το κάθε αντικείμενο της λίστας.
Παρ' όλα αυτά αν δοκιμάσουμε:

Κώδικας: Επιλογή όλων
lista = ['a', 'b', 'c', 'd', 'e']
for kati in lista:
del kati
print(lista)


Η έξοδος θα είναι '['a', 'b', 'c', 'd', 'e']', δηλαδή τα αντικείμενε της λίστας δεν θα διαγραφούν!
Γιατί συμβαίνει αυτό;
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό Qdata » 28 Ιουν 2011, 18:21

Ilias95 έγραψε:Η έξοδος θα είναι '['a', 'b', 'c', 'd', 'e']', δηλαδή τα αντικείμενε της λίστας δεν θα διαγραφούν!
Γιατί συμβαίνει αυτό;


Μα δεν διαγράφει πουθενά την λίστα.Το <kati> δεν είναι η λίστα <lista>.Άλλο το ένα άλλο το άλλο!Αν θέλεις να διαγράψεις την λίστα με όνομα <lista> ο κώδικας πρέπει να είναι έτσι:
Κώδικας: Επιλογή όλων
lista = ['a', 'b', 'c', 'd', 'e']
for kati in lista:
del lista
print(lista)


Φυσικά μετά το όρισμα lista δεν θα είναι δηλωμένο με αποτέλεσμα η συνάρτηση print() να μην το αναγνωρίζει και να πετάει το σφάλμα:
Κώδικας: Επιλογή όλων
Traceback (most recent call last):
File "arxeio.py", line 5, in <module>
del lista
NameError: name 'lista' is not defined
Linux User: #530165
Γνώσεις ⇛ Linux: Μέτριο ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
Λειτουργικό ⇛ Ubuntu 11.04 32bit σε Intel(R) Atom(TM) CPU N270 @ 1.60GHz
(Notebook) Προδιαγραφές ⇛ 2x Intel(R) Atom(TM) CPU N270 @ 1.60GHz │ 1016MB │ HDA-Intel - HDA Intel -- USB-Audio - USB AUDIO│ 1024x600 pixels
Νέος στο Linux?Οδηγοί - How to - Tutorials
Qdata
powerTUX
powerTUX
 
Δημοσιεύσεις: 1875
Εγγραφή: 18 Ιουν 2010, 19:40
Τοποθεσία: Σέρρες
IRC: dimos
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό Ilias95 » 28 Ιουν 2011, 18:56

Qdata έγραψε:[
Μα δεν διαγράφει πουθενά την λίστα.Το <kati> δεν είναι η λίστα <lista>.Άλλο το ένα άλλο το άλλο!Αν θέλεις να διαγράψεις την λίστα με όνομα <lista> ο κώδικας πρέπει να είναι έτσι:
Κώδικας: Επιλογή όλων
lista = ['a', 'b', 'c', 'd', 'e']
for kati in lista:
del lista
print(lista)


Φυσικά μετά το όρισμα lista δεν θα είναι δηλωμένο με αποτέλεσμα η συνάρτηση print() να μην το αναγνωρίζει και να πετάει το σφάλμα:
Κώδικας: Επιλογή όλων
Traceback (most recent call last):
File "arxeio.py", line 5, in <module>
del lista
NameError: name 'lista' is not defined


To kati αντιπροσωπεύει κάθε αντικείμενο της λίστας, και με τον βρόχο for εκτελώ τις παρακάτω εντολές για το κάθε αντικείμενο της λίστας.
Έτσι όπως έγραψα παραπάνω, το:
Κώδικας: Επιλογή όλων
for kati in lista:
print(kati)

Θα εκτελέσει την print για κάθε στοιχείο της λίστας 'lista'. Αυτό όμως δεν συμβαίνει με την del...
Δεν ζητάω την διαγραφή της λίστας, αλλά ζητάω σε κάθε επανάληψη του βρόχου να διαγράφεται το τρέχων στοιχείο της λίστας!
Δηλαδή και πάλι θα διαγραφεί όλη η λίστα, αλλά όχι με την ίδια διαδικασία...
Αυτό όμως δεν συμβαίνει. Γιατί;
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό Qdata » 28 Ιουν 2011, 19:22

1)Το kati πάντα αντιπροσωπεύει την lista και ότι και να κάνεις πάνω του η lista δεν επηρεάζεται!
2)Οπότε μπορεί τα αντικείμενα από το kati να διαγράφονται αλλά τα αντικείμενα στην lista δεν παθαίνουν τίποτα.
3)Οπότε η συνάρτηση print() πρέπει να την βάλεις να τυπώνει το kati και όχι την lista που μέσα στο πρόγραμμα δεν έχει πάθει απολύτως τίποτα! :)
Linux User: #530165
Γνώσεις ⇛ Linux: Μέτριο ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
Λειτουργικό ⇛ Ubuntu 11.04 32bit σε Intel(R) Atom(TM) CPU N270 @ 1.60GHz
(Notebook) Προδιαγραφές ⇛ 2x Intel(R) Atom(TM) CPU N270 @ 1.60GHz │ 1016MB │ HDA-Intel - HDA Intel -- USB-Audio - USB AUDIO│ 1024x600 pixels
Νέος στο Linux?Οδηγοί - How to - Tutorials
Qdata
powerTUX
powerTUX
 
Δημοσιεύσεις: 1875
Εγγραφή: 18 Ιουν 2010, 19:40
Τοποθεσία: Σέρρες
IRC: dimos
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό sv1jsb » 28 Ιουν 2011, 21:16

Ilias95 έγραψε:
To kati αντιπροσωπεύει κάθε αντικείμενο της λίστας, και με τον βρόχο for εκτελώ τις παρακάτω εντολές για το κάθε αντικείμενο της λίστας.
Έτσι όπως έγραψα παραπάνω, το:
Κώδικας: Επιλογή όλων
for kati in lista:
print(kati)

Θα εκτελέσει την print για κάθε στοιχείο της λίστας 'lista'. Αυτό όμως δεν συμβαίνει με την del...
Δεν ζητάω την διαγραφή της λίστας, αλλά ζητάω σε κάθε επανάληψη του βρόχου να διαγράφεται το τρέχων στοιχείο της λίστας!
Δηλαδή και πάλι θα διαγραφεί όλη η λίστα, αλλά όχι με την ίδια διαδικασία...
Αυτό όμως δεν συμβαίνει. Γιατί;


Να επισημάνω δύο πράγματα:
1) Η εντολή for something in somethingelse λειτουργεί ως εξής:
Για κάθε ένα στοιχείο του somethingelse, αφού μεταφέρει το τρέχων στοιχείο στην something, εκτελεί τις επόμενες γραμμές.
Αυτό σημαίνει ότι στις επόμενες γραμμές θα είναι διαθέσιμο ένα αντίγραφο του τρέχοντος στοιχείου του somethingelse και όχι το ίδιο το στοιχείο.
2) H del σβήνει από την μνήμη την μεταβλητή που της ορίζεις. Έτσι όλα τα παρακάτω είναι σωστά:
Κώδικας: Επιλογή όλων

del lista
......
del lista[2]
del lista[3]
......
for i in range(len(lista)):
del lista[i]


Το τελευταίο for είναι που σε ενδιαφέρει. Γιατί μπορείς να γράψεις κι έτσι το δικό σου:
Κώδικας: Επιλογή όλων

for i in range(len(lista)):
print lista[i]
del lista[i]


Τώρα αφού σου εμφανίζει κάθε στοιχείο τις λιστας, μετά το σβήνει.
Programming blog
Γνώσεις ⇛ Linux: Καλά ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
Λειτουργικό ⇛ Ubuntu 10.04 64bit
Προδιαγραφές ⇛ Phenom II │ 8GB │ 2xATI 5670 │ HD Audio │ TFT 23"
Άβαταρ μέλους
sv1jsb
babeTUX
babeTUX
 
Δημοσιεύσεις: 88
Εγγραφή: 01 Ιουν 2011, 23:50
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό Ilias95 » 29 Ιουν 2011, 00:24

Ευχαριστώ για τις απαντήσεις.
@sv1jsb:
Μια παρατήρηση.
Το τελευταίο πρόγραμμα που έδωσες:
Spoiler: show
Κώδικας: Επιλογή όλων
lista = ['a', 'b', 'c']
for i in range(len(lista)):
print (lista[i])
del lista[i]

Δεν δουλεύει ούτε σε python2 ούτε σε python3.
Δίνει έξοδο:
Κώδικας: Επιλογή όλων
a
c
Traceback (most recent call last):
File "test.py", line 6, in <module>
print (lista[i])
IndexError: list index out of range


Εκτυπώνει όμως την πρώτη και την τρίτη τιμή τις λίστα πριν δώσει το σφάλμα.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό medigeek » 29 Ιουν 2011, 08:33

Η εντολή dir() σου δίνει επιπλέον πληροφορίες για το ποιες μεθόδοι/εντολές υπάρχουν για κάθε αντικείμενο:
έγραψε:>>> dir(lista)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

Άρα μπορείς να εκτελέσεις με το lista εντολές όπως:
lista.append()
lista.index()
lista.pop()
lista.remove()


Δες τι κάνει η κάθε εντολή: http://docs.python.org/tutorial/datastructures.html
Περισσότερα παραδείγματα εδώ: http://python.computersci.org/Collectio ... stFeatures
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό sv1jsb » 29 Ιουν 2011, 08:57

Ilias95 έγραψε:Ευχαριστώ για τις απαντήσεις.
@sv1jsb:
Μια παρατήρηση.
Το τελευταίο πρόγραμμα που έδωσες:
Spoiler: show
Κώδικας: Επιλογή όλων
lista = ['a', 'b', 'c']
for i in range(len(lista)):
print (lista[i])
del lista[i]

Δεν δουλεύει ούτε σε python2 ούτε σε python3.
Δίνει έξοδο:
Κώδικας: Επιλογή όλων
a
c
Traceback (most recent call last):
File "test.py", line 6, in <module>
print (lista[i])
IndexError: list index out of range


Εκτυπώνει όμως την πρώτη και την τρίτη τιμή τις λίστα πριν δώσει το σφάλμα.


Σωστά, δεν δουλεύει, ξέρεις γιατί;
Γιατί σβήνοντας ένα στοιχείο της λίστας αλλάζουμε το μέγεθος της και βρισκόμαστε μέσα σε for.
Έστω ότι είχε στην αρχή 4 στοιχεία, το range θα πάρει τιμές από 0 ως 3, εμείς σβήσαμε όμως ένα στοιχείο, άρα τώρα έχει μέγεθος 3 στοιχεία (από 0 ως 2).
Όταν θα πάει να ζητήσει το lista[3] αυτό δεν θα υπάρχει.
Γι' αυτό χρειάζεται προσοχή όταν σβήνεις στοιχεία, γενικώς. Συνήθως δεν χρειάζεται να σβήνεις μεταβλητές.
Η python έχει και garbage collection. Δηλαδή, αφαιρεί από την μνήμη μια μεταβλητή που δεν χρησιμοποιείται.
Programming blog
Γνώσεις ⇛ Linux: Καλά ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
Λειτουργικό ⇛ Ubuntu 10.04 64bit
Προδιαγραφές ⇛ Phenom II │ 8GB │ 2xATI 5670 │ HD Audio │ TFT 23"
Άβαταρ μέλους
sv1jsb
babeTUX
babeTUX
 
Δημοσιεύσεις: 88
Εγγραφή: 01 Ιουν 2011, 23:50
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό medigeek » 29 Ιουν 2011, 09:11

Εγώ θα το έκανα με το while:
Κώδικας: Επιλογή όλων
while (len(lista)):
last = len(lista) - 1
print(lista[last])
del lista[last]

Ελέγχει το μέγεθος (αριθμό αντικειμένων) της λίστας. Αν το μέγεθος είναι 0, θα σταματήσει.

Όπως είπα πιο πάνω όμως, αυτός ο τρόπος δεν είναι και ό,τι καλύτερο, υπάρχουν ειδικές εντολές όπως το pop και το remove για να αφαιρέσεις συγκεκριμένα αντικείμενα.

Αν θέλεις να διαγράψεις μια ολόκληρη λίστα, το καλύτερο είναι να φτιάξεις τη λίστα εκ νέου:
Κώδικας: Επιλογή όλων
lista = list()
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό Ilias95 » 29 Ιουν 2011, 17:50

Ευχαριστώ πολύ για όλες τις απαντήσεις, με έχουν βοηθήσει αρκετά στο να φτάσω κοντά στην υλοποίηση αυτού που ετοιμάζω.
Τελικά η χρήση της .remove() είναι όντως πιο βολική και αυτή χρησιμοποίησα.

Δύο τελευταίες απορίες:

1. Μπορώ με κάποιο τρόπο όταν ζητάω εισαγωγή απ' τον χρήστη να εμφανίζω κείμενο προς επεξεργασία;
Δηλαδή αυτό που εννοώ είναι να εμφανίζεται το: "Λειτουργικό: Ubuntu" και η λέξη "Ubuntu" να είναι διαθέσιμη προς επεξεργασία, δηλαδή σβήσιμο των 3 τελευταίων γραμμάτων, επανεγγραφή κτλ...

2. Χρησιμοποιώντας την .format() πως μπορώ να ορίσω τον αριθμό των ψηφίων ενός integer;
Βρήκα το {y:.x} αλλά αυτό δουλεύει μόνο σε δεκαδικούς. Στην ουσία ψάχνω το αντίστοιχο του: '%.xd' %int(kati)
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

ΠροηγούμενηΕπόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι