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

...ασύγχρονα μαθήματα python

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

Δημοσίευσηαπό Luke » 05 Αύγ 2009, 00:55

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

Δε θα έπρεπε κανονικά να είναι
Κώδικας: Επιλογή όλων
lista7 = lista[:]
ώστε να αντιγραφεί η δομή lista σε μια άλλη θέση μνήμης και όχι απλά να έχουμε ακόμα ένα pointer να δείχνει στην ίδια προηγούμενη δομή. Παραθέτω και το αντίστοιχο κομμάτι από τη θεωρία:
Θυμηθείτε ότι εάν θέλετε να φτιάξετε ένα αντίγραφο μιας λίστας, ή τέτοιου είδους ακολουθίες, ή σύμπλοκα αντικείμενα (όχι απλά αντικείμενα όπως ακέραιους αριθμούς), τότε πρέπει να χρησιμοποιήσετε τη λειτουργία τεμαχισμού για να φτιάξετε αντίγραφο. Εάν εκχωρήσετε την ονομασία της μεταβλητής σε μια άλλη ονομασία, τότε και οι δυο τους θα παραπέμπουν στο ίδιο αντικείμενο και αυτό θα μπορούσε να είναι πρόβλημα για σας, εάν δεν είστε προσεκτικοί.
1 Γνώσεις ⇛ Linux: Χαμηλό προς Μέτριο ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
2 Λειτουργικά → Ubuntu 10.04 lucid 64bit (en_US.utf8), Windows 7
3 Προδιαγραφές → Intel Core i5-2500 CPU @ 3.30GHz ‖ RAM 7916 MiB ‖ MSI H67MA-E35 (MS-7680) - MSI MS-7680
4 Κάρτες γραφικών: Intel Sandy Bridge Integrated Graphics Controller [8086:0102] (rev 09)
5 Δίκτυα: eth0: Realtek RTL8111/8168B PCI Express Gigabit Ethernet controller [10ec:8168] (rev 06)
Άβαταρ μέλους
Luke
babeTUX
babeTUX
 
Δημοσιεύσεις: 91
Εγγραφή: 23 Μάιος 2009, 21:31
Εκτύπωση

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

Δημοσίευσηαπό sokoban4ever » 06 Αύγ 2009, 19:45

@Luke
:think:
είναι η ίδια πχ
Κώδικας: Επιλογή όλων
>>> x=[1,2,3]
>>> y=x
>>> y
[1, 2, 3]
>>> del x
>>> y
[1, 2, 3]
Θέλουμε και μπορούμε να έχουμε μια καλύτερη ζωή και όσο θα ζούμε θα προσπαθούμε να την αποκτήσουμε ακόμα και αν πεθάνουμε προσπαθώντας, και αν κάποια στιγμή λιγίσουμε έχουμε το επίπεδο να πούμε κουράστηκα λίγο να ,να ξαποστάσουμε , ώστε να συνεχίσουμε πάλι δυνατοί ξανά.

Μήνυμα με αγάπη και αληλλεγγύη σε όλους τους ανθρώπους από όλους τους λαούς , ιδίως του Ελληνικού.
Άβαταρ μέλους
sokoban4ever
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 2331
Εγγραφή: 13 Φεβ 2009, 02:22
Εκτύπωση

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

Δημοσίευσηαπό Luke » 06 Αύγ 2009, 19:57

Πράγματι, περίεργο...
Το κομμάτι που έχω παραθέσει τότε σε τι αναφέρεται; Μήπως κατάλαβα κάτι λάθος; :?
1 Γνώσεις ⇛ Linux: Χαμηλό προς Μέτριο ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
2 Λειτουργικά → Ubuntu 10.04 lucid 64bit (en_US.utf8), Windows 7
3 Προδιαγραφές → Intel Core i5-2500 CPU @ 3.30GHz ‖ RAM 7916 MiB ‖ MSI H67MA-E35 (MS-7680) - MSI MS-7680
4 Κάρτες γραφικών: Intel Sandy Bridge Integrated Graphics Controller [8086:0102] (rev 09)
5 Δίκτυα: eth0: Realtek RTL8111/8168B PCI Express Gigabit Ethernet controller [10ec:8168] (rev 06)
Άβαταρ μέλους
Luke
babeTUX
babeTUX
 
Δημοσιεύσεις: 91
Εγγραφή: 23 Μάιος 2009, 21:31
Εκτύπωση

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

Δημοσίευσηαπό sokoban4ever » 06 Αύγ 2009, 20:23

@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
Θέλουμε και μπορούμε να έχουμε μια καλύτερη ζωή και όσο θα ζούμε θα προσπαθούμε να την αποκτήσουμε ακόμα και αν πεθάνουμε προσπαθώντας, και αν κάποια στιγμή λιγίσουμε έχουμε το επίπεδο να πούμε κουράστηκα λίγο να ,να ξαποστάσουμε , ώστε να συνεχίσουμε πάλι δυνατοί ξανά.

Μήνυμα με αγάπη και αληλλεγγύη σε όλους τους ανθρώπους από όλους τους λαούς , ιδίως του Ελληνικού.
Άβαταρ μέλους
sokoban4ever
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 2331
Εγγραφή: 13 Φεβ 2009, 02:22
Εκτύπωση

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

Δημοσίευσηαπό Luke » 06 Αύγ 2009, 20:52

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

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

Αν έπρεπε να κάνουμε εντελώς νέο αντίγραφο χρειαζόταν να γράφει κάτι παραπάνω; Ξέρω λεπτομέρειες ψάχνω τώρα, αλλά νόμιζα ότι ήταν ερώτηση "παγίδα" προκειμένου να δούμε τη διαφορά μεταξύ των 2 περιπτώσεων.
1 Γνώσεις ⇛ Linux: Χαμηλό προς Μέτριο ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
2 Λειτουργικά → Ubuntu 10.04 lucid 64bit (en_US.utf8), Windows 7
3 Προδιαγραφές → Intel Core i5-2500 CPU @ 3.30GHz ‖ RAM 7916 MiB ‖ MSI H67MA-E35 (MS-7680) - MSI MS-7680
4 Κάρτες γραφικών: Intel Sandy Bridge Integrated Graphics Controller [8086:0102] (rev 09)
5 Δίκτυα: eth0: Realtek RTL8111/8168B PCI Express Gigabit Ethernet controller [10ec:8168] (rev 06)
Άβαταρ μέλους
Luke
babeTUX
babeTUX
 
Δημοσιεύσεις: 91
Εγγραφή: 23 Μάιος 2009, 21:31
Εκτύπωση

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

Δημοσίευσηαπό sokoban4ever » 06 Αύγ 2009, 21:24

Luke έγραψε:...
Αν έπρεπε να κάνουμε εντελώς νέο αντίγραφο χρειαζόταν να γράφει κάτι παραπάνω; ...

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

Μήνυμα με αγάπη και αληλλεγγύη σε όλους τους ανθρώπους από όλους τους λαούς , ιδίως του Ελληνικού.
Άβαταρ μέλους
sokoban4ever
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 2331
Εγγραφή: 13 Φεβ 2009, 02:22
Εκτύπωση

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

Δημοσίευσηαπό da_perama1 » 12 Αύγ 2009, 21:17

Όταν πρέπει να ...

Φτιάξτε καινούργια λίστα-αντίγραφο της λίστας 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]
>>>

Οπότε το " = " είναι αρκετό μόνο αν θέλουμε οι δύο λίστες να έχουν πάντα τα ίδια δεδομένα. Αν θέλουμε μετά την δημιουργία της, η δεύτερη λίστα να ακολουθήσει ανεξάρτητη πορεία θα πρέπει να χρησιμοποιήσουμε τρόπο που θα δημιουργεί νέο σύνολο δεδομένων.
Αυτές δε οι διαφορές δεν είναι καθόλου λεπτομέρειες, από παρόμοιες διευθετήσεις προκύπτουν λάθη, που μπορεί να ταλαιπωρήσουν πολύ προγραμματιστές που εργάζονται σε μεγάλα προγράμματα.
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.04 precise 64bit (el_GR.UTF-8), Ubuntu 3.0.0-17-generic
3 Intel Core i5 CPU 650 3.20GHz ‖ RAM 7783 MiB ‖ Intel DH55TC -
4 Intel Core Processor Integrated Graphics Controller [8086:0042] (rev 02)
5 eth0: Intel 82578DC Gigabit Network Connection [8086:10f0] (rev 06)
da_perama1
punkTUX
punkTUX
 
Δημοσιεύσεις: 289
Εγγραφή: 11 Νοέμ 2008, 20:35
Τοποθεσία: Κέρκυρα
Εκτύπωση

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

Δημοσίευσηαπό sokoban4ever » 12 Αύγ 2009, 22:00

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


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

Μήνυμα με αγάπη και αληλλεγγύη σε όλους τους ανθρώπους από όλους τους λαούς , ιδίως του Ελληνικού.
Άβαταρ μέλους
sokoban4ever
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 2331
Εγγραφή: 13 Φεβ 2009, 02:22
Εκτύπωση

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

Δημοσίευσηαπό AngelBreath » 02 Οκτ 2009, 12:57

Μια ερώτηση για το 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
AngelBreath
babeTUX
babeTUX
 
Δημοσιεύσεις: 46
Εγγραφή: 05 Νοέμ 2008, 23:29
Εκτύπωση

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

Δημοσίευσηαπό Luke » 05 Οκτ 2009, 13:25

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

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

Τώρα που το βλέπω είναι η λογική του δεύτερου τρόπου που προτείνεις. Δεν νομίζω ότι είναι πολύπλοκο όπως το έχεις κάνει.
1 Γνώσεις ⇛ Linux: Χαμηλό προς Μέτριο ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
2 Λειτουργικά → Ubuntu 10.04 lucid 64bit (en_US.utf8), Windows 7
3 Προδιαγραφές → Intel Core i5-2500 CPU @ 3.30GHz ‖ RAM 7916 MiB ‖ MSI H67MA-E35 (MS-7680) - MSI MS-7680
4 Κάρτες γραφικών: Intel Sandy Bridge Integrated Graphics Controller [8086:0102] (rev 09)
5 Δίκτυα: eth0: Realtek RTL8111/8168B PCI Express Gigabit Ethernet controller [10ec:8168] (rev 06)
Άβαταρ μέλους
Luke
babeTUX
babeTUX
 
Δημοσιεύσεις: 91
Εγγραφή: 23 Μάιος 2009, 21:31
Εκτύπωση

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

Επιστροφή στο Μαθήματα python

cron