Funciones (2)

En esta lección se tratan conceptos relativos a las funciones. Antes de leer esta lección se recomienda leer la lección Funciones (1):

Argumentos y devolución de valores

Las funciones en Python admiten argumentos en su llamada y permiten devolver valores. Estas posibilidades permiten crear funciones más útiles y fácilmente reutilizables.

En este apartado se muestran estos conceptos mediante cuatro ejemplos. En ellos, no se pretende encontrar la mejor solución al problema planteado, sino simplemente introducir los conceptos de argumentos y devolución de valores.


Aunque las funciones en Python pueden acceder a cualquier variable del programa declarándolas como variables globales o no locales, se necesita saber el nombre de las variables, como muestra el ejemplo siguiente:

Ejemplo de función 1

def escribe_media():
    media = (a + b) / 2
    print(f"La media de {a} y {b} es: {media}")
    return

a = 3
b = 5
escribe_media()
print("Programa terminado")
La media de 3 y 5 es: 4.0
Programa terminado

Puede ver la ejecución paso a paso de este programa utilizando los iconos de avance y retroceso situados abajo a la derecha.

Siguiente

Ejemplo de función 1 - Paso 1

def escribe_media():
    media = (a + b) / 2
    print(f"La media de {a} y {b} es: {media}")
    return

a = 3
b = 5
escribe_media()
print("Programa terminado")

En la primera instrucción se crea la variable "a".

Anterior Siguiente

Ejemplo de función 1 - Paso 2

def escribe_media():
    media = (a + b) / 2
    print(f"La media de {a} y {b} es: {media}")
    return

a = 3
b = 5
escribe_media()
print("Programa terminado")

En la segunda instrucción se crea la variable "b".

Anterior Siguiente

Ejemplo de función 1 - Paso 3

def escribe_media():
    media = (a + b) / 2
    print(f"La media de {a} y {b} es: {media}")
    return

a = 3
b = 5
escribe_media()
print("Programa terminado")

A continuación se realiza la llamada a la función.

Anterior Siguiente

Ejemplo de función 1 - Paso 4

def escribe_media():
    media = (a + b) / 2
    print(f"La media de {a} y {b} es: {media}")
    return

a = 3
b = 5
escribe_media()
print("Programa terminado")

Se ejecuta la primera instrucción de la función, que calcula la media de las variables "a" y "b" que, como no se les asigna valor en la función, Python considera variables globales.

Anterior Siguiente

Ejemplo de función 1 - Paso 5

def escribe_media():
    media = (a + b) / 2
    print(f"La media de {a} y {b} es: {media}")
    return

a = 3
b = 5
escribe_media()
print("Programa terminado")
La media de 3 y 5 es: 4.0

Se escribe el resultado de la operación.

Anterior Siguiente

Ejemplo de función 1 - Paso 6

def escribe_media():
    media = (a + b) / 2
    print(f"La media de {a} y {b} es: {media}")
    return

a = 3
b = 5
escribe_media()
print("Programa terminado")
La media de 3 y 5 es: 4.0

La instrucción return indica el final de la función y continúa la ejecución del programa tras la llamada a la función.

Anterior Siguiente

Ejemplo de función 1 - Paso 7

def escribe_media():
    media = (a + b) / 2
    print(f"La media de {a} y {b} es: {media}")
    return

a = 3
b = 5
escribe_media()
print("Programa terminado")
La media de 3 y 5 es: 4.0
Programa terminado

Se ejecuta la última instrucción del programa y el programa termina.

Anterior

El problema de una función de este tipo es que es muy difícil de reutilizar en otros programas o incluso en el mismo programa, ya que sólo es capaz de hacer la media de las variables "a" y "b". Si en el programa no se utilizan esos nombres de variables, la función no funcionaría.


Para evitar ese problema, las funciones admiten argumentos, es decir, permiten que se les envíen valores con los que trabajar. De esa manera, las funciones se pueden reutilizar más fácilmente, como muestra el ejemplo siguiente:

Ejemplo de función 2

def escribe_media(x, y):
    media = (x + y) / 2
    print(f"La media de {x} y {y} es: {media}")
    return

a = 3
b = 5
escribe_media(a, b)
print("Programa terminado")
La media de 3 y 5 es: 4.0
Programa terminado

Puede ver la ejecución paso a paso de este programa utilizando los iconos de avance y retroceso situados abajo a la derecha.

Siguiente

Ejemplo de función 2 - Paso 1

def escribe_media(x, y):
    media = (x + y) / 2
    print(f"La media de {x} y {y} es: {media}")
    return

a = 3
b = 5
escribe_media(a, b)
print("Programa terminado")

En la primera instrucción se crea la variable "a".

Anterior Siguiente

Ejemplo de función 2 - Paso 2

def escribe_media(x, y):
    media = (x + y) / 2
    print(f"La media de {x} y {y} es: {media}")
    return

a = 3
b = 5
escribe_media(a, b)
print("Programa terminado")

En la segunda instrucción se crea la variable "b".

Anterior Siguiente

Ejemplo de función 2 - Paso 3

def escribe_media(x, y):
    media = (x + y) / 2
    print(f"La media de {x} y {y} es: {media}")
    return

a = 3
b = 5
escribe_media(a, b)
print("Programa terminado")

A continuación se realiza la llamada a la función. De acuerdo con la definición de la función, se deben enviar dos argumentos. En este caso, se envían las variables "a" y "b".

Anterior Siguiente

Ejemplo de función 2 - Paso 4

def escribe_media(x, y):
    media = (x + y) / 2
    print(f"La media de {x} y {y} es: {media}")
    return

a = 3
b = 5
escribe_media(a, b)
print("Programa terminado")

Se ejecuta la primera instrucción de la función, que calcula la media de los argumentos "x" e "y". Los argumentos cogen su valor de los la llamada de la función. En esta caso la variable "x" toma su valor de la variable "a" y la variable "y" lo hace de "b".

Anterior Siguiente

Ejemplo de función 2 - Paso 5

def escribe_media(x, y):
    media = (x + y) / 2
    print(f"La media de {x} y {y} es: {media}")
    return

a = 3
b = 5
escribe_media(a, b)
print("Programa terminado")
La media de 3 y 5 es: 4.0

Se escribe el resultado de la operación.

Anterior Siguiente

Ejemplo de función 2 - Paso 6

def escribe_media(x, y):
    media = (x + y) / 2
    print(f"La media de {x} y {y} es: {media}")
    return

a = 3
b = 5
escribe_media(a, b)
print("Programa terminado")
La media de 3 y 5 es: 4.0

La instrucción return indica el final de la función y continúa la ejecución del programa tras la llamada a la función.

Anterior Siguiente

Ejemplo de función 2 - Paso 7

def escribe_media(x, y):
    media = (x + y) / 2
    print(f"La media de {x} y {y} es: {media}")
    return

a = 3
b = 5
escribe_media(a, b)
print("Programa terminado")
La media de 3 y 5 es: 4.0
Programa terminado

Se ejecuta la última instrucción del programa y el programa termina.

Anterior

Esta función puede ser utilizada con más flexibilidad que la del ejemplo anterior, puesto que el programador puede elegir a qué valores aplicar la función.

Pero esta función tiene todavía un inconveniente. Como las variables locales de una función son inaccesibles desde los niveles superiores, el programa principal no puede utilizar la variable "media" calculada por la función y tiene que ser la función la que escriba el valor. Pero eso complica la reutilización de la función, porque aunque es probable que en otro programa nos interese una función que calcule la media, es más difícil que nos interese que escriba el valor nada más calcularlo.


Para evitar ese problema, las funciones pueden devolver valores, es decir, pueden enviar valores al programa o función de nivel superior. De esa manera, las funciones se pueden reutilizar más fácilmente, como muestra el ejemplo siguiente:

Ejemplo de función 3

def calcula_media(x, y):
    resultado = (x + y) / 2
    return resultado

a = 3
b = 5
media = calcula_media(a, b)
print(f"La media de {a} y {b} es: {media}")
print("Programa terminado")
La media de 3 y 5 es: 4.0
Programa terminado

Puede ver la ejecución paso a paso de este programa utilizando los iconos de avance y retroceso situados abajo a la derecha.

Siguiente

Ejemplo de función 3 - Paso 1

def calcula_media(x, y):
    resultado = (x + y) / 2
    return resultado

a = 3
b = 5
media = calcula_media(a, b)
print(f"La media de {a} y {b} es: {media}")
print("Programa terminado")

En la primera instrucción se crea la variable "a".

Anterior Siguiente

Ejemplo de función 3 - Paso 2

def calcula_media(x, y):
    resultado = (x + y) / 2
    return resultado

a = 3
b = 5
media = calcula_media(a, b)
print(f"La media de {a} y {b} es: {media}")
print("Programa terminado")

En la segunda instrucción se crea la variable "b".

Anterior Siguiente

Ejemplo de función 3 - Paso 3

def calcula_media(x, y):
    resultado = (x + y) / 2
    return resultado

a = 3
b = 5
media = calcula_media(a, b)
print(f"La media de {a} y {b} es: {media}")
print("Programa terminado")

La tercera instrucción guarda en la variable "media" el valor que devuelve la función calcula_media(). Pero en primer lugar se ejecuta la llamada a la función. De acuerdo con la definición de la función, se deben enviar dos argumentos. En este caso, se envían las variables "a" y "b".

Anterior Siguiente

Ejemplo de función 3 - Paso 4

def calcula_media(x, y):
    resultado = (x + y) / 2
    return resultado

a = 3
b = 5
media = calcula_media(a, b)
print(f"La media de {a} y {b} es: {media}")
print("Programa terminado")

Se ejecuta la primera instrucción de la función, que calcula la media de los argumentos "x" e "y". Los argumentos cogen su valor de los la llamada de la función. En esta caso la variable "x" toma su valor de la variable "a" y la variable "y" lo hace de "b".

Anterior Siguiente

Ejemplo de función 3 - Paso 5

def calcula_media(x, y):
    resultado = (x + y) / 2
    return resultado

a = 3
b = 5
media = calcula_media(a, b)
print(f"La media de {a} y {b} es: {media}")
print("Programa terminado")

La instrucción return indica el final de la función pero también el valor que devuelve la función. La ejecución del programa continúa tras la llamada a la función.

Anterior Siguiente

Ejemplo de función 3 - Paso 6

def calcula_media(x, y):
    resultado = (x + y) / 2
    return resultado

a = 3
b = 5
media = calcula_media(a, b)
print(f"La media de {a} y {b} es: {media}")
print("Programa terminado")

El valor devuelto por la función se guarda en la variable "media".

Anterior Siguiente

Ejemplo de función 3 - Paso 7

def calcula_media(x, y):
    resultado = (x + y) / 2
    return resultado

a = 3
b = 5
media = calcula_media(a, b)
print(f"La media de {a} y {b} es: {media}")
print("Programa terminado")
La media de 3 y 5 es: 4.0

Se escribe el resultado de la operación.

Anterior Siguiente

Ejemplo de función 3 - Paso 8

def calcula_media(x, y):
    resultado = (x + y) / 2
    return resultado

a = 3
b = 5
media = calcula_media(a, b)
print(f"La media de {a} y {b} es: {media}")
print("Programa terminado")
La media de 3 y 5 es: 4.0
Programa terminado

Se ejecuta la última instrucción del programa y el programa termina.

Anterior

Esta función puede ser utilizada con más flexibilidad que la del ejemplo anterior, puesto que el programador puede elegir qué hacer con el valor calculado por la función.

Pero esta función tiene todavía un inconveniente y es que sólo calcula la media de dos valores. Sería más interesante que la función calculara la media de cualquier cantidad de valores.


Para evitar ese problema, las funciones pueden admitir una cantidad indeterminada de valores, como muestra el ejemplo siguiente:

Ejemplo de función 4

def calcula_media(*args):
    total = 0
    for i in args:
        total += i
    resultado = total / len(args)
    return resultado

a, b, c = 3, 5, 10
media = calcula_media(a, b, c)
print(f"La media de {a}, {b} y {c} es: {media}")
print("Programa terminado")
La media de 3, 5 y 10 es: 6.0
Programa terminado

Puede ver la ejecución paso a paso de este programa utilizando los iconos de avance y retroceso situados abajo a la derecha.

Siguiente

Ejemplo de función 4 - Paso 1

def calcula_media(*args):
    total = 0
    for i in args:
        total += i
    resultado = total / len(args)
    return resultado

a, b, c = 3, 5, 10
media = calcula_media(a, b, c)
print(f"La media de {a}, {b} y {c} es: {media}")
print("Programa terminado")

En la primera instrucción se crean las variables "a", "b" y "c".

Anterior Siguiente

Ejemplo de función 4 - Paso 2

def calcula_media(*args):
    total = 0
    for i in args:
        total += i
    resultado = total / len(args)
    return resultado

a, b, c = 3, 5, 10
media = calcula_media(a, b, c)
print(f"La media de {a}, {b} y {c} es: {media}")
print("Programa terminado")

La segunda instrucción guarda en la variable "media" el valor que devuelve la función calcula_media(). Pero en primer lugar se ejecuta la llamada a la función. De acuerdo con la definición de la función, se puede enviar cualquier número de argumentos. En este caso, se envían las variables "a", "b" y "c".

Anterior Siguiente

Ejemplo de función 4 - Paso 3

def calcula_media(*args):
    total = 0
    for i in args:
        total += i
    resultado = total / len(args)
    return resultado

a, b, c = 3, 5, 10
media = calcula_media(a, b, c)
print(f"La media de {a}, {b} y {c} es: {media}")
print("Programa terminado")

Se ejecuta la primera instrucción de la función. Para calcular la media, el programa va a sumar todos los argumentos recibidos y dividir por el número de argumentos recibidos. Para calcular el total, se utiliza una variable auxiliar llamada "total" cuyo valor inicial es 0..

Anterior Siguiente

Ejemplo de función 4 - Paso 4

def calcula_media(*args):
    total = 0
    for i in args:
        total += i
    resultado = total / len(args)
    return resultado

a, b, c = 3, 5, 10
media = calcula_media(a, b, c)
print(f"La media de {a}, {b} y {c} es: {media}")
print("Programa terminado")

El bucle se ejecutará tantas veces como argumentos se hayan recibido, puesto que args es una tupla con tantos elementos como como argumentos.

Anterior Siguiente

Ejemplo de función 4 - Paso 5

def calcula_media(*args):
    total = 0
    for i in args:
        total += i
    resultado = total / len(args)
    return resultado

a, b, c = 3, 5, 10
media = calcula_media(a, b, c)
print(f"La media de {a}, {b} y {c} es: {media}")
print("Programa terminado")

Finalmente se divide el total por el número de elementos.

Anterior Siguiente

Ejemplo de función 4 - Paso 6

def calcula_media(*args):
    total = 0
    for i in args:
        total += i
    resultado = total / len(args)
    return resultado

a, b, c = 3, 5, 10
media = calcula_media(a, b, c)
print(f"La media de {a}, {b} y {c} es: {media}")
print("Programa terminado")

La instrucción return indica el final de la función pero también el valor que devuelve la función. La ejecución del programa continúa tras la llamada a la función.

Anterior Siguiente

Ejemplo de función 4 - Paso 7

def calcula_media(*args):
    total = 0
    for i in args:
        total += i
    resultado = total / len(args)
    return resultado

a, b, c = 3, 5, 10
media = calcula_media(a, b, c)
print(f"La media de {a}, {b} y {c} es: {media}")
print("Programa terminado")

El valor devuelto por la función se guarda en la variable "media".

Anterior Siguiente

Ejemplo de función 4 - Paso 8

def calcula_media(*args):
    total = 0
    for i in args:
        total += i
    resultado = total / len(args)
    return resultado

a, b, c = 3, 5, 10
media = calcula_media(a, b, c)
print(f"La media de {a}, {b} y {c} es: {media}")
print("Programa terminado")
La media de 3, 5 y 10 es: 6.0

Se escribe el resultado de la operación.

Anterior Siguiente

Ejemplo de función 4 - Paso 9

def calcula_media(*args):
    total = 0
    for i in args:
        total += i
    resultado = total / len(args)
    return resultado

a, b, c = 3, 5, 10
media = calcula_media(a, b, c)
print(f"La media de {a}, {b} y {c} es: {media}")
print("Programa terminado")
La media de 3, 5 y 10 es: 6.0
Programa terminado

Se ejecuta la última instrucción del programa y el programa termina.

Anterior

Esta última función puede ser utilizada con más flexibilidad que las anteriores, puesto que el programador puede elegir de cuántos valores hacer la media y qué hacer con el valor calculado por la función.


Las funciones pueden devolver varios valores simultáneamente, como muestra el siguiente ejemplo:

Ejemplo de función 5

def calcula_media_desviacion(*args):
    total = 0
    for i in args:
        total += i
    media = total / len(args)
    total = 0
    for i in args:
        total += (i - media) ** 2
    desviacion = (total / len(args)) ** 0.5
    return media, desviacion

a, b, c, d = 3, 5, 10, 12
media, desviacion_tipica = calcula_media_desviacion(a, b, c, d)
print(f"Datos: {a} {b} {c} {d}")
print(f"Media: {media}")
print(f"Desviación típica: {desviacion_tipica}")
print("Programa terminado")
Datos: 3 5 10 12
Media: 7.5
Desviación típica: 3.640054944640259
Programa terminado

Puede ver la ejecución paso a paso de este programa utilizando los iconos de avance y retroceso situados abajo a la derecha.

Siguiente

Ejemplo de función 5 - Paso 1

def calcula_media_desviacion(*args):
    total = 0
    for i in args:
        total += i
    media = total / len(args)
    total = 0
    for i in args:
        total += (i - media) ** 2
    desviacion = (total / len(args)) ** 0.5
    return media, desviacion

a, b, c, d = 3, 5, 10, 12
media, desviacion_tipica = calcula_media_desviacion(a, b, c, d)
print(f"Datos: {a} {b} {c} {d}")
print(f"Media: {media}")
print(f"Desviación típica: {desviacion_tipica}")
print("Programa terminado")

En la primera instrucción se crean las variables "a", "b", "c" y "d".

Anterior Siguiente

Ejemplo de función 5 - Paso 2

def calcula_media_desviacion(*args):
    total = 0
    for i in args:
        total += i
    media = total / len(args)
    total = 0
    for i in args:
        total += (i - media) ** 2
    desviacion = (total / len(args)) ** 0.5
    return media, desviacion

a, b, c, d = 3, 5, 10, 12
media, desviacion_tipica = calcula_media_desviacion(a, b, c, d)
print(f"Datos: {a} {b} {c} {d}")
print(f"Media: {media}")
print(f"Desviación típica: {desviacion_tipica}")
print("Programa terminado")

La segunda instrucción guarda en las variables "media" y desviacion_tipica los valores que devuelve la función calcula_media_desviacion(). Pero en primer lugar se ejecuta la llamada a la función. De acuerdo con la definición de la función, se puede enviar cualquier número de argumentos. En este caso, se envían las variables "a", "b", "c" y "d".

Anterior Siguiente

Ejemplo de función 5 - Paso 3

def calcula_media_desviacion(*args):
    total = 0
    for i in args:
        total += i
    media = total / len(args)
    total = 0
    for i in args:
        total += (i - media) ** 2
    desviacion = (total / len(args)) ** 0.5
    return media, desviacion

a, b, c, d = 3, 5, 10, 12
media, desviacion_tipica = calcula_media_desviacion(a, b, c, d)
print(f"Datos: {a} {b} {c} {d}")
print(f"Media: {media}")
print(f"Desviación típica: {desviacion_tipica}")
print("Programa terminado")

Las tres primeras instrucciones de la función calculan la media aritmética de los valores recibidos, como en el ejemplo anterior.

Anterior Siguiente

Ejemplo de función 5 - Paso 4

def calcula_media_desviacion(*args):
    total = 0
    for i in args:
        total += i
    media = total / len(args)
    total = 0
    for i in args:
        total += (i - media) ** 2
    desviacion = (total / len(args)) ** 0.5
    return media, desviacion

a, b, c, d = 3, 5, 10, 12
media, desviacion_tipica = calcula_media_desviacion(a, b, c, d)
print(f"Datos: {a} {b} {c} {d}")
print(f"Media: {media}")
print(f"Desviación típica: {desviacion_tipica}")
print("Programa terminado")

Las tres siguientes instrucciones de la función calculan la desviación típica de los valores recibidos, de forma similar a la media.

Anterior Siguiente

Ejemplo de función 5 - Paso 5

def calcula_media_desviacion(*args):
    total = 0
    for i in args:
        total += i
    media = total / len(args)
    total = 0
    for i in args:
        total += (i - media) ** 2
    desviacion = (total / len(args)) ** 0.5
    return media, desviacion

a, b, c, d = 3, 5, 10, 12
media, desviacion_tipica = calcula_media_desviacion(a, b, c, d)
print(f"Datos: {a} {b} {c} {d}")
print(f"Media: {media}")
print(f"Desviación típica: {desviacion_tipica}")
print("Programa terminado")

La instrucción return indica el final de la función pero también los valores que devuelve la función (en este caso, tanto la media como la desviación). La ejecución del programa continúa tras la llamada a la función.

Anterior Siguiente

Ejemplo de función 5 - Paso 6

def calcula_media_desviacion(*args):
    total = 0
    for i in args:
        total += i
    media = total / len(args)
    total = 0
    for i in args:
        total += (i - media) ** 2
    desviacion = (total / len(args)) ** 0.5
    return media, desviacion

a, b, c, d = 3, 5, 10, 12
media, desviacion_tipica = calcula_media_desviacion(a, b, c, d)
print(f"Datos: {a} {b} {c} {d}")
print(f"Media: {media}")
print(f"Desviación típica: {desviacion_tipica}")
print("Programa terminado")

Los valores devueltos por la función se guardan en las variables "media" y "desviacion_tipica".

Anterior Siguiente

Ejemplo de función 5 - Paso 7

def calcula_media_desviacion(*args):
    total = 0
    for i in args:
        total += i
    media = total / len(args)
    total = 0
    for i in args:
        total += (i - media) ** 2
    desviacion = (total / len(args)) ** 0.5
    return media, desviacion

a, b, c, d = 3, 5, 10, 12
media, desviacion_tipica = calcula_media_desviacion(a, b, c, d)
print(f"Datos: {a} {b} {c} {d}")
print(f"Media: {media}")
print(f"Desviación típica: {desviacion_tipica}")
print("Programa terminado")
Datos: 3 5 10 12

Las últimas instrucciones escriben los datos y resultados.

Anterior Siguiente

Ejemplo de función 5 - Paso 8

def calcula_media_desviacion(*args):
    total = 0
    for i in args:
        total += i
    media = total / len(args)
    total = 0
    for i in args:
        total += (i - media) ** 2
    desviacion = (total / len(args)) ** 0.5
    return media, desviacion

a, b, c, d = 3, 5, 10, 12
media, desviacion_tipica = calcula_media_desviacion(a, b, c, d)
print(f"Datos: {a} {b} {c} {d}")
print(f"Media: {media}")
print(f"Desviación típica: {desviacion_tipica}")
print("Programa terminado")
Datos: 3 5 10 12
Media: 7.5

Las últimas instrucciones escriben los datos y resultados.

Anterior Siguiente

Ejemplo de función 5 - Paso 9

def calcula_media_desviacion(*args):
    total = 0
    for i in args:
        total += i
    media = total / len(args)
    total = 0
    for i in args:
        total += (i - media) ** 2
    desviacion = (total / len(args)) ** 0.5
    return media, desviacion

a, b, c, d = 3, 5, 10, 12
media, desviacion_tipica = calcula_media_desviacion(a, b, c, d)
print(f"Datos: {a} {b} {c} {d}")
print(f"Media: {media}")
print(f"Desviación típica: {desviacion_tipica}")
print("Programa terminado")
Datos: 3 5 10 12
Media: 7.5
Desviación típica: 3.640054944640259

Las últimas instrucciones escriben los datos y resultados.

Anterior Siguiente

Ejemplo de función 5 - Paso 10

def calcula_media_desviacion(*args):
    total = 0
    for i in args:
        total += i
    media = total / len(args)
    total = 0
    for i in args:
        total += (i - media) ** 2
    desviacion = (total / len(args)) ** 0.5
    return media, desviacion

a, b, c, d = 3, 5, 10, 12
media, desviacion_tipica = calcula_media_desviacion(a, b, c, d)
print(f"Datos: {a} {b} {c} {d}")
print(f"Media: {media}")
print(f"Desviación típica: {desviacion_tipica}")
print("Programa terminado")
Datos: 3 5 10 12
Media: 7.5
Desviación típica: 3.640054944640259
Programa terminado

Se ejecuta la última instrucción del programa y el programa termina.

Anterior

Conflictos entre nombres de parámetros y nombre de variables globales

En Python no se producen conflictos entre los nombres de los parámetros y los nombres de las variables globales. Es decir, el nombre de un parámetro puede coincidir o no con el de una variable global, pero Python no los confunde: en el ámbito de la función el parámetro hace siempre referencia al dato recibido y no a la variable global y los programas producen el mismo resultado.

Eso nos facilita reutilizar funciones en otros programas sin tener que preocuparnos por este detalle.

Aunque, como siempre, dependiendo de si a la función se le envía como parámetro un objeto mutable o inmutable, la función podrá modificar o no al objeto. En los dos siguientes ejemplos, el parámetro de la función ("b") se llama igual que una de las dos variables del programa principal. En los dos ejemplos se llama dos veces a la función, enviando cada vez una de las dos variables ("a" y "b").

Paso por valor o paso por referencia

En los lenguajes en los que las variables son "cajas" en las que se guardan valores, cuando se envía una variable como argumento en una llamada a una función suelen existir dos posibilidades:

En Python no se hace ni una cosa ni otra. En Python cuando se envía una variable como argumento en una llamada a una función lo que se envía es la referencia al objeto al que hace referencia la variable. Dependiendo de si el objeto es mutable o inmutable, la función podrá modificar o no el objeto.