Προς το περιεχόμενο

Άσκηση PYTHON


cddim

Προτεινόμενες αναρτήσεις

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)

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ίσως εννοεί αυτό

>>> 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

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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 επιστρέφει την τιμή μόλις τελειώσει η εκτέλεση της συνάρτησης. Είναι η ορθή πρακτική όταν κάνεις χρήση συναρτήσεων.

  • Like 1
  • Thanks 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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 επιστρέφει την τιμή μόλις τελειώσει η εκτέλεση της συνάρτησης. Είναι η ορθή πρακτική όταν κάνεις χρήση συναρτήσεων.

Για εξήγησε λίγο γιατί πρώτη φορά το βλέπω

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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 αφού και χωρίς το τρέχει σωστά. Δεν θα επρπε να κάνω κάποιον έλεγχο με ιφ για να την χρησιμοποιήσω 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Κατ΄αρχήν άσχετο, αλλά μου θυμίζει κάποιον τύπο...Μάλλον κάτι με την τυπική απόκλιση.

Όπως είπε και συμφορουμίτης, μία συνάρτηση συμπεριφέρεται σαν ένα μαγικό κουτί. Του βάζω κάτι και μου επιστρέφει κάτι. Του δίνω τιμές, μου δίνει αποτέλεσμα, του δίνω ακέραιο, μου επιστρέφει στο τετράγωνο κλπ.

Το τι θα κάνω εγώ με την τιμή, είναι δικό μου θέμα μετά. Θα έχω να κοιτάξω μόνο στη main πλέον και όχι να πάω να (ξανα) διορθώσω τη συνάρτηση

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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, ούτε τίποτα.

  • Like 2
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)
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

 

Επεξ/σία από pmav99
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

3 ώρες πριν, pmav99 είπε

 

ΥΓ. minor nitpick. Τον μέσο όρο των τιμών δεν χρειάζεται να τον υπολογίζεις για κάθε τιμή που κάνεις yield:


def squares(*args):
    mean = statistics.mean(args)
    for i in args:
        var = (i - mean)**2
        yield var

καθολου minor, ειναι το σημαντικοτερο της συζητησης👍

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 1 μήνα μετά...
  • 7 μήνες μετά...
Δημοσ. (επεξεργασμένο)

Επανέρχομαι μετά από καιρό , αλλά αντιμετωπίζω το ίδιο θέμα

η διαφορά είναι ότι ζητάνε στην εκφώνηση της άσκησης (επιπλέον  από αυτά που έγραψε ο 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

και οι καθηγητές διδάσκουν στο Τμήμα Πληοφορικής του Αριστελείου Πανεπιστημίου Θεσσαλονίκης

Επεξ/σία από hoannis
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

και οι καθηγητές διδάσκουν στο Τμήμα Πληοφορικής του Αριστελείου Πανεπιστημίου Θεσσαλονίκης

 

βρηκες καμια λυση? γιατι κι εγω το παλευω αλλα τιποτα

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...