Python_Tema5_Parte5_Funciones-Variables_v3
Python_Tema5_Parte5_Funciones-Variables_v3
Conceptos básicos y
sintaxis de Python
Funciones y variables
1
IBM SkillsBuild | Introducción a Python
Índice
Introducción 3
Ventajas de utilizar las funciones 4
Aumentan la reusabilidad de código y minimizan la redundancia
(repetición) 4
Permiten la descomposición procedural 4
Sintaxis básica de una función en Python 4
Funciones y polimorfismo 5
Funciones anidadas 6
Recursividad 6
Devolviendo múltiples valores simultáneamente 6
Experimenta 6
Ámbito de una función 7
Ámbitos y sus propiedades 7
Resolución de nombres. La regla LEGB 8
Parámetros y argumentos 11
Argumentos de las funciones 11
Un vistazo a las distintas formas de paso de argumentos 12
Consideraciones de diseño al programar con funciones 16
Acoplamiento 16
Cohesión 17
Experimenta 17
Definición de variables 18
Asignar un valor a una variable en Python 18
2
IBM SkillsBuild | Introducción a Python
Introducción
3
IBM SkillsBuild | Introducción a Python
Permiten la descomposición
Tras esto, y en una nueva línea, escribiremos el
procedural cuerpo de nuestra función, que consistirá en un
grupo de sentencias a ejecutar finalizando con la
Es decir, permiten descomponer programas en
sentencia opcional return acompañada del valor a
pequeñas partes donde cada parte tiene un rol bien
devolver.
definido. Por lo general es más fácil programar
pequeñas piezas de código y componerlas en
Para llamar a la función simplemente escribiremos el
programas más grandes que escribir todo el proceso
nombre de la misma seguida de los argumentos que
de una sola vez.
le queremos pasar, encapsulados entre paréntesis.
En esta unidad vamos a conocer la sintaxis necesaria Veamos un par de ejemplos:
para operar con funciones, aprenderemos el
def suma(a, b): # Definimos la función
concepto de ámbito (scope) y veremos cómo "suma". Tiene 2 parámetros.
parametrizar nuestras funciones para que sean más return a+b # "return" devuelve
genéricas. Con todo esto estaremos preparados para el resultado de la función.
iniciar un camino mucho más ambicioso en el mundo
suma(2, 3) # Llamada a la función.
de la programación en Python y que continuaremos Hay que pasarle dos parámetros.
en las próximas unidades y cursos de esta
especialización. # Resultado: 5
Como puedes ver, no es necesario utilizar return. En Esto es así porque en Python las funciones no tienen
las funciones que no tienen return, devuelven None. tipo (recordemos la unidad de Tipado Dinámico). En
un gran número de casos el tipo de salida de una
def suma(a, b): # Definimos la
función dependerá del tipo de los parámetros que le
función "suma". Tiene 2 parámetros.
return a+b # "return" devuelve pasemos(Hay excepciones a esta regla como por
el resultado de la función. ejemplo que nosotros estemos forzando el tipo de
salida en la sentencia return). Esta es una idea
x = suma (2, 3)
central en el lenguaje que le dota de una gran
print(x) # Guardamos el
resultado en x flexibilidad y de facilidades de reusar a la hora de
programar.
5
IBM SkillsBuild | Introducción a Python
Funciones anidadas
En esta función vemos que la condición de salida de
la recursividad se cumple cuando x es igual a 1.
def maxmin(lista):
return max(lista), min(lista) #
Devielveuna tupla de 2 elementos
l = [1, 3, 5, 6, 0]
Como vemos es posible crear funciones dentro de
maximo, minimo = maxmin(l) #
otras funciones. Desempaqueta la tupla en 2 variables
6
IBM SkillsBuild | Introducción a Python
7
IBM SkillsBuild | Introducción a Python
8
IBM SkillsBuild | Introducción a Python
Los ámbitos de búsqueda LEGB. Cuando se referencia una variable, Python realiza una búsqueda
empezando a nivel local y subiendo hasta builtins. La búsqueda finaliza en el primer ámbito donde se
encuentra el nombre referenciado.
9
IBM SkillsBuild | Introducción a Python
f1()
Esta variable es local a f2
Esta variable es local a f1. Enclosing a f2
Resultado:
Esta variable está en ámbito Global (de
módulo)
f1()
Esta vez, cuando intentamos acceder a una variable
L es local a f2 local a f2 desde f3, nos salta un error de nombre.
E también es local a f2 Esto es porque la búsqueda de nombres se hace
G también es local a f2
desde el ámbito local de f3 hacia arriba, pasando
primero al ámbito local de f1, luego al global y,
En este caso, la búsqueda se detiene en el ámbito finalmente, a builtins. En ningún caso entramos a
local de f2 ya que en ese mismo ámbito hemos buscar en el ámbito de f2. Fijaos, sin embargo, que f3
declarado variables con el mismo nombre (E y G). Por sí que tiene acceso a los ámbitos global y builtins:
último, veamos qué pasa cuando intentamos acceder
desde el ámbito de una función al de otra.
10
IBM SkillsBuild | Introducción a Python
a, b = 5, 10
suma(2, 3) print(suma(a, b))
print(a, b) # a y b no han
suma(40, 30) cambiado fuera de la función
11
IBM SkillsBuild | Introducción a Python
En cambio, cuando pasamos un objeto mutable a una Un vistazo a las distintas formas de
función que lo modifica internamente, el cambio
afecta al exterior de la función:
paso de argumentos
Por defecto, los argumentos se pasan por posición.
def minimo(l):
Es decir, los argumentos de la llamada a una función
l[0] = 1000 # Modificamos la
tienen que pasarse en el mismo orden en el que se
lista en el interior
return min(l) definió la función.
f(1, 2, 3)
Resultado:
12
IBM SkillsBuild | Introducción a Python
f() # Si no hay
Resultado:
argumentos, Kargs es un diccionario vacío
f(a=1)
f(a=1, b=2)
f() # Si no hay
argumentos, args es una tupla vacía
f(1)
f(1, 2)
f(1, 2, 3, 4, 5, 6) Resultado:
13
IBM SkillsBuild | Introducción a Python
Resultado:
Resultado:
Este tipo de argumentos sólo puede ser pasado por Los argumentos tras el ‘*’ se convierten en keyword-
clave (keyword) y que nunca serán rellenados por only:
posición. Esto es útil en funciones que pueden recibir
cualquier número de argumentos y aun así permiten Veremos que hay muchas funciones escritas en
configuraciones opcionales. Python que aprovechan estas funcionalidades como,
por ejemplo, las funciones builtin zip y print.
def f(a, *, b, c): # Define 'b' y
'c' como keyword-only con el * la = [1, 2, 3, 4, 5]
print(a, b, c)
lb = list('abcde')
f(1, b=10, c=100) lc = list('ABCDE')
zlist
a, b, c = zip(*zlist) # El * en
zip desempaqueta lista de tuplas
print(la, lb) #
Seperador por defecto es espacio
Resultado:
15
IBM SkillsBuild | Introducción a Python
Consideraciones de diseño
al programar con Acoplamiento
funciones • Crea funciones que sólo reciben inputs por
argumentos y sólo usan la sentencia return para
su salida. Esto reduce las dependencias externas
Para finalizar esta unidad sobre funciones, de las funciones. Una función f(args) que cumple
acabaremos con algunas consideraciones de diseño este criterio siempre devuelve el mismo
que deberéis tener en cuenta cuando programéis con resultado para unos mismos argumentos. Es
ellas. Para ello es necesario entender qué entradas y decir, la función se hace más predecible y, por
salidas posibles tiene cualquier función. Tenéis un tanto, más fácil de entender y de mantener.
detalle en la Figura 2. • Utiliza variables globales sólo cuando sea
realmente necesario. Las variables globales
crean dependencias entre funciones y hacen que
los programas sean difíciles de debugar,
modificar y reusar.
• Evita cambiar argumentos mutables salvo que el
código que hace la llamada así lo espera. El
problema es el mismo que con las variables
globales, pero además crea fuerte acoplamiento
entre la función que llama y la función llamada.
• No cambies atributos de otros módulos
directamente. Esto crea un fuerte acoplamiento
entre módulos al igual que las variables globales
lo hacen entre funciones. Si necesitáis cambiar
En la figura se describen los principales mecanismos
algún atributo de un módulo usad las funciones
con los que una función interacciona con el mundo
que el propio módulo os ha proporcionado para
que la rodea. Cuando programéis funciones, es
ello. Si no tiene, entonces seguro que cambiar
importante tener en cuenta dos aspectos
sus atributos puede ser una muy mala idea.
importantes de diseño que ayudan a que un código
sea más usable y mantenible. Estos aspectos son:
16
IBM SkillsBuild | Introducción a Python
Cohesión Experimenta
• Cada función debe tener un único propósito. Un
código bien diseñado está compuesto de
Crea una función log que acepte cualquier número de
funciones que hacen una sola cosa.
argumentos y los imprima por pantalla en una misma
Normalmente el propósito de una función
línea. La línea debe empezar con el prefijo ‘LOG: ’.
debería poder resumirse en una frase corta. Si la
frase que describe vuestra función es muy Modifica la función log para que usuario pueda
genérica (p. ej. “esta función resuelve mi especificar cualquier prefijo que desee.
problema”) o si tiene muchas conjunciones (p. ej.
“esta función calcula X y procesa Y”), considerad Modifica la función log para que el prefijo tenga el
separarla en partes más simples. valor por defecto ‘LOG: ’.
• Todas las funciones deberían ser relativamente
Modifica la función log para que el usuario pueda
pequeñas. Este punto está relacionado con el
establecer tanto prefijo como separador entre
anterior. Tened en cuenta que el código escrito
argumentos. Ambos deben pasarse sólo por los
en Python es muy conciso. Si vuestra función
nombres (no por posición) ‘sep’ y ‘prefix’. No hace
ocupa más de una docena o dos de líneas o
falta que estos tengan valor por defecto.
contiene varios niveles de anidación, es probable
que estéis ante un problema de diseño. Modfica la función log para que ahora ‘sep’ y ‘prefix’
tengan un valor por defecto.
En resumen, intentad que vuestro código se
componga de muchas funciones pequeñas e Modifica la función log para que acepte el siguiente
independientes entre ellas. diccionario. Recuerda que hay que pasarlo
desempaquetándolo con la sintaxis de doble
asterisco (**).
17
IBM SkillsBuild | Introducción a Python
Definición de variables
Supongamos que queremos mostrar el resultado de
sumar 1 + 2. Para mostrar el resultado, debemos
indicarle al programa dónde se encuentra dicho dato
en memoria y, para ello, hacemos uso de una
Las variables son uno de los dos componentes
variable:
básicos de cualquier programa.
print(a)
19