Ερωτήσεις στις συναρτήσεις

Ξεκίνησε από Λαμπράκης Μανώλης, 14 Δεκ 2017, 01:56:15 ΜΜ

« προηγούμενο - επόμενο »

Λαμπράκης Μανώλης

Καλημέρα σε όλους

Ήθελα να κάνω κάποιες ερωτήσεις στις συναρτήσεις καθώς διδάσκω πρώτη φορά python και θα ήθελα να ακούσω κάποιες γνώμες

1) η συνάρτηση γίνεται να επιστρέψει περισσότερες από μία τιμές ;; από αυτά που λέει το βιβλίο νομίζω όχι, σωστά ;;

2) αν οι παράμετροι αλλάξουν μέσα στην συνάρτηση, δεν επιστρέφονται οι αλλαγές σωστά ;; εκτός αν είναι global   η μεταβλητή

3) η τιμή που επιστρέφεται με το  return πως μπορεί να αξιοποιηθεί ;; μπορεί πχ να εκχωρηθεί σε κάποια μεταβλητή ;; πχ    x= f(a,b) ;;; διαφορετικά αν η f   υπολογίζει πχ το άθροισμα των a,b  κατά την κλήση f(a,b)  πως μπορώ να ελέγξω πχ αν το άθροισμα είναι μεγαλύτερο από 5 ;;


Ευχαριστώ

bugman

1) Ναι, λέγεται tuple και μπορεί να έχει μια σειρά αποτελεσμάτων. Όταν διαβάζουμε από τέτοια συνάρτηση ή θα πάρουμε tuple, ή θα το ανοίξουμε απευθείας σε τόσες μεταβλητές όσες και οι τιμές στο tuple.
2) Διάβασε αυτό: http://effbot.org/zone/call-by-object.htm
Στην Python, δεν υπάρχει πέρασμα με τιμή, ούτε πέρασμα με αναφορά, Αυτό που περνάει είναι ο δείκτης το αντικειμένου. Αν το αντικείμενο δέχεται αλλαγές, τότε θα τις πάρει.

Δεν είναι με αναφορά γιατί δεν μπορούμε να αλλάξουμε αντικείμενο σε αυτό που καλεί τη συνάρτηση. Για να αλλάξει θα πρέπει να πάρει άλλο δείκτη, αλλά οι δείκτες δεν πάνε προς τα πίσω! Αν όμως δέχεται το αντικείμενο αλλαγές, τότε χωρίς να αλλάξει ο δείκτης στο αντικείμενο μπορούμε να αλλάξουμε τις τιμές σε αυτό, άρα να αφήσουμε το αντικείμενο με νέες τιμές (αυτό φαίνεται σαν πέρασμα με αναφορά, αλλά δεν είναι, δεν έχουμε τον έλεγχο της μεταβλητής που φυλάσσεται ο δείκτης στο αντικείμενο και πέρασε ως όρισμα, αλλά το αντικείμενο μόνο). Ούτε είναι πέρασμα με τιμή, αφού αν αλλάζει το αντικείμενο, μπορεί να αλλάξει και να φανούν οι αλλαγές στην επιστροφή.

Στη Visual Basic 6 για παράδειγμα όλα περνούν με αναφορά εκτός και είναι σταθερές ή ορίσουμε ότι θα περάσει με τιμή. Εκεί ένα αντικείμενο μπορεί να αλλάξει δείκτη, όταν περνάει με αναφορά, γιατί δεν περνάει ο δείκτης του αντικειμένου, αλλά η διεύθυνση της μεταβλητής, που έχει το δείκτη του αντικειμένου!

3) Σπάμε το πρόβλημα σε δυο μέρη: Άθροισμα, και έλεγχος συνθήκης. Αν τώρα από το πρώτο μέρος κρατήσουμε σε μεταβλητή το άθροισμα τότε μας είναι πιο εύκολο να συγκρίνουμε τη μεταβλητή με το 5 με την χρήση του >.


taxata

#2
@ Λαμπράκης Μανώλης
Σου γράφω μερικά παραδείγματα για το ερώτημα 1 & 3
ο όρος τιμή ως επιςτροφή στη συνάρτηςη δεν είναι απόλυτα ακριβής εφόσον στην python everything is an object.
Μπορείς να επιστρέφεις ένα αντικείμενο (εδώ: tuple) που μπορεί να περιέχει  χρησιμοποιώντας τις εκτεταμένες δυνατότητες πολυμορφισμού της γλώσσας εάν επιθυμείς και το επιτρέπει η δομή του και άλλα αντικείμενα (εδώ: int, boolean)
πιστεύω κάτι  τέτοιο ψάχνεις
Κώδικας: python
>>> def f(a,b):
	xsum = a + b
	above = True
	if xsum < 5:
		above = False
	return xsum, above

>>> f(3,4)
(7, True)
>>> xsum , result = f(3,4)
>>> xsum
7
>>> result
True
>>> f(3,4)[0]
7
>>> f(3,4)[1]
True
>>> 
>>> type(f(3,4))
<type 'tuple'>
>>> type(f(3,4)[0])
<type 'int'>
>>> type(f(3,4)[1])
<type 'bool'>
>>>
Τάσος_Χατζηπαπαδόπουλος
Κύριε δεν έχω internet
http://users.sch.gr/chatzipap/

Καρκαμάνης Γεώργιος

Μανώλη όσο αφορά την 1η ερώτηση σου, το σχολικό βιβλιο εστιάζει σε παραδείγματα στα οποία η συνάρτηση επιστρέφει μία μονο τιμή. Στην πραγματικότητα η Python δίνει τη δυνατότητα να επιστρεφούν περισσότερες από μια τιμές μέσω των συναρτήσεων.

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

3η ερώτηση, η επιστρεφόμενη τιμή μπορεί να χρησιμοποιηθεί μέσα σε οποιαδήποτε έκφραση, είτε αριθμητική είτε λογική ή να εκχωρηθεί σε μια μεταβλητή

def sum(a,b):
   return a+b

# program
a,b=input()
if sum(a,b) >5:
   print "sum >5'
else:
   print "sum <=5'

Σάκης Δημόπουλος


George Eco