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

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

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

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

Δημοσίευσηαπό Ilias95 » 25 Ιουν 2011, 02:10

c7p έγραψε:Ασκήσεις για Python !
http://codingbat.com/python
http://openbookproject.net/pybiblio/practice/


Να 'σαι καλά! :clap:
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

Δημοσίευσηαπό c7p » 26 Ιουν 2011, 15:36

Για προσπαθήστε να λύσετε την άσκηση http://codingbat.com/prob/p126968 να δούμε πόσες διαφορετικές λύσεις θα έχουμε :P -κατά προτίμηση χωρίς ταξινόμηση για μεγαλύτερη δυσκολία :roll: -.
Άβαταρ μέλους
c7p
powerTUX
powerTUX
 
Δημοσιεύσεις: 1849
Εγγραφή: 30 Μάιος 2009, 16:09
Τοποθεσία: Κατερίνη
Εκτύπωση

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

Δημοσίευσηαπό arkanoid » 27 Ιουν 2011, 12:24

c7p έγραψε:Για προσπαθήστε να λύσετε την άσκηση http://codingbat.com/prob/p126968 να δούμε πόσες διαφορετικές λύσεις θα έχουμε :P -κατά προτίμηση χωρίς ταξινόμηση για μεγαλύτερη δυσκολία :roll: -.

Κώδικας: Επιλογή όλων

def centered_average(nums):
min, max = nums[0], nums[0]
for i in nums:
if i >= max:
max = i
if i <= min:
min = i
sum = 0
for i in nums:
sum = sum + i
sum = sum - (min + max)
return (sum / (len(nums) - 2))
Γνώσεις ⇛ Linux: Καλά ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
Ubuntu 11.04 64 bit σε Dell Inspiron N5010
Intel Core i5 M480 │ 4 GB │ ATI Radeon HD 5600
arkanoid
babeTUX
babeTUX
 
Δημοσιεύσεις: 15
Εγγραφή: 30 Μάιος 2011, 01:36
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 27 Ιουν 2011, 15:35

Επειδή python δεν γνωρίζω, έχω μια απορία: υπάρχει κάποιος ιδιαίτερος λόγος που το sum υπολογίζεται σε ξεχωριστό loop και όχι μαζί με τα min και max στο αρχικό loop? Αυτή η υλοποίηση κάνει τον διπλάσιο χρόνο να εκτελεστεί!

Επίσης, υποθέτω πως η len( nums ) είναι κάποια συνάρτηση που επιστρέφει το πλήθος των στοιχείων του πίνακα nums. Αν η python δεν έχει κάποιο μηχανισμό να υπολογίζει δυναμικά το πλήθος των στοιχείων την 1η φορά που τον διατρέχουμε κι ενδεχομένως να το κρατάει σε κάποια εσωτερική μεταβλητή που διαβάζει κατόπιν η len() (ή έστω κάποιον εσωτερικό μηχανισμό που προ-υπολογίζει και αποηθηκεύει το πλήθος των πινάκων κατά τον ορισμό του) τότε το κάλεσμα της συνάρτησης len στην παραπάνω υλοποίηση είναι επιπρόσθετη επιβάρυνση σε ταχύτητα.

Θα μπορούσε κι αυτό να υπολογίζεται δυναμικά με μια έξτρα μεταβλητή μέσα στο αρχικό loop, μαζί με όλα τα υπόλοιπα. Έτσι ο κώδικας θα διέτρεχε τον πίνακα 1 μόνο φορά, αντί για 3 που τον διατρέχει τώρα.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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

Καλησπέρα, μια απορία:

Έστω ότι έχω δημιουργήσει μια απλή κλάση η οποία είναι αυτή:

Spoiler: show
Κώδικας: Επιλογή όλων

class Epafes:
def __init__(self, kati):
allo = input()
self.allo = allo

def tell(self):
print(self.allo)


Και ύστερα ορίζω τα παρακάτω:

Κώδικας: Επιλογή όλων

Giannis = Epafes(1)
Kwstas = Epafes(2)
print('Ποια επαφή θέλεις να δεις;') ; d = input()
d.tell()


Στα οποία προσπαθώ με την input() να πάρω το όνομα μιας ήδη υπάρχουσας μεταβλητής (Giannis ή Kwstas) και να το χρησιμοποιήσω για να πάρω τις πληροφορίες της tell().
Παρ' όλα αυτά ακόμα και αν βάλω ένα όνομα το οποίο όντως υπάρχει, θα πάρω σφάλμα καθώς το πρόγραμμα αναγνωρίζει το d σαν αλφαριθμητικό (str).

Μπορώ με κάποιο τρόπο να μετατρέψω την είσοδο του χρήστη από αλφαριθμητικό σε όνομα μεταβλητής;

Edit:

Το πραγματικό μου πρόβλημα είναι ότι θέλω να δημιουργήσω ένα βιβλίο διευθύνσεων.
Έχω δημιουργήσει την παρακάτω κλάση:

Spoiler: show
Κώδικας: Επιλογή όλων
class Epafes:
global d
d = 1 # Με την μεταβλητή d ορίζω τον αύξων αριθμό μέσα στην __init__.
arithmos_epafwn = 0

def __init__(self, epafi):
global d

print('Εισάγεται στοιχεία της επαφής:\n')
print('Όνομα: ', end='') ; name = input()
print('Επίθετο: ', end='') ; surname = input()
print('e-mail: ', end='') ; mail = input()
print('Διέυθηνση: ', end='') ; address = input()
print('Τηλέφωνο: ', end='') ; telephone = input()
print('Κατηγορία: ', end='') ; category = input()

self.name = name
self.surname = surname
self.mail = mail
self.address = address
self.telephone = telephone
self.category = category

self.k = d # Α/Α - αύξων αριθμός
d += 1
Epafes.arithmos_epafwn += 1

def tell(self):

print('''
{6}. {0} {1}:

Όνομα: {0}
Επίθετο: {1}
e-mail: {2}
Διέυθηνση: {3}
Τηλέφωνο: {4}
Κατηγορία: {5}
'''.format(self.name, self.surname, self.mail, \
self.address, self.telephone, self.category, self.k))


Σε αυτό που έχω κολλήσει είναι στο πως παίρνοντας είσοδο απ' το χρήστη θα εμφανίζω τα στοιχεία της συγκεκριμένης επαφής!
Όταν ο χρήστης δώσει τον αύξων αριθμό της επαφής θα πρέπει να γίνει η παρακάτω διαδικασία:
x.tell()

Όπου το x θα είναι μια ήδη ορισμένη μεταβλητή και θα αντιπροσωπεύει τα στοιχεία μιας επαφής: Epafes(y)
Πως όμως θα ορίζεται η ξεχωριστή μεταβλητή για κάθε επαφή; Και πως με την είσοδο του χρήστη θα καλείτε η x.tell();

Έχω κάνει πολλές προσπάθειες αλλά δεν έχω καταφέρει ακόμα να το επιτύχω. :problem: :wtf:
Αν καταφέρω το παραπάνω με την μετατροπή του str σε τιμή μεταβλητής θα είναι εύκολο. Αλλιώς;
Καμιά ιδέα;
Τελευταία επεξεργασία από Ilias95 και 27 Ιουν 2011, 19:41, έχει επεξεργασθεί 4 φορά/ες συνολικά
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

Δημοσίευσηαπό arkanoid » 27 Ιουν 2011, 17:19

migf1 έγραψε:Επειδή python δεν γνωρίζω, έχω μια απορία: υπάρχει κάποιος ιδιαίτερος λόγος που το sum υπολογίζεται σε ξεχωριστό loop και όχι μαζί με τα min και max στο αρχικό loop? Αυτή η υλοποίηση κάνει τον διπλάσιο χρόνο να εκτελεστεί!

Σίγουρα η υλοποίηση μου δεν είναι η καλύτερη ή η κομψότερη, αλλά διπλάσιο χρόνο εκτέλεσης από το να ήταν όλα σε μία επανάληψη, δεν κάνει. Και οι δύο υλοποιήσεις είναι O(n), αφού και στις δύο περιπτώσεις για κάθε στοιχείο του πίνακα γίνεται το ίδιο πλήθος ενεργειών, γραμμικό ανάλογα με την είσοδο του αλγόριθμου. Μάλλον δε χρειάζεσαι παραπάνω εξηγήσεις όμως, αφού μιλάς για χρόνους εκτέλεσης θα τα γνωρίζεις αυτά. Πάντως γενικότερα συμφωνώ, στο ότι θα ήταν καλύτερα όλα σε μία επανάληψη, αφού θα ήταν πιο απλός και ευανάγνωστος ο κώδικας.

migf1 έγραψε:Επίσης, υποθέτω πως η len( nums ) είναι κάποια συνάρτηση που επιστρέφει το πλήθος των στοιχείων του πίνακα nums. Αν η python δεν έχει κάποιο μηχανισμό να υπολογίζει δυναμικά το πλήθος των στοιχείων την 1η φορά που τον διατρέχουμε κι ενδεχομένως να το κρατάει σε κάποια εσωτερική μεταβλητή που διαβάζει κατόπιν η len() (ή έστω κάποιον εσωτερικό μηχανισμό που προ-υπολογίζει και αποηθηκεύει το πλήθος των πινάκων κατά τον ορισμό του) τότε το κάλεσμα της συνάρτησης len στην παραπάνω υλοποίηση είναι επιπρόσθετη επιβάρυνση σε ταχύτητα.

Θα μπορούσε κι αυτό να υπολογίζεται δυναμικά με μια έξτρα μεταβλητή μέσα στο αρχικό loop, μαζί με όλα τα υπόλοιπα. Έτσι ο κώδικας θα διέτρεχε τον πίνακα 1 μόνο φορά, αντί για 3 που τον διατρέχει τώρα.

Σε αυτό διαφωνώ απόλυτα. Η χρήση της len() κάνει τον κώδικα πιο ευανάγνωστο, και αφού υπάρχει ήδη σα συνάρτηση θα τη χρησιμοποιήσω και δε θα την ανακαλύψω πάλι/υλοποιήσω στην επανάληψη. Για το τρεις φορές ταχύτερα (αν αυτό εννοείς) ισχύουν τα ίδια με προηγουμένως.
Γνώσεις ⇛ Linux: Καλά ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
Ubuntu 11.04 64 bit σε Dell Inspiron N5010
Intel Core i5 M480 │ 4 GB │ ATI Radeon HD 5600
arkanoid
babeTUX
babeTUX
 
Δημοσιεύσεις: 15
Εγγραφή: 30 Μάιος 2011, 01:36
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 27 Ιουν 2011, 22:18

Αν δεν υπάρχει κάποια εσωτερική διαφοροποίηση λόγω γλώσσας μεταξύ c και python, ο αλγόριθμός σου αυτή τη στιγμή είναι Ο(n*3), χωρίς την len() μειώνεται σε O(n*2) και υπολογίζοντας sum και len με αντίστοιχες μεταβλητές μέσα σε ένα μόνο loop μαζί με τα υπόλοιπα γίνεται O(n).

Προφανώς όπου n το πλήθος στοιχείων του nums.
Τελευταία επεξεργασία από migf1 και 27 Ιουν 2011, 22:43, έχει επεξεργασθεί 1 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό arkanoid » 27 Ιουν 2011, 22:25

O(n)+O(n)+O(n)=O(n) και όχι O(n^3)
Γνώσεις ⇛ Linux: Καλά ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
Ubuntu 11.04 64 bit σε Dell Inspiron N5010
Intel Core i5 M480 │ 4 GB │ ATI Radeon HD 5600
arkanoid
babeTUX
babeTUX
 
Δημοσιεύσεις: 15
Εγγραφή: 30 Μάιος 2011, 01:36
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 27 Ιουν 2011, 22:43

Ναι, σωστός! (κάτσε να το κάνω edit)
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 27 Ιουν 2011, 22:46

migf1 έγραψε:Ναι, σωστός! (κάτσε να το κάνω edit)

Done ;)

Το άλλαξα από τα εσφαλμένα Ο(n*n*n) και O(n*n) στα σωστά O(n*3) και O(n*2), αντίστοιχα. Thx!
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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