cddim Δημοσ. 28 Μαρτίου 2020 Δημοσ. 28 Μαρτίου 2020 H εκφώνηση της άσκησης μου είναι η εξής: Γράψτε τη συνάρτηση squares η οποία: α) να δέχεται απροσδιόριστο πλήθος παραμέτρων (υποθέτουμε ακέραιες τιμές), και β) να είναι συνάρτηση-γεννήτορας (generator) H squares θα πρέπει να επιστρέφει διαδοχικά (σύμφωνα με τη λειτουργία ενός γενήτορα) το τετράγωνο της διαφοράς της κάθε τιμής από το μέσο όρο όλων των τιμών που της δόθηκαν ως είσοδος. Στο κύριο πρόγραμμα καλέστε την squares (με όποιο σωστό τρόπο θέλετε) ώστε να εμφανίσετε τα αποτελέσματα που επιστρέφει όταν της δοθούν ως παράμετροι εισόδου η τριάδα τιμών 3,4,5 (δείτε παρακάτω τα παραδείγματα). Επίσης χρησιμοποιήστε τη βιβλιοθήκη statistics για τον υπολογισμό του μέσου όρου. Παράδειγμα εκτέλεσης: Αν δοθούν ως παράμετροι εισόδου η τριάδα τιμών 3, 4, 5 τότε η squares θα επιστρέψει διαδοχικά 1, 0 και 1 γιατί ο μέσος όρος των 3, 4, 5 είναι 4 και τα τετράγωνα της διαφοράς κάθε τιμής από τον μέσο όρο είναι 1, 0 και 1 αντίστοιχα. Τι να προσέξετε: Υποθέτουμε πως στη squares δίνεται ως είσοδος πάντοτε ακέραιες τιμές (τουλάχιστον μία ή περισσότερες) άρα δεν χρειάζεται να κάνετε έλεγχο γι αυτό το θέμα. Η άσκηση σαφώς δεν ζητά να εκτελείται ο κώδικας πολλές φορές μέσα σε βρόχο επανάληψης. Κάθε χρήση βρόχου επανάληψης που επαναλαμβάνει συνολικά την εκτέλεση του προγράμματος θα θεωρηθεί λάθος Εγώ έγραψα τον κώδικα που ζητείται και τα αποτελέσματα είναι τα επιθυμητά.Ωστόσο ο καθηγητής μου είπε πως για να πάρει 10/10 στην άσκηση θα πρέπει να έχει χρησιμοποιήσει σωστά στον γεννήτορα την εντολή return αλλιώς είναι -1 μονάδα.Η ερώτηση μου είναι πώς θα χρησιμοποιήσω return αφού δεν χρειάζεται να κάνω κάποιον έλεγχο στο πρόγραμμα? παρακάτω σας γράφω τον κώδικα που έγραψα θα μπορούσε κάποιος να μου πεί πώς να χρησιμοποιήσω την return και να μου το εξηγήσει? import statistics as st def squares(*args): for i in args: sq = (i-st.mean(args))**2 yield sq for k in squares(3,4,5): print(k)
k33theod Δημοσ. 28 Μαρτίου 2020 Δημοσ. 28 Μαρτίου 2020 Ίσως εννοεί αυτό >>> def squares2(*args): return ((i-st.mean(args))**2 for i in args) >>> for k in squares2(3,4,5): print(k) 1 0 1 >>> η επεξήγηση του για το πότε χρησιμοποιείται είναι εδώ Some simple generators can be coded succinctly as expressions using a syntax similar to list comprehensions but with parentheses instead of square brackets. These expressions are designed for situations where the generator is used right away by an enclosing function. Generator expressions are more compact but less versatile than full generator definitions and tend to be more memory friendly than equivalent list comprehensions. https://docs.python.org/3/tutorial/classes.html#generators
becoming_I Δημοσ. 28 Μαρτίου 2020 Δημοσ. 28 Μαρτίου 2020 import statistics def squares(*args): for i in args: var = (i-statistics.mean(args))**2 yield var return var for i in squares(3,4,5): print(i) η return επιστρέφει την τιμή μόλις τελειώσει η εκτέλεση της συνάρτησης. Είναι η ορθή πρακτική όταν κάνεις χρήση συναρτήσεων. 1 1
k33theod Δημοσ. 28 Μαρτίου 2020 Δημοσ. 28 Μαρτίου 2020 4 ώρες πριν, becoming_I είπε import statistics def squares(*args): for i in args: var = (i-statistics.mean(args))**2 yield var return var for i in squares(3,4,5): print(i) η return επιστρέφει την τιμή μόλις τελειώσει η εκτέλεση της συνάρτησης. Είναι η ορθή πρακτική όταν κάνεις χρήση συναρτήσεων. Για εξήγησε λίγο γιατί πρώτη φορά το βλέπω
cddim Δημοσ. 28 Μαρτίου 2020 Μέλος Δημοσ. 28 Μαρτίου 2020 7 ώρες πριν, becoming_I είπε import statistics def squares(*args): for i in args: var = (i-statistics.mean(args))**2 yield var return var for i in squares(3,4,5): print(i) η return επιστρέφει την τιμή μόλις τελειώσει η εκτέλεση της συνάρτησης. Είναι η ορθή πρακτική όταν κάνεις χρήση συναρτήσεων. Εγώ όμως δεν κατάλαβα γιατί να βάλω την return αφού και χωρίς το τρέχει σωστά. Δεν θα επρπε να κάνω κάποιον έλεγχο με ιφ για να την χρησιμοποιήσω
Lanike71 Δημοσ. 28 Μαρτίου 2020 Δημοσ. 28 Μαρτίου 2020 Κατ΄αρχήν άσχετο, αλλά μου θυμίζει κάποιον τύπο...Μάλλον κάτι με την τυπική απόκλιση. Όπως είπε και συμφορουμίτης, μία συνάρτηση συμπεριφέρεται σαν ένα μαγικό κουτί. Του βάζω κάτι και μου επιστρέφει κάτι. Του δίνω τιμές, μου δίνει αποτέλεσμα, του δίνω ακέραιο, μου επιστρέφει στο τετράγωνο κλπ. Το τι θα κάνω εγώ με την τιμή, είναι δικό μου θέμα μετά. Θα έχω να κοιτάξω μόνο στη main πλέον και όχι να πάω να (ξανα) διορθώσω τη συνάρτηση 1
pmav99 Δημοσ. 28 Μαρτίου 2020 Δημοσ. 28 Μαρτίου 2020 7 hours ago, becoming_I said: import statistics def squares(*args): for i in args: var = (i-statistics.mean(args))**2 yield var return var for i in squares(3,4,5): print(i) η return επιστρέφει την τιμή μόλις τελειώσει η εκτέλεση της συνάρτησης. Είναι η ορθή πρακτική όταν κάνεις χρήση συναρτήσεων. Αυτό που λες είναι σωστό μεν, αλλά ... Η squares είναι generator function. To return στις generator functions έχει διαφορετικά semantics και διαφορετικό σκοπό. Σε μια generator function, return value σημαίνει επι της ουσίας raise StopIteration(value). To return είναι απλά syntactic sugar Πιο συγκεκριμένα, το return σε μία generator function επιτράπηκε από την Pyhon 3.3 και μετά. Εισήχθηκε μέσω του PEP 380. ο τίτλος του PEP είναι "Syntax for Delegating to a Subgenerator" και ο λόγος που εισήχθηκε το return εξηγείται εδώ: https://www.python.org/dev/peps/pep-0380/#use-of-stopiteration-to-return-values Ειλικρινά, δεν νομίζω να έχει κάτι τέτοιο στο νου του ο καθηγητής του OP + εδώ έχει απλούς generators. Ούτε nested, ούτε yield from, ούτε τίποτα. 2
k33theod Δημοσ. 29 Μαρτίου 2020 Δημοσ. 29 Μαρτίου 2020 7 ώρες πριν, cddim είπε Αρα πως είναι ο σωστός κώδικας? Εγώ λέω χωρίς return.
pmav99 Δημοσ. 29 Μαρτίου 2020 Δημοσ. 29 Μαρτίου 2020 (επεξεργασμένο) 10 hours ago, cddim said: Αρα πως είναι ο σωστός κώδικας? Αν βάλεις return, τότε βάλε το χωρίς το value. Σκέτο return δηλαδή. Αλλά είτε το βάλεις σκέτο είτε δεν το βάλεις καθόλου δεν έχει διαφορά. H generator function θα κάνει raise StopIteration είτε το return είναι explicit είτε implicit. Προσωπικά θα του ανέφερα τι λέει το PEP 380 και θα ζητούσα περαιτέρω εξηγήσεις. ΥΓ. minor nitpick. Τον μέσο όρο των τιμών δεν χρειάζεται να τον υπολογίζεις για κάθε τιμή που κάνεις yield: def squares(*args): mean = statistics.mean(args) for i in args: var = (i - mean)**2 yield var Επεξ/σία 29 Μαρτίου 2020 από pmav99 1
k33theod Δημοσ. 29 Μαρτίου 2020 Δημοσ. 29 Μαρτίου 2020 3 ώρες πριν, pmav99 είπε ΥΓ. minor nitpick. Τον μέσο όρο των τιμών δεν χρειάζεται να τον υπολογίζεις για κάθε τιμή που κάνεις yield: def squares(*args): mean = statistics.mean(args) for i in args: var = (i - mean)**2 yield var καθολου minor, ειναι το σημαντικοτερο της συζητησης👍
fpan Δημοσ. 7 Μαΐου 2020 Δημοσ. 7 Μαΐου 2020 (επεξεργασμένο) Και αν ζητείται η squares να χρησμοποιεί την yield και την return; Επεξ/σία 7 Μαΐου 2020 από fpan
hoannis Δημοσ. 11 Δεκεμβρίου 2020 Δημοσ. 11 Δεκεμβρίου 2020 (επεξεργασμένο) Επανέρχομαι μετά από καιρό , αλλά αντιμετωπίζω το ίδιο θέμα η διαφορά είναι ότι ζητάνε στην εκφώνηση της άσκησης (επιπλέον από αυτά που έγραψε ο TS , στο πρώτο ποστ) τα παρακάτω . Εμφαση στα Bold. "ΠΩΣ ΘΑ ΒΑΘΜΟΛΟΓΗΘΕΙ Η ΑΣΚΗΣΗ Κάθε άσκηση που θα επιστρέφει σωστά αποτελέσματα στα δεδομένα εισόδου που θα δώσει ο αυτόματος βαθμολογητής θα παίρνει 4 μονάδες (άσχετα αν η squares είναι σωστά γραμμένη με τη μορφή γεννήτορα κλπ.) Αν η squares είναι σωστά γραμμένη ως γεννήτορας θα παίρνει επιπρόσθετα 2 μονάδες. Αν η squares δέχεται σωστά απροσδιόριστο πλήθος παραμέτρων θα παίρνει επιπρόσθετα 2 μονάδες. Αν χρησιμοποιείται η βιβλιοθήκη statistics θα παίρνει επιπρόσθετα 1 μονάδα. Τέλος αν η squares χρησιμοποιεί σωστά και τη return θα παίρνει επιπρόσθετα 1 μονάδα. " Ισως ενδιαφέρει : Η άσκηση είναι από το site https://colmooc.gunet.gr όπου μπορείτε , εντελώς δωρεάν , να παρακολουθήσετε μαθήματα Python. Το συγκεκριμένο θέμα είναι το Προγραμματισμός σε Python για μη-Προγραμματιστές https://colmooc.gunet.gr/info/?course=COLMOOC113 και οι καθηγητές διδάσκουν στο Τμήμα Πληοφορικής του Αριστελείου Πανεπιστημίου Θεσσαλονίκης Επεξ/σία 11 Δεκεμβρίου 2020 από hoannis
Johnkatsab Δημοσ. 14 Δεκεμβρίου 2020 Δημοσ. 14 Δεκεμβρίου 2020 Spoiler Στις 11/12/2020 στις 12:58 ΜΜ, hoannis είπε Επανέρχομαι μετά από καιρό , αλλά αντιμετωπίζω το ίδιο θέμα η διαφορά είναι ότι ζητάνε στην εκφώνηση της άσκησης (επιπλέον από αυτά που έγραψε ο TS , στο πρώτο ποστ) τα παρακάτω . Εμφαση στα Bold. "ΠΩΣ ΘΑ ΒΑΘΜΟΛΟΓΗΘΕΙ Η ΑΣΚΗΣΗ Κάθε άσκηση που θα επιστρέφει σωστά αποτελέσματα στα δεδομένα εισόδου που θα δώσει ο αυτόματος βαθμολογητής θα παίρνει 4 μονάδες (άσχετα αν η squares είναι σωστά γραμμένη με τη μορφή γεννήτορα κλπ.) Αν η squares είναι σωστά γραμμένη ως γεννήτορας θα παίρνει επιπρόσθετα 2 μονάδες. Αν η squares δέχεται σωστά απροσδιόριστο πλήθος παραμέτρων θα παίρνει επιπρόσθετα 2 μονάδες. Αν χρησιμοποιείται η βιβλιοθήκη statistics θα παίρνει επιπρόσθετα 1 μονάδα. Τέλος αν η squares χρησιμοποιεί σωστά και τη return θα παίρνει επιπρόσθετα 1 μονάδα. " Ισως ενδιαφέρει : Η άσκηση είναι από το site https://colmooc.gunet.gr όπου μπορείτε , εντελώς δωρεάν , να παρακολουθήσετε μαθήματα Python. Το συγκεκριμένο θέμα είναι το Προγραμματισμός σε Python για μη-Προγραμματιστές https://colmooc.gunet.gr/info/?course=COLMOOC113 και οι καθηγητές διδάσκουν στο Τμήμα Πληοφορικής του Αριστελείου Πανεπιστημίου Θεσσαλονίκης βρηκες καμια λυση? γιατι κι εγω το παλευω αλλα τιποτα
Johnkatsab Δημοσ. 14 Δεκεμβρίου 2020 Δημοσ. 14 Δεκεμβρίου 2020 με αυτο ομως δεν καταφερνεις κατι... οκ!
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα