Διαδρομές
/
Python
Python
/
Ύλη
/
Ορίσματα Συναρτήσεων
Ορ

Ορίσματα Συναρτήσεων σε Python

{one: "1 άσκηση", other: "%{count} ασκήσεις"}

Σχετικά με την έννοια Ορίσματα Συναρτήσεων

Για τα βασικά των ορισμάτων συναρτήσεων, δες την έννοια των συναρτήσεων.

Ονόματα παραμέτρων

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

Ορίσματα θέσης

Τα ορίσματα θέσης είναι τιμές που περνιούνται σε μια συνάρτηση με την ίδια σειρά με τις παραμέτρους που αντιστοιχούν σε αυτά. Τα ορίσματα θέσης μπορούν προαιρετικά να περαστούν χρησιμοποιώντας το όνομα της παραμέτρου τους:

def concat(greeting, name):
    return f"{greeting}{name}"

# Passing data to the function by position.
print(concat("Hello, ", "Lilly"))
#->  Hello, Lilly

# Passing data to the function using the parameter name.
print(concat(name="Glenn", greeting="Hello, "))
#-> Hello, Glenn

Η πρώτη κλήση της concat περνάει τα ορίσματα με βάση τη θέση. Η δεύτερη κλήση της concat περνάει τα ορίσματα με βάση το όνομα, επιτρέποντας να αλλάξουν οι θέσεις τους.

Σημείωσε ότι τα ορίσματα θέσης δεν μπορούν να ακολουθούν ορίσματα που περάστηκαν με όνομα (που ονομάζονται επίσης ορίσματα με λέξη-κλειδί. Δεν πρέπει να συγχέονται με τις παραμέτρους μεταβλητής θέσης ή με τα **kwargs**).

Αυτό το σύνολο ορισμάτων:

print(concat(greeting="Hello, ", "Gregor"))

Οδηγεί σε αυτό το σφάλμα:

SyntaxError: positional argument follows keyword argument

Η απαίτηση ορισμάτων μόνο θέσης για κλήσεις συναρτήσεων μπορεί να γίνει με τη χρήση του τελεστή / στη λίστα παραμέτρων:

# Parameters showing a position-only operator. 
def concat(greeting, name, /):
    return f"{greeting}{name}"

print(concat("Hello, ", "Ginnie"))
#-> Hello, Ginnie

# Call to the function using keyword arguments.
print(concat(name="Franklin", greeting="Hello, "))
Traceback (most recent call last):
    print(concat(name="Franklin", greeting="Hello, "))
TypeError: concat() got some positional-only arguments passed as keyword arguments: 'greeting, name'

Ορίσματα με λέξη-κλειδί

Τα ορίσματα με λέξη-κλειδί χρησιμοποιούν το όνομα της παραμέτρου όταν καλείς μια συνάρτηση. Μπορούν προαιρετικά να δοθούν με βάση τη θέση:

def concat(greeting, name):
    return f"{greeting}{name}"

# Function call using parameter names as argument keywords.
print(concat(name="Eliza", greeting="Hello, "))
#-> Hello, Eliza

# Function call with positional data as arguments.
print(concat("Hello, ", "Tim"))
#-> Hello, Tim

Η απαίτηση ορισμάτων μόνο λέξης-κλειδιού για κλήσεις συναρτήσεων μπορεί να γίνει με τη χρήση του τελεστή * στη λίστα παραμέτρων:

# Function definition requiring keyword-only arguments.
def concat(*, greeting, name):
    return f"{greeting}{name}"

# Keyword arguments can be in an arbitrary order.
print(concat(name="Kimmie", greeting="Hello, "))
#-> Hello, Kimmie

# Calling the function with positional data raises an error.
print(concat("Hello, ", "Coleen"))
Traceback (most recent call last):
    print(concat("Hello, ", "Coleen"))
TypeError: concat() takes 0 positional arguments but 2 were given

Προεπιλεγμένες τιμές ορισμάτων

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

# Function with default argument values.
def concat(greeting, name="you", punctuation="!"):
    return f"{greeting}, {name}{punctuation}"

print(concat("Hello"))
#-> Hello, you!

# Overriding the default values
print(concat("Hello", name="Polly", punctuation="."))
#-> Hello, Polly.

Ορίσματα θέσης ή με λέξη-κλειδί

Τα ορίσματα μπορούν να είναι θέσης ή με λέξη-κλειδί, αν στον ορισμό των παραμέτρων δεν χρησιμοποιείται ούτε ο τελεστής / ούτε ο *. Εναλλακτικά, τα ορίσματα θέσης ή λέξης-κλειδιού μπορούν να τοποθετηθούν ανάμεσα στις παραμέτρους μόνο θέσης στα αριστερά και στις παραμέτρους μόνο λέξης-κλειδιού στα δεξιά:

# Position-only argument followed by position-or-keyword, followed by keyword-only.
def concat(greeting, /, name, *, ending):
    return f"{greeting}{name}{ending}"

print(concat("Hello, ", "Mark", ending="!"))
#-> Hello, Mark!

print(concat("Hello, ", name="Rachel", ending="!"))
#-> Hello, Rachel!

print(concat(greeting="Hello, ", name="JoJo", ending="!"))
Traceback (most recent call last):
    print(concat(greeting="Hello, ", name="JoJo", ending="!"))
TypeError: concat() got some positional-only arguments passed as keyword arguments: 'greeting'

*args

Τα παραδείγματα κώδικα συχνά χρησιμοποιούν έναν ορισμό συνάρτησης σαν τον παρακάτω:

def my_function(*args, **kwargs):
    # code snipped

Το *args είναι ένα όνομα δύο μερών που αντιπροσωπεύει ένα tuple με αόριστο αριθμό ξεχωριστών ορισμάτων θέσης, γνωστό και ως variadic argument. Το args είναι το όνομα που δίνεται στο tuple των ορισμάτων, αλλά θα μπορούσε να είναι οποιοδήποτε άλλο έγκυρο όνομα στην Python, όπως my_args, arguments κ.λπ. Το * είναι ο τελεστής που μετατρέπει την ομάδα των ξεχωριστών ορισμάτων σε tuple.

Note

Αν έχεις ποτέ αποσυσκευάσει ένα tuple, μπορεί να σου φαίνεται μπερδεμένο το * στο *args. Το * σε έναν ορισμό παραμέτρου, αντί να αποσυσκευάζει ένα tuple, μετατρέπει ένα ή περισσότερα ορίσματα θέσης σε ένα tuple.

Λέμε ότι ο τελεστής * είναι υπερφορτωμένος, καθώς συμπεριφέρεται διαφορετικά σε διαφορετικά πλαίσια. Για παράδειγμα, το * χρησιμοποιείται για πολλαπλασιασμό, χρησιμοποιείται για αποσυσκευασία και χρησιμοποιείται για τον ορισμό ενός αυθαίρετου αριθμού παραμέτρων θέσης.

Εφόσον μπορούμε να διατρέξουμε ένα tuple, το args μπορεί να περαστεί σε οποιαδήποτε άλλη συνάρτηση που δέχεται ένα iterable. Αν και το *args συνήθως εμφανίζεται μαζί με το **kwargs, δεν είναι απαραίτητο:

def add(*args):
    # args is passed to the sum function, which iterates over it.
    return sum(args)

print(add(1, 2, 3))
#-> 6

Αν το *args ακολουθεί ένα ή περισσότερα ορίσματα θέσης, τότε το *args θα περιέχει ό,τι περισσεύει μετά τα ορίσματα θέσης:

def add(first, *args):
    # first will be 1, leaving the values 2 and 3 in *args
    return first + sum(args)

print(add(1, 2, 3))
#-> 6

Αν μετά το *args οριστούν ένα ή περισσότερα προεπιλεγμένα ορίσματα, είναι ξεχωριστά από τις τιμές του *args:


def add(first, *args, last=0):
    return first + sum(args) + last
 
print(add(1, 2, 3))
#-> 6

print(add(1, 2, 3, last=4))
#-> 10

# This uses the unpacking operator * to separate the list elements into positional arguments.
# It does not have the same behavior as the * (packing) in *args.
print(add(*[1, 2, 3]))
#-> 6

Σημείωσε ότι όταν ένα όρισμα βρίσκεται ήδη μέσα σε ένα iterable (όπως ένα tuple ή μία list), πρέπει να αποσυσκευαστεί πριν περαστεί σε μια συνάρτηση που δέχεται αυθαίρετο αριθμό ξεχωριστών ορισμάτων. Αυτό γίνεται με τη χρήση του *, που είναι ο τελεστής αποσυσκευασίας.

Το * σε αυτό το πλαίσιο αποσυσκευάζει το περιεχόμενο στα ξεχωριστά στοιχεία του, τα οποία μετά μετατρέπονται από το *args σε tuple. Όταν υπάρχουν μόνο ορίσματα θέσης, η αποσυσκευασία πρέπει να έχει ως αποτέλεσμα τόσα ορίσματα όσες είναι οι τυπικές παράμετροι που έχουν οριστεί.

Χωρίς αποσυσκευασία της λίστας που περνιέται στο add, το πρόγραμμα θα έβγαζε σφάλμα:

def add(first, *args, last=0):
    return first + sum(args) + last

print(add([1, 2, 3]))
Traceback (most recent call last):
    print(add([1, 2, 3]))
    return first + sum(args) + last
TypeError: can only concatenate list (not "int") to list

**kwargs

Το **kwargs είναι ένα όνομα δύο μερών που αντιπροσωπεύει αόριστο αριθμό ξεχωριστών ορισμάτων ζεύγους κλειδιού-τιμής. Το kwargs είναι το όνομα της ομάδας των ορισμάτων και θα μπορούσε να είναι οποιοδήποτε άλλο όνομα, όπως my_args, arguments κ.λπ. Τα ** μετατρέπουν την ομάδα των ονομασμένων ορισμάτων σε ένα dictionary με ζεύγη {argument name: argument value}.

Εφόσον μπορούμε να διατρέξουμε ένα dictionary, το kwargs μπορεί να περαστεί σε οποιαδήποτε άλλη συνάρτηση που δέχεται ένα iterable. Αν και το **kwargs συνήθως εμφανίζεται μαζί με το *args, δεν είναι απαραίτητο:

def add(**kwargs):
    return sum(kwargs.values())

print(add(one=1, two=2, three=3))
#-> 6

Σημείωσε ότι καλείται η μέθοδος dict.values() για να διατρέξουμε τις values του dictionary kwargs. Όταν διατρέχουμε ένα dictionary, από προεπιλογή διατρέχουμε τα keys, οπότε το dict.values() πρέπει να δηλωθεί ρητά:

def concat(**kwargs):
    # Join concatenates the tuples from `kwargs.items()`
    return " ".join((str(item) for item in kwargs.items()))

print(concat(one=1, two=2, three=3))
#-> ('one', 1) ('two', 2) ('three', 3)
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα