0% encontró este documento útil (0 votos)
6 vistas

Python_Tema5_Parte5_Funciones-Variables_v3

El documento es una introducción a Python enfocada en la creación y uso de funciones, destacando su importancia para la reusabilidad y la estructuración del código. Se abordan conceptos como la sintaxis de funciones, el ámbito de las variables, la recursividad y el polimorfismo, así como la regla LEGB para la resolución de nombres. A través de ejemplos prácticos, se ilustra cómo las funciones permiten descomponer problemas complejos en partes más manejables.

Cargado por

Daniel Espinel
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
6 vistas

Python_Tema5_Parte5_Funciones-Variables_v3

El documento es una introducción a Python enfocada en la creación y uso de funciones, destacando su importancia para la reusabilidad y la estructuración del código. Se abordan conceptos como la sintaxis de funciones, el ámbito de las variables, la recursividad y el polimorfismo, así como la regla LEGB para la resolución de nombres. A través de ejemplos prácticos, se ilustra cómo las funciones permiten descomponer problemas complejos en partes más manejables.

Cargado por

Daniel Espinel
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 19

IBM SkillsBuild | Introducción a Python

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

En esta unidad vamos a aprender cómo crear


funciones en Python. Una función es un grupo de
sentencias agrupadas de tal forma que pueden ser
invocadas por un mismo nombre. Las funciones
pueden devolver un resultado y ser parametrizadas
para permitir que el resultado de las mismas sea
diferente en función de cómo se la ha llamado.

Las funciones son también la unidad estructural


más básica que maximiza la reusabilidad de
código, por lo que nos permite avanzar hacia
nociones de diseño de software más ambiciosas
que las vistas hasta ahora. Esto es gracias a que
las funciones nos permiten separar nuestros
programas en pequeños bloques más manejables
que pueden ser reutilizados en diversas partes de
nuestro software. El hecho de implementar
nuestro código en funciones hace que este sea
más reusable, más fácil de programar y permite
que otros programadores puedan entender
nuestro código más fácilmente.

3
IBM SkillsBuild | Introducción a Python

Ventajas de utilizar las Sintaxis básica de una


funciones función en Python

Aumentan la reusabilidad de código y La sintaxis necesaria para declarar una función es la


siguiente:
minimizan la redundancia (repetición)
def nombre_de_la_función(arg1, arg2, ...a
Las funciones son la manera más simple y sencilla de rgN):
empaquetar funcionalidades de manera que se sentencias
puedan utilizar en diversas partes de un programa sin return #El return es opciona
l
tener que repetir código. Nos permiten agrupar y
generalizar código de manera que podamos utilizarlo
arbitrariamente tantas veces como necesitemos. La declaración empieza con la sentencia def seguida
Esto convierte a las funciones en un elemento del nombre que le queremos dar a la función.
primordial de la factorización de código, lo que nos Seguidamente escribiremos un listado de 0 a N
permite reducir la redundancia y, por lo tanto, reducir argumentos (también llamados parámetros de la
el esfuerzo necesario en mantener nuestro código. función) encapsulados entre paréntesis y finalizamos
la declaración con el carácter “:”.

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

def en_pantalla(frase1, frase2):


print(frase1, frase2) # "return" no
es obligatorio

en_pantalla('Me gusta', 'Python')

# Resultado: Me gusta Python


4
IBM SkillsBuild | Introducción a Python

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.

Funciones y polimorfismo En Python una función no tiene por qué


preocuparse de los tipos de entrada y salida. Es el
propio intérprete el que se encargará de verificar
Hemos comentado que una de las ventajas del uso que los tipos que le pasamos a la función soportan
de funciones es que permiten la reusabilidad de los protocolos que hayamos codificado en el
código. Esto es más cierto aún en Python, donde interior de la misma. De hecho, si no los soporta, el
muchos tipos de datos soportan polimorfirsmo, es intérprete se encargará de generar una excepción,
decir, cada tipo de dato sabe cómo comportarse ante lo que nos evita la tarea de tener que hacer control
una gran variedad de operadores. Esto es de errores en nuestra función. Si lo hiciéramos,
directamente aplicable al uso de funciones, por lo estaríamos restando flexibilidad a la función, cosa
que podemos encontrarnos casos como el siguiente: que no suele ser deseable, salvo que sea una
decisión de diseño.
def suma(a, b): # Definimos la
función "suma". Tiene 2 parámetros.
return a+b # "return" devuelve
el resultado de la función.

suma (2, 3) # Función con ints


# Resultado = 5

suma(2.7, 4.0) # Función con floats


# Resultado = 6.7

suma('Me gusta', 'Python') # Función con


strings

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.

Es posible crear funciones dentro de funciones.

def f1(a): # Función que "encierra"


a f2 (enclosing)
print(a)
b = 100
Devolviendo múltiples
def f2(x):
print(x)
# Función anidada
# Llamamos a f2 desde
valores simultáneamente
f1
f2(b)
Las funciones pueden devolver cualquier objeto con
f1('Python') # Llamamos a f1 la sentencia return. Por ello, si combinamos el
devolver una tupla, con el desempaquetado
extendido que permite Python, podemos simular la
Resultado:
devolución de múltiples valores:

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

print(minimo, maximo, sep= ' ')


Recursividad
Resultado:

Al igual que en otros lenguajes de programación en


Python una función puede llamarse a sí misma,
generando recursividad. Es importante tener en
cuenta que no se genere una recursividad infinita, es
decir, la función debe tener una condición de salida.
Un ejemplo muy habitual de recursividad en
programación es la función que calcula el factorial de
un número (recordemos que el factorial de x es igual Experimenta
a x * (x-1) * (x-2) * … * 1 Realiza una función que realice la descomposición en
factores de un número. Deberá devolver una lista con
def factorial(x):
if x>1: los factores de dicho número. Recordad que la
return x*factorial(x-1) descomposición en factores de un número consiste
else: en hallar el conjunto de números primos cuya
return 1
multiplicación dé dicho número como resultado.
factorial(5)

6
IBM SkillsBuild | Introducción a Python

Pista: Lo primero que debe hacer la función es hallar Veamos un ejemplo:


todos los números primos inferiores al número en a = 'Python' #Scope global
cuestión. (al módulo)
print('Valor fuera:', a)

Ámbito de una función def funcion():


a=33
print('Valor dentro', a) #Scope
local a la función
Ahora que ya empezamos a operar con funciones, es
el momento de avanzar un poco más con el concepto funcion()
de nombres en Python. Cuando usamos un nombre
print('Valor fuera', a)
en un programa, el intérprete de Python, busca ese
nombre en un espacio de nombres al que llamamos
namespace. Un namespace es un lugar donde residen Resultado:
un conjunto de nombres. Si venís de otros lenguajes
de programación este concepto os será familiar.

Cuando asignamos un nombre en Python, éste es


asociado al espacio de nombres al que le
corresponde. El namespace en el que reside un
nombre define su ámbito (scope), es decir, la
visibilidad que tendrá este nombre respecto a otras
variables. Por ejemplo,
Ámbitos y sus propiedades
Los nombres asignados dentro del ámbito de una
Como vemos, las funciones permiten crear
función, son sólo visibles por el código que reside
namespaces anidados que limitan los ámbitos de
dentro de esa misma función. Esto significa que un
acceso y evitan la colisión de nombres entre
nombre declarado dentro de una función no puede
variables. Así, en las funciones creamos ámbitos
ser referenciado desde fuera de ésta.
locales que contrastan con el ámbito global de los
El ámbito de una variable depende del lugar donde módulos. Estos ámbitos tienen las siguientes
se asignó. Dicho de otra manera, dependiendo el propiedades:
lugar donde asignamos una variable estaremos
• Las variables que se crean en ámbito del módulo
definiendo el ámbito en el que ésta puede ser
son variables globales para ese fichero. Cuando
utilizada. Las variables pueden ser asignadas en tres
importamos un módulo desde otro módulo, esas
ámbitos:
variables se convierten en atributos del módulo
• Si una variable es asignada en el interior de una importado, por lo que pueden ser accedidas
función, es local a esa función. como simples variables del mismo. Por ejemplo,
• Si una variable es asignada dentro de una la variable math.pi es global al módulo math,
función, será nonlocal a todos los ámbitos de las pero si importamos el módulo math, podemos
funciones anidadas a la primera. acceder a ella como si fuera un atributo del
• Si una variable es asignada fuera de cualquier mismo (por lo que accedemos a ella mediante
función esta es global al fichero en el que ha sido math.pi).
creada.

7
IBM SkillsBuild | Introducción a Python

El ámbito global es en realidad un ámbito de


Resolución de nombres. La

fichero. Es decir, el ámbito global afecta sólo al
módulo (fichero) en el que se encuentran sus
variables. En Python ámbito global significa
regla LEGB
ámbito de módulo.
• Los nombres asignados dentro de una función Todas las reglas anteriores se pueden resumir
son locales por defecto. Todos los nombres mediante la regla LEGB (Local, Enclosing, Global,
definidos en el interior de una función tienen Builtin). Esta regla dicta el orden de búsqueda de un
como ámbito el namespace local a esa función. nombre cuando intentamos acceder a él. Cuando
Aun así, es posible realizar asignaciones a intentamos acceder a un nombre, el intérprete de
variables que fuera del ámbito local de la función. Python busca sólo en 4 ámbitos distintos. Además,
Esto se hace mediante utilizando las sentencias esta búsqueda se hace siempre en el mismo orden.
global y nonlocal en el interior de la función. No
obstante, esta es una práctica generalmente no • L: Primero se busca en el ámbito local de nuestra
recomendada. función.
• Todos los otros nombres son locales a funciones • E: Tras ello se busca en las funciones que
que engloban a la nuestra (funciones en las que encierran a nuestra función (enclosing)
nuestra función es anidada), globales o built-ins. • G: Luego se busca en el ámbito global del
Los nombres no asignados en nuestra función módulo.
son, o locales a funciones de un nivel de • B: Finalmente se busca en el módulo builtins.
anidamiento superior (llamadas enclosing), o
globales al módulo o bien pertenecen al módulo La Figura 1 nos muestra un ejemplo de esta
built-ins, un ámbito de mayor nivel donde se búsqueda y de cómo se engloban estos ámbitos de
definen todos los tipos básicos de Python. búsqueda. Notad que esta búsqueda termina en el
• Cada vez que llamamos a una función, se crea un primer lugar donde se encuentre el nombre buscado.
ámbito local a esa función. Es decir, se crea un En el caso en el que el nombre no se encuentre en
namespace donde se guardan todos los nombres estos ámbitos, Python devuelve un error.
de esa función.

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

Veamos a continuación un ejemplo de esta G = 'Esta variable es de ámbito Global'


búsqueda. def f1():
E='Esta variable es local a f1.
G = 'Esta variable es de ámbito Global' Enclosing a f2'
def f1(): def f2():
E='Esta variable es local a f1. L = 'L es local a f2'
Enclosing a f2' E = 'E también es local a f2'
def f2(): G = 'G también es local a f2'
L = 'Esta variable es local a f2' print(L, E, G, sep = '\n')
print(L, E, G, sep = '\n') def f3():
f2() print(L) # DEVUELVE ERROR
f2()
f1() f3()

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)

Como vemos, f2 es capaz de referenciar las variables


E y G. Ahora veamos qué pasa si declaramos esas
mismas variables en el ámbito de f2.

G = 'Esta variable es de ámbito Global'


def f1():
E='Esta variable es local a f1.
Enclosing a f2'
def f2():
L = 'L es local a f2'
E = 'E también es local a f2'
G = 'G también es local a f2'
print(L, E, G, sep = '\n')
f2()

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

G = 'Esta variable es de ámbito Global' Resultado:


def f1():
E='Esta variable es local a f1.
Enclosing a f2'
def f2():
L = 'L es local a f2'
E = 'E también es local a f2' Algunos aspectos que tenemos que tener en cuenta
G = 'G también es local a f2' cuando pasamos argumentos a funciones en Python:
print(L, E, G, sep = '\n')
def f3(): • Al pasarle un argumento a una función, estamos
print(E, G, sep = '\n') creando una asignación a una variable con el
f2() nombre del argumento en el ámbito local de la
f3() función.
• Asignar un nuevo valor al argumento desde
f1() dentro de la función, no afecta al exterior.
• Si le pasamos un objeto mutable a una función, y
Resultado:
esta lo modifica en su interior, puede afectar al
exterior.

Esto es así porque los argumentos en Python se


pasan por referencia. Si recordamos lo visto en la
unidad de Tipado Dinámico, entenderemos mejor lo
que esto significa.

• Si pasamos un objeto inmutable, es como si lo


hiciéramos por valor. Es decir, al no poder

Parámetros y argumentos modificar el objeto, es como si hiciéramos una


copia del mismo al ámbito local de la función.
• Si pasamos un objeto mutable, al hacerlo por
referencia, cualquier cambio dentro del objeto
Argumentos de las funciones
que se haga dentro de la función será observado
Cuando definimos una función podemos desde fuera de la misma.
parametrizarla mediante los argumentos que le
Aquí tenemos un par de ejemplos. Empecemos
pasamos. Por ejemplo, la siguiente función es capaz
pasando objetos inmutables:
de multiplicar dos números cualquiera ya que la
estamos definiendo mediante dos parámetros de def suma(a, b): # Modificamos a y b
entrada (argumentos): en el scope de suma()
a = 3
def suma(a, b): b = 4
return a+b return a+b

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.

Sin embargo, una de las grandes ventajas de Python


l = [1, 2, 3]
es que nos permite pasarles argumentos a las
print(l)
funciones de distintas maneras.
print(minimo(l)) # Modifica la lista
aquí Por posición.

print(l) La manera por defecto de pasar argumentos, de


Resultado: izquierda a derecha.

def f(a, b, c):


print(a, b, c)

f(1, 2, 3)
Resultado:

Recordad que para evitar este comportamiento


podemos hacer una copia de la lista que le pasamos
a la función:

def minimo(l): Por keywords (palabras clave)


l[0] = 1000 # Modificamos la
En lugar de llamar a la función con sus argumentos
lista en el interior
return min(l) en orden, se le pasan especificando el nombre del
argumento seguido del valor que le queremos pasar.
l = [1, 2, 3] Se utiliza la sintaxis nombre=valor. Al estar indicando
print(minimo(l[:])) # minimo modifica la el nombre de los argumentos explícitamente, no hace
lista aquí falta que estos estén ordenados por posición.
print(l)
Resultado: def f(a, b, c):
print(a, b, c)

f(c=12, a=10, b=100)


Resultado:

12
IBM SkillsBuild | Introducción a Python

Especificando valores por defecto en la Resultado:


definición de la llamada
Es posible definir qué valores por defecto tienen los
argumentos de una función. Así, si al llamar a la
función, no le pasamos alguno de los argumentos
que tiene un valor por defecto, se utilizará dicho
valor.

def f(a, b=10, c=30):


print(a, b, c) Si usamos la sintaxis de doble asterisco,
especificamos que le pasaremos los argumentos por
f(1) nombre:

f(1, 12) def f(**Kargs): # Acepta número de


argumentos por nombre
f(1, 12, 19) print(Kargs)

f() # Si no hay
Resultado:
argumentos, Kargs es un diccionario vacío

f(a=1)

f(a=1, b=2)

f(a=1, c=3, b=2)


Resultado:

Especificando en la función que se le pasará una


colección de argumentos

En la definición de la función se indica que se le


pasará un número arbitrario de argumentos que
estarán ordenados por posición de izquierda a
derecha (indicado con un asterisco * justo antes del Desempaquetando una colección de
nombre) o por keywords (indicado con un doble argumentos posicionales o por keyword
asterisco ** justo antes del nombre).
Cuando llamamos a una función se le pude utilizar la
def f(*args): # Acepta número sintaxis de * para desempaquetar una colección en
arbitrario de argumentos una serie de argumentos separados por posición.
print(args)

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:

Así mismo, se puede desempaquetar un diccionario


utilizando la sintaxis de doble asterisco **.

def f(a, b, c, d):


print(a, b, c, d)

argumentos = {'b':20, 'a':1, 'c':300,


'd':4000} def f(a, *b, c): # Hay que pasar 'c'
por clave obligatoriamente
f(**argumentos) # Desempaquetando
print(a, b, c)
diccionario argumentos con **
f(1, c=2)
argumentos = {'b':200, 'c':300, 'd':400}
f(10, **argumentos) # Podemos combinar f(1, 2, c=3)
argumentos posicionales con dict
f(1, 2, 3, 4, 5, c=10)
Resultado:

Resultado:

Utilizando argumentos que sólo pueden ser


pasados por clave (keyword-only)

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

f(1, 10, 100) # Error al no


pasar argumentos Keyword-only
14
IBM SkillsBuild | Introducción a Python

zlist = list(zip(la, lb, lc)) # zip


soporta cualquier número
# de
argumentos posicionales

zlist

a, b, c = zip(*zlist) # El * en
zip desempaqueta lista de tuplas

print(la, lb, lc, sep = '\n')

print(la, lb) #
Seperador por defecto es espacio

Resultado:

Como vemos este tipo de paso de argumentos dota a


las funciones de Python de una gran flexibilidad.
Además, el uso de argumentos por defecto y de
argumentos keyword-only fomentan la simplicidad y
legibilidad de nuestro código.

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:

• Cohesión: se refiere a como se descompone un


programa en pequeñas tareas individuales.
• Acoplamiento: se refiere a como se comunican
las funciones y como dependen entre ellas.

Un buen código está altamente cohesionado y


tiene poco acoplamiento. Es decir, todas las
funciones de vuestro código ayudan a una misma
tarea, pero no dependen unas de otras. A
continuación, podéis ver un listado de directrices que
os ayudarán ayudan a aumentar la cohesión y reducir
el acoplamiento.

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.

En su esencia, un programa está compuesto por


# Guardamos en la variable suma el
datos e instrucciones que manipulan esos datos.
resultado de 1 + 2
Normalmente, los datos se almacenan en memoria
suma = 1 + 2
(memoria RAM) para que podamos acceder a ellos.
# Accedemos al resultado de 1 + 2 a
través de la variable suma
Entonces, ¿qué es una variable? Una variable es una
print(suma)
forma de identificar, de forma sencilla, un dato que
se encuentra almacenado en la memoria del
ordenador o dicho de otra manera, un espacio en la
memoria del ordenador en el que se guardará un
valor que podrá cambiar a lo largo de la ejecución del Asignar un valor a una
programa. Imaginemos que una variable es un
contenedor en el que se almacena un dato, el cual,
variable en Python
puede cambiar durante el flujo del programa. Una
variable nos permite acceder fácilmente a dicho dato Tal y como hemos visto en el ejemplo anterior, para
para ser manipulado y transformado. asignar un valor (un dato) a una variable se utiliza el
operador de asignación =.
Una variable es un concepto fundamental en
cualquier lenguaje de programación. Es una En la operación de asignación se ven involucradas
ubicación de memoria reservada que almacena y tres partes:
manipula datos. En algunos lenguajes de
programación, las variables se pueden entender • El operador de asignación =
como "cajas" en las que se guardan los datos, pero
en Python las variables son "etiquetas" que permiten • Un identificador o nombre de variable, a la
izquierda del operador.
hacer referencia a los datos (que se guardan en unas
"cajas" llamadas objetos). • Un literal, una expresión, una llamada a una
función o una combinación de todos ellos a la
A diferencia de otros lenguajes de programación, derecha del operador de asignación.
Python no tiene comandos para declarar una •
variable. Una variable se crea en el momento en que Ejemplos:
se le da un nombre y se le asigna un valor.

# Asigna a la variable <a> el valor 1


x = 15 a = 1
y = "Ana" # Asigna a la variable <a> el resultado
print(x) de la expresión 3 * 4
print(y) a = 3 * 4
# Asigna a la variable <a> la cadena de
caracteres 'Pythonista'
a = 'Pythonista'
18
IBM SkillsBuild | Introducción a Python

Cuando asignamos un valor a una variable por


primera vez, se dice que en ese
lugar se define e inicializa la variable. En un script o
programa escrito en Python, podemos definir
variables en cualquier lugar del mismo. Sin embargo,
es una buena práctica definir las variables que
vayamos a utilizar al principio.

Si intentamos usar una variable que no ha sido


definida/inicializada previamente, el intérprete nos
mostrará un error:

print(a)

Estrechamente relacionado con las variables se


encuentra el concepto de tipo de dato. Al asignar un
valor a una variable, dicho valor pertenece a un
conjunto de valores conocido como tipo de dato. Un
tipo de dato define una serie de características sobre
esos datos y las variables que los contienen como,
por ejemplo, las operaciones que se pueden realizar
con ellos. En Python, los tipos de datos básicos son
los numéricos (enteros, reales y complejos), los
boolenaos (True, False) y las cadenas de caracteres.

Los tipos de datos, su declaración y la forma de


trabajar con ellos se verá con profundidad en el
siguiente tema.

19

También podría gustarte