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

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

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

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

Δημοσίευσηαπό sokoban4ever » 26 Μαρ 2012, 02:35

Και μιας και λέμε για Slices ,
μην ξεχνάμε
ότι το Newlist = Oldlist[:]
κάνει shallow copy (μια νέα λίστα αλλά όχι deep copy..)
διότι παρουσιάζονται ορισμένες φορές με τις λίστες της python προβλήματα (εξαρτάται το τι θές να κάνεις )
όπως δημιουργείται (αναφορά) reference σε ένα αντικείμενο και όχι αντίγραφο (copy)
πχ
Κώδικας: Επιλογή όλων
In [2]: x= [1,2,3]

In [3]: y= x

In [4]: z= y

In [5]: x
Out[5]: [1, 2, 3]

In [6]: y
Out[6]: [1, 2, 3]

In [7]: z
Out[7]: [1, 2, 3]

In [8]: y[0]='?'

In [9]: y
Out[9]: ['?', 2, 3]

In [10]: x
Out[10]: ['?', 2, 3]

In [11]: y
Out[11]: ['?', 2, 3]

In [12]: z
Out[12]: ['?', 2, 3]

In [13]: z[0] = 1

In [14]: x
Out[14]: [1, 2, 3]

In [15]: y
Out[15]: [1, 2, 3]

In [16]: z
Out[16]: [1, 2, 3]



αν δεν μας ενδιαφέρει να γίνονται αλλαγές ταυτόχρονα σε όλα τα objects απλά κάνουμε ένα αντίγραφο
πχ
Κώδικας: Επιλογή όλων
In [17]: w = x[:]

In [18]: w[0] = ':)'

In [19]: w
Out[19]: [':)', 2, 3]

In [20]: x
Out[20]: [1, 2, 3]

In [21]: y
Out[21]: [1, 2, 3]

In [22]: z
Out[22]: [1, 2, 3]


αν όμως έχουμε λίστες μέσα σε λίστες τότε πρέπει να γίνονται αναδρομικά αντίγραφα... οπότε και πάμε στο copy module (deepcopy)
περισσότερα
http://docs.python.org/library/copy.html
http://www.python-course.eu/deep_copy.php
Θέλουμε και μπορούμε να έχουμε μια καλύτερη ζωή και όσο θα ζούμε θα προσπαθούμε να την αποκτήσουμε ακόμα και αν πεθάνουμε προσπαθώντας, και αν κάποια στιγμή λιγίσουμε έχουμε το επίπεδο να πούμε κουράστηκα λίγο να ,να ξαποστάσουμε , ώστε να συνεχίσουμε πάλι δυνατοί ξανά.

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

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

Δημοσίευσηαπό Ilias95 » 29 Μαρ 2012, 16:19

Αν εκτελέσω τον παρακάτω κώδικα με python3:
Μορφοποιημένος Κώδικας: Επιλογή όλων
import time

for i in range(10):
print(i)
time.sleep(1)

Θα δω να εκτυπώνονται ένας ένας οι αριθμοί από το 0 μέχρι το 10 και το χρονικό διάστημα που θα κάνω να δω κάθε επόμενο αριθμό είναι 1 δευτερόλεπτο.

Αν όμως κάνω μία πολύ μικρή αλλαγή στον κώδικα:
Μορφοποιημένος Κώδικας: Επιλογή όλων
import time

for i in range(10):
print(i, end=' ')
time.sleep(1)

Θα περιμένω 10 δευτερόλεπτα και μετά θα εκτυπωθούν οι αριθμοί όλοι μαζί ταυτόχρονα.

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

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

Δημοσίευσηαπό medigeek » 29 Μαρ 2012, 22:33

Μάλλον πρέπει να γίνει flush το output: http://stackoverflow.com/a/230774/286994

Ένα δικό μου παράδειγμα με sys.stdout.write():
Κώδικας: Επιλογή όλων
#!/usr/bin/python
import time, sys

print("File processing simulation:")
sys.stdout.write("Processing file 0%..")
sys.stdout.flush()

for percentage in range(10, 101, 10):
time.sleep(1)
sys.stdout.write("%d%%.." % (percentage))
sys.stdout.flush()
print("done!\n")

print("Download simulation:")
sys.stdout.write("Downloading 0%\r")
sys.stdout.flush()

for percentage in range(1, 100, 1):
sys.stdout.write("Downloading %d%%\r" % (percentage))
sys.stdout.flush()
time.sleep(0.1)

print("Downloading 100%")
print("All done!")
Κύπριος; Κόπιασε στο 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

Δημοσίευσηαπό sokoban4ever » 30 Μαρ 2012, 17:00

Ωραίο παράδειγμα με το flush :) Cool :)
Μια αλλαγή μόνο.
δεν μου λειτούργησε το file processing.
ήθελε ένα carriage return στο
sys.stdout.write("Processing file 0%..")
και μετά στο sys.stdout.write("%d%%.." % (percentage))
λίγο padding με τόσους χαρακτήρες όσους είναι το string "processing file "


Spoiler: show
Κώδικας: Επιλογή όλων
#!/usr/bin/python
import time, sys

print("File processing simulation:")
sys.stdout.write("Processing file 0%..\r")
sys.stdout.flush()

for percentage in range(10, 101, 10):
sys.stdout.write("\t\t%d%%..\r" % (percentage))
sys.stdout.flush()
time.sleep(0.2)

print "\nDone!!!"

print("Download simulation:")
sys.stdout.write("Downloading 0%\r")
sys.stdout.flush()

for percentage in range(1, 100, 1):
sys.stdout.write("Downloading %d%%\r" % (percentage))
sys.stdout.flush()
time.sleep(0.05)

print("Downloading 100%")
print("All done!")
Θέλουμε και μπορούμε να έχουμε μια καλύτερη ζωή και όσο θα ζούμε θα προσπαθούμε να την αποκτήσουμε ακόμα και αν πεθάνουμε προσπαθώντας, και αν κάποια στιγμή λιγίσουμε έχουμε το επίπεδο να πούμε κουράστηκα λίγο να ,να ξαποστάσουμε , ώστε να συνεχίσουμε πάλι δυνατοί ξανά.

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

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

Δημοσίευσηαπό Ilias95 » 30 Μαρ 2012, 17:05

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

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

Δημοσίευσηαπό sokoban4ever » 30 Μαρ 2012, 19:27

Γιατί γεμίζει το output buffer του stream sys.stdout στην python3 στην συνάρτηση print (η παράμετρος για έξοδο είναι η file και έχει Defaut arguement το sys.stdout
έγραψε: Print object(s) to the stream file, separated by sep and followed by end. sep, end and file, if present, must be given as keyword arguments.

All non-keyword arguments are converted to strings like str() does and written to the stream, separated by sep and followed by end. Both sep and end must be strings; they can also be None, which means to use the default values. If no object is given, print() will just write end.

The file argument must be an object with a write(string) method; if it is not present or None, sys.stdout will be used. Output buffering is determined by file. Use file.flush() to ensure, for instance, immediate appearance on a screen.


http://docs.python.org/py3k/library/fun ... rint#print

Κώδικας: Επιλογή όλων
>>> for i in range(10):
... print (i , end = ' ')
... sys.stdout.flush()
... time.sleep(0.2)
Θέλουμε και μπορούμε να έχουμε μια καλύτερη ζωή και όσο θα ζούμε θα προσπαθούμε να την αποκτήσουμε ακόμα και αν πεθάνουμε προσπαθώντας, και αν κάποια στιγμή λιγίσουμε έχουμε το επίπεδο να πούμε κουράστηκα λίγο να ,να ξαποστάσουμε , ώστε να συνεχίσουμε πάλι δυνατοί ξανά.

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

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

Δημοσίευσηαπό Ilias95 » 30 Μαρ 2012, 19:31

sokoban4ever έγραψε:Γιατί γεμίζει το output buffer του stream sys.stdout στην python3

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

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

Δημοσίευσηαπό sokoban4ever » 30 Μαρ 2012, 19:36

προφανώς δηλαδή ο τρόπος με τον οποίο θα εμφανιστεί καθορίζεται από το stdout
που είναι συνήθως το terminal (άμα είναι κάτι άλλο πχ το terminal του idle μπορεί να μην χρειάζεται flush -δεν ξέρω δοκίμασε το)
Δεν είναι στον έλεγχο της Python αλλά από το stdout και περα..
Ελπίζω τώρα να βοήθησα
Παρακαλώ :)
Θέλουμε και μπορούμε να έχουμε μια καλύτερη ζωή και όσο θα ζούμε θα προσπαθούμε να την αποκτήσουμε ακόμα και αν πεθάνουμε προσπαθώντας, και αν κάποια στιγμή λιγίσουμε έχουμε το επίπεδο να πούμε κουράστηκα λίγο να ,να ξαποστάσουμε , ώστε να συνεχίσουμε πάλι δυνατοί ξανά.

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

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

Δημοσίευσηαπό medigeek » 30 Μαρ 2012, 23:06

Νομίζω λέγεται line buffering - μέχρι να πάρει χαρακτήρα καινούργιας γραμμής π.χ. "\n", δεν εμφανίζει το περιεχόμενο της γραμμής (ή μέχρι να κλείσει το file/std stream). Προφανώς είναι χρήσιμο για αρχεία (να μην γράφει συνέχεια στο αρχείο αλλά μια φορά), αλλά προσωπικά το βλέπω αχρείαστο για terminal/standard output.
Το παράξενο είναι ότι με python 2.x το "python -u test.py" (unbuffered) δουλεύει, ενώ το "python3 -u test.py" όχι. Στο python2 το sys.stdout είναι «αρχείο», ενώ στο python3 io textwrapper: http://docs.python.org/py3k/library/io. ... tIOWrapper
Ίσως υπάρχει διαφορά και μάλλον γι' αυτό δεν δουλεύει.
Κύπριος; Κόπιασε στο 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

Δημοσίευσηαπό KeRber0s » 07 Απρ 2012, 19:33

Δεν ξέρω αν είναι το κατάλληλο topic για να διατυπώσω την ερώτηση. Ξεκίνησα πρόσφατα να μαθαίνω Python (από το βιβλίο που είχατε μεταφράσει, ένα ευχαριστώ στους μεταφραστές για την δουλειά τους ^^) και έχω ένα κώλυμα. Κάνοντας πλήρη αντιγραφή ένα πρόγραμμα που δείχνει για αρχεία back up μου βγάζει ένα σφάλμα πιο συγκεκριμένα
Κώδικας: Επιλογή όλων
#!/usr/bin/python3
# Filename: backup_ver1.py

import os
import time

source = ["/home/tanagno/Learnig Python/"]

target_dir = '/home/tanagno/test'

target = target_dir + os.sep + time.strftime('%Y-%m-%d_%H:%M:%S')

zip_command = "zip -qr {0} {1}".format(target, '_'.join(source))

if os.system(zip_command) == 0:
print('Successful backup to', target)
else:
print('Backup FAILED')


μου βγάζει το εξής μήνυμα
Κώδικας: Επιλογή όλων
zip error: Nothing to do! (try: zip -qr /home/tanagno/test/2012-04-07_19:24:25 . -i /home/tanagno/Learnig Python/)
Backup FAILED


Διορθώνοντας σύμφωνα με την υπόδειξη ο κώδικα παίρνει την εξής μορφή
Κώδικας: Επιλογή όλων
#!/usr/bin/python3
# Filename: backup_ver1.py

import os
import time

source = ["/home/tanagno/Learnig Python/"]

target_dir = '/home/tanagno/test'

target = target_dir + os.sep + time.strftime('%Y-%m-%d_%H:%M:%S')

zip_command = "zip -qr {0} . -i {1}".format(target, '_'.join(source))


if os.system(zip_command) == 0:
print('Successful backup to', target)
else:
print('Backup FAILED')


Οπότε ναι μεν δεν μου βγάζει κάποιο σφάλμα αλλά το αρχείο που δημιουργείτε είναι άδειο.
Ο φάκελος με τα αρχεία που θέλουμε να κάνουμε back up προφανώς δεν είναι άδειος και ο φάκελος προορισμού υπάρχει.
Σημείωση (Δεν έχω καθόλου προηγούμενη εμπειρία σε προγραμματισμό)
Γνώσεις ⇛ Linux: Μέτριο┃ Προγραμματισμός: Κάτι έχω ακούσει ┃ Αγγλικά: Καλά
Λειτουργικό ⇛ Ubuntu 11.04
Netbook HP 2140 ┃ CPU Intel(R) Atom(TM) CPU N270 @ 1.60GHz ┃ RAM 1GB ┃ HD FUJITSU MHZ2160B
Off topic:
Με την δύναμη της αλήθειας όσο ζω θα κατακτώ το σύμπαν.
V for Vedeta
Άβαταρ μέλους
KeRber0s
punkTUX
punkTUX
 
Δημοσιεύσεις: 179
Εγγραφή: 27 Αύγ 2009, 12:30
Εκτύπωση

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

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