Σελίδα 3 από 4

Re: Μάθημα 2 - Ασκήσεις

ΔημοσίευσηΔημοσιεύτηκε: 05 Αύγ 2009, 00:55
από Luke
Γενικά στις ασκήσεις αυτού του σετ νομίζω πως υπάρχει λάθος διατύπωση (αν όχι διορθώστε με) στις εργασίες που λέει να φτιάξουμε αντίγραφο κάποιας δομής.
Στις λύσεις φαίνεται να γίνεται αναφορά στην προς αντιγραφή δομή μέσω κάποιου άλλου pointer. Για παράδειγμα στις λίστες άσκηση 7 λέει:
Φτιάξτε καινούργια λίστα-αντίγραφο της λίστας lista. Όνομάστε την lista7.
Απάντηση:
Κώδικας: Επιλογή όλων
lista7 = lista

Δε θα έπρεπε κανονικά να είναι
Κώδικας: Επιλογή όλων
lista7 = lista[:]
ώστε να αντιγραφεί η δομή lista σε μια άλλη θέση μνήμης και όχι απλά να έχουμε ακόμα ένα pointer να δείχνει στην ίδια προηγούμενη δομή. Παραθέτω και το αντίστοιχο κομμάτι από τη θεωρία:
Θυμηθείτε ότι εάν θέλετε να φτιάξετε ένα αντίγραφο μιας λίστας, ή τέτοιου είδους ακολουθίες, ή σύμπλοκα αντικείμενα (όχι απλά αντικείμενα όπως ακέραιους αριθμούς), τότε πρέπει να χρησιμοποιήσετε τη λειτουργία τεμαχισμού για να φτιάξετε αντίγραφο. Εάν εκχωρήσετε την ονομασία της μεταβλητής σε μια άλλη ονομασία, τότε και οι δυο τους θα παραπέμπουν στο ίδιο αντικείμενο και αυτό θα μπορούσε να είναι πρόβλημα για σας, εάν δεν είστε προσεκτικοί.

Re: Μάθημα 2 - Ασκήσεις

ΔημοσίευσηΔημοσιεύτηκε: 06 Αύγ 2009, 19:45
από sokoban4ever
@Luke
:think:
είναι η ίδια πχ
Κώδικας: Επιλογή όλων
>>> x=[1,2,3]
>>> y=x
>>> y
[1, 2, 3]
>>> del x
>>> y
[1, 2, 3]

Re: Μάθημα 2 - Ασκήσεις

ΔημοσίευσηΔημοσιεύτηκε: 06 Αύγ 2009, 19:57
από Luke
Πράγματι, περίεργο...
Το κομμάτι που έχω παραθέσει τότε σε τι αναφέρεται; Μήπως κατάλαβα κάτι λάθος; :?

Re: Μάθημα 2 - Ασκήσεις

ΔημοσίευσηΔημοσιεύτηκε: 06 Αύγ 2009, 20:23
από sokoban4ever
@Luke
βασικά με το [:] κάνει μια τελείως νέα λίστα
πχ
Κώδικας: Επιλογή όλων
>>> x=[1,2,3]
>>> y=x
>>> x
[1, 2, 3]
>>> y
[1, 2, 3]
>>> x == y
True
>>> x is y
True
>>> del x
>>> del y
>>> x=[1,2,3]
>>> y=x[:]
>>> y
[1, 2, 3]
>>> x == y
True
>>> x is y
False # voila ;)
>>>

όπου ναι μεν έχει τα ίδια στοιχεία αλλά δεν είναι ίδια είναι απλά ένα αντίγραφο όπως λέει και στην θεωρία
(ναι μεν είναι x == y True αλλά το x is y είναι False )
υπάρχουν και άλλες δυνατότητες με το module copy
http://docs.python.org/library/copy.html

Re: Μάθημα 2 - Ασκήσεις

ΔημοσίευσηΔημοσιεύτηκε: 06 Αύγ 2009, 20:52
από Luke
ΟΚ, σωστά το είχα καταλάβει.
Στην πρώτη περίπτωση απλά διαγράφεται ο pointer με την del αλλά το αντικείμενο (λίστα) θα διαγραφεί μόνο όταν διαγραφούν όλοι οι pointers που δείχνουν προς αυτό (και το x και το y).
Στη δεύτερη περίπτωση όταν διαγράφεται ο pointer διαγράφεται και το αντικείμενο.

Απλά η εκφώνηση μου έδωσε να καταλάβω ότι χρειαζόταν να φτιάξουμε νέο αντίγραφο και όχι απλά έναν pointer που να δείχνει στο ίδιο αντικείμενο με τον αρχικό pointer. Την παραθέτω ξανά:
Φτιάξτε καινούργια λίστα-αντίγραφο της λίστας lista. Όνομάστε την lista7.

Αν έπρεπε να κάνουμε εντελώς νέο αντίγραφο χρειαζόταν να γράφει κάτι παραπάνω; Ξέρω λεπτομέρειες ψάχνω τώρα, αλλά νόμιζα ότι ήταν ερώτηση "παγίδα" προκειμένου να δούμε τη διαφορά μεταξύ των 2 περιπτώσεων.

Re: Μάθημα 2 - Ασκήσεις

ΔημοσίευσηΔημοσιεύτηκε: 06 Αύγ 2009, 21:24
από sokoban4ever
Luke έγραψε:...
Αν έπρεπε να κάνουμε εντελώς νέο αντίγραφο χρειαζόταν να γράφει κάτι παραπάνω; ...

το σύμβολο της ανάθεσης " = " είναι αρκετό .
Για περισσότερα δες τα docs για το module copy.
( Εκεί θα δεις για το shallow copy για το deep copy κλπ )
Δες εδώ
Κώδικας: Επιλογή όλων
import copy
help(copy)

Re: Μάθημα 2 - Ασκήσεις

ΔημοσίευσηΔημοσιεύτηκε: 12 Αύγ 2009, 21:17
από da_perama1
Όταν πρέπει να ...

Φτιάξτε καινούργια λίστα-αντίγραφο της λίστας lista. Όνομάστε την lista7.

νομίζω ότι το το σύμβολο ανάθεσης " = " δεν είναι αρκετό. Γιατί έτσι έχουμε δύο δείκτες (pointers) που δείχνουν στην ίδια θέση της μνήμης όπου υπάρχει ένα σύνολο δεδομένων, έτσι οποιαδήποτε αλλαγή στα δεδομένα επιρρεάζει και τη lista και την lista7. πχ
Κώδικας: Επιλογή όλων
Python 3.0.1+ (r301:69556, Jun 23 2009, 20:25:15)
[GCC 4.2.4 (Ubuntu 4.2.4-1ubuntu4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> x = [1,2,3]
>>> y = x
>>> x.append(4)
>>> y
[1, 2, 3, 4]
>>>

Οπότε το " = " είναι αρκετό μόνο αν θέλουμε οι δύο λίστες να έχουν πάντα τα ίδια δεδομένα. Αν θέλουμε μετά την δημιουργία της, η δεύτερη λίστα να ακολουθήσει ανεξάρτητη πορεία θα πρέπει να χρησιμοποιήσουμε τρόπο που θα δημιουργεί νέο σύνολο δεδομένων.
Αυτές δε οι διαφορές δεν είναι καθόλου λεπτομέρειες, από παρόμοιες διευθετήσεις προκύπτουν λάθη, που μπορεί να ταλαιπωρήσουν πολύ προγραμματιστές που εργάζονται σε μεγάλα προγράμματα.

Re: Μάθημα 2 - Ασκήσεις

ΔημοσίευσηΔημοσιεύτηκε: 12 Αύγ 2009, 22:00
από sokoban4ever
@da_perama1
Σωστά για αυτό το σύμβολο της ισότητας είναι αρκετό...
με λίγα λόγια την ανάθεση των τιμών μία προς μία ... δεν την γλιτώνεις
είτε είναι "κλώνος" ( :lol: ) είτε αντίγραφο οι λίστες
πχ
Κώδικας: Επιλογή όλων
>>> x =[1,2,3]
>>> y = x[:] #σύμβολο της ισότητας ;-)
>>> x.append(4)
>>> x
[1, 2, 3, 4]
>>> y
[1, 2, 3]
>>>


Μπράβο που το πρόσεξες :thumbup:
απλά η εκφώνηση δεν ξεκαθαρίζει αν θα πρέπει να είναι ανεξάρτητες μεταξύ τους οι δυό λίστες.
Πάντως βεβαίως και υπάρχει διαφορά άλλο να είναι ανεξάρτητες δυό λίστες και άλλο να αλλάζει μια από την άλλη.
:D

Re: Μάθημα 2 - Ασκήσεις

ΔημοσίευσηΔημοσιεύτηκε: 02 Οκτ 2009, 12:57
από AngelBreath
Μια ερώτηση για το indexing. θα το πω με παραδειγμα για να καταλαβετε την ερωτηση. Θελω να κανω ενα παιχνιδι με python, την απλη κρεμαλα. Σαν ιδεα μου φανηκε οτι εχει πολυ αμεση σχεση με τις λιστες και τα string. Κανω λοιπον μια λιστα που περιεχει λεξεις. Ζητω απο την python να μου δωσει μια τυχαια λεξη απο την λιστα. Συνεχιζω το παιχνιδι, και θελω με το τελος να διαγραφει η λεξη απο την λιστα ωστε αν συνεχισω το παιχνιδι να μην υπαρχει περιπτωση να μου δωσει την ιδια λεξη.
Αρα (οπως το σκεφτομαι εγω) θα πρεπει να κανει ελεγχο to προγραμμα αν η τιμη που πηρε η μεταβλητη για την λεξη (πχ word =random(listalekseon)) ειναι στην λιστα και να την διαγραψει.
Κατι δηλαδη σαν

if word in listalekseon:
del word

Βεβαια το παραπανω δεν ειναι σωστο. θα πρεπει να βρεθει πια θεση εχει στην λιστα η λεξη (word) να παρω ισως το index και να το σβησω.
Πως γινεται αυτο? (θα παρακαλουσα αν ειναι δυνατον περιγραφικη απαντηση και οχι τον κωδικα ή ενα tip μονο...)

Επίσης στο http://docs.python.org/library/random.h ... ule-random λεει:

random.choice(seq)
Return a random element from the non-empty sequence seq.

Οι λιστες δεν ειναΙ ακολουθίες?

#!/usr/bin/python3
#-*-coding :utf-8-*-
#Filename : Kremala.py

Κώδικας: Επιλογή όλων
from random import random
wordlist =['ΠΕΡΙΣΤΕΡΙ', 'ΔΡΟΜΟΛΟΓΙΟ', 'ΚΟΛΟΚΟΤΡΩΝΗΣ' ,'ΣΥΜΠΑΝ', 'ΤΡΑΓΟΥΔΙ', 'ΞΥΛΟΚΟΠΟΣ']
[b]word = random.choice(wordlist)[/b]
print (word)


Εχει κάποιο λαθος?

Παρακαλω και παλι ΟΧΙ κωδικα...:) θελω να το παιδεψω μονος μου...:)


Βρηκα μία λυση αλλα μου φαινεται λιγο πολυπλοκη, φανταζομαι οτι πρεπει να υπαρχει πιο ευκολος τροπος.

Κώδικας: Επιλογή όλων
import random
wordList =['ΠΕΡΙΣΤΕΡΙ', 'ΔΡΟΜΟΛΟΓΙΟ', 'ΚΟΛΟΚΟΤΡΩΝΗΣ' ,'ΣΥΜΠΑΝ', 'ΤΡΑΓΟΥΔΙ', 'ΞΥΛΟΚΟΠΟΣ']
wordLength =(len(wordList))-1
WordId = random.randint(0,wordLength)
word = wordList[WordId]


print (word

Re: Μάθημα 2 - Ασκήσεις

ΔημοσίευσηΔημοσιεύτηκε: 05 Οκτ 2009, 13:25
από Luke
Για να είμαι ειλικρινής δεν μελέτησα τις προτεινόμενες λύσεις που παρέθεσες αλλά θα σου πω μια λογική που είναι νομίζω είναι η απλούστερη.

  • Χρησιμοποίησε τη random για να σου παράγει ένα αριθμό σε ένα εύρος τιμών ανάλογα με τον αριθμό των λέξεων που έχεις στη λίστα (π.χ. 0-9).
  • Έτσι αποθηκεύεις αυτή την τιμή σε μια μεταβλητή.
  • Παίζεις το παιχνίδι.
  • Στη συνέχεια διαγράφεις το στοιχείο στη συγκεκριμένη θέση.
Επειδή δε θυμάμαι τι ακριβώς συμβαίνει στις θέσεις από τις οποίες έχεις διαγράψει στοιχεία μπορείς να κάνεις το εξής (αν παραμένουν οι θέσεις αλλά με "κενά" στοιχεία): αντί να σώζεις την τυχαία τιμή σε μεταβλητή να τη σώζεις σε μία νέα λίστα και να τσεκάρεις στα επόμενα random να μην περιέχεται η τυχαία τιμή μέσα σε αυτή τη νέα λίστα. Αυτό θα το επαναλαμβάνεις μέχρι να πέσεις σε στοιχείο (index) που δεν θα υπάρχει σε αυτή τη λίστα.

Τώρα που το βλέπω είναι η λογική του δεύτερου τρόπου που προτείνεις. Δεν νομίζω ότι είναι πολύπλοκο όπως το έχεις κάνει.