Separata Fundamentos Python
Separata Fundamentos Python
Índice
Características del lenguaje Python
El intérprete de Python
Operadores, expresiones y sentencias en Python
Bloques de código (Indentación)
Comentarios en Python
Convenciones de nombres en Python
Palabras reservadas de Python
Constantes en Python
El intérprete de Python
Cuando instalas Python correctamente (en cualquier sistema operativo)
ocurren, entre otras, dos cosas: se añade el comando python (o python3 , en
caso de que instales la versión 3.x de Python) al path y se instala el intérprete
de Python correspondiente.
>>> 2 + 3
¡Hola mundo!
No obstante, aunque esta forma de escribir código puede ser útil para aprender
y en casos muy puntuales, no es la habitual a la hora de escribir un programa o
script en Python.
suma = 2 + 3
print(suma)
python3 suma.py
Operador
Expresión
Una expresión es una unidad de código que devuelve un valor y está formada
por una combinación de operandos (variables y literales) y operadores. Los
siguientes son ejemplos de expresiones (cada línea es una expresión
diferente):
Sentencia
Por su parte, una sentencia o declaración es una instrucción que define una
acción. Una sentencia puede estar formada por una o varias expresiones,
aunque no siempre es así.
Sin embargo, aquellas sentencias que son muy largas pueden ocupar más de
una línea (la guía de estilo PEP 8, recomienda una longitud de línea máxima de
72 caracteres).
Para dividir una sentencia en varias líneas se utiliza el carácter \ . Por ejemplo:
a=2+3+5+\
7+9+4+\
a = [1, 2, 7,
3, 8, 4,
9]
Un bloque comienza con un nuevo sangrado y acaba con la primera línea cuyo
sangrado sea menor. De nuevo, la guía de estilo de Python recomienda usar
los espacios en lugar de las tabulaciones para realizar el sangrado. Yo suelo
utilizar 4 espacios.
Configura tu IDE de desarrollo para que use los espacios en lugar de los
tabuladores para el sangrado. Establece el número de espacios a 4 ó 2.
suma = 0 # Bloque 2
suma += n # Bloque 3
print(suma) # Bloque 3
Comentarios en Python
Como cualquier otro lenguaje de programación, Python permite escribir
comentarios en el código. Los comentarios son útiles para explicar por qué
estamos programando algo de un modo concreto o añadir indicaciones. Te
aseguro que son de utilidad cuando se retoma un programa o aplicación en el
futuro
Los comentarios son ignorados por el intérprete de Python. Solo tienen sentido
para los programadores.
a=5
print(a * 2)
Para escribir comentarios que ocupan varias líneas, simplemente escribe cada
una de las líneas anteponiendo el carácter # :
# 2 líneas
a=2
'''Este comentario
print(a)
Docstrings
return a + b
Estas palabras clave se utilizan para definir la sintaxis y estructura del lenguaje
Python.
and , as , assert , break , class , continue , def , del , elif , else , except , False , final
ly , for , from , global , if , import , in , is , lambda , None , nonlocal , not , or , pass , ra
ise , return , True , try , yield , while y with
Constantes en Python
Terminamos esta introducción a Python señalando que, a diferencia de otros
lenguajes, en Python no existen las constantes.
Entendemos como constante una variable que una vez asignado un valor, este
no se puede modificar. Es decir, que a la variable no se le puede asignar
ningún otro valor una vez asignado el primero.
No obstante, sí que es cierto que el propio Python define una serie de valores
constantes en su propio namespace. Los más importantes son:
Índice
Variables en Python
Asignar un valor a una variable en Python
Modificar el valor de una variable en Python
Literales
Asignar un valor a múltiples variables
Asignar múltiples valores a múltiples variables
Variables y memoria
Variables en Python
Las variables son uno de los dos componentes básicos de cualquier programa.
suma = 1 + 2
print(suma)
Asignar un valor a una variable en Python
Tal y como hemos visto en el ejemplo anterior, para asignar un valor (un dato)
a una variable se utiliza el operador de asignación = .
El operador de asignación =
Un identificador o nombre de variable, a la izquierda del operador
Un literal, una expresión, una llamada a una función o una combinación de todos ellos
a la derecha del operador de asignación
Ejemplos:
a=1
a=3*4
a = 'Pythonista'
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.
>>> print(a)
a = 1 # a es de tipo entero
Se dice que Python (el intérprete) infiere el tipo de dato al que pertenece una
variable en tiempo de ejecución, es decir, es cuando se ejecuta el programa,
cuando conoce su tipo de dato y qué operaciones pueden llevarse a cabo con
él.
Por ejemplo:
>>> a = 1
>>> print(a)
>>> b = 'Hola'
>>> a = 3
>>> print(a)
a=1
>>> print(a)
>>> print(b)
>>> print(c)
1
Asignar múltiples valores a múltiples
variables
También es posible inicializar varias variables con un valor diferente cada una
del siguiente modo:
>>> a, b, c = 1, 2, 3
>>> print(a)
>>> print(b)
>>> print(c)
Variables y memoria
Finalmente, para terminar esta sección, quiero que te quede realmente claro
qué es esto de una variable y cómo asigna Python las direcciones de memoria
a los datos y a las variables.
Para empezar, te diré que en Python todo es un objeto. Sí, todavía no hemos
visto el apartado de programación orientada a objetos con Python, pero ten
presente que en Python todo es un objeto.
a=1
>>> a = 1
>>> b = 1
>>> id(1)
4299329328
>>> id(a)
4299329328
>>> id(b)
4299329328
>>> b = 2
>>> id(a)
4299329328
>>> id(b)
4299329360
>>> a = b
>>> id(a)
4299329360
>>> a
Índice
Qué son los tipos de datos
Tipos de datos básicos de Python
Tipos numéricos
Tipo booleano
Tipo cadena de caracteres
Otros tipos
Conocer el tipo de una variable
Conversión de tipos
En Python, todo valor que pueda ser asignado a una variable tiene
asociado un tipo de dato. Como ya te he mencionado alguna vez, en Python
todo es un objeto. Así que los tipos de datos serían las clases (donde se
definen las propiedades y qué se puede hacer con ellas) y las variables serían
las instancias (objetos) de los tipos de datos. No te preocupes si no entiendes
qué es una clase o un objeto, lo veremos en otro tutorial.
En definitiva, un tipo de dato establece qué valores puede tomar una
variable y qué operaciones se pueden realizar sobre la misma.
Python también define otros tipos de datos, entre los que se encuentran:
En fin, no te agobies con tanto tipo ni tanto concepto nuevo. Tómatelo con
calma que estás aprendiendo. Comencemos por lo fácil revisando los tipos de
datos básicos de Python.
Tipos numéricos
Python define tres tipos de datos numéricos básicos: enteros, números de
punto flotante (simularía el conjunto de los números reales, pero ya veremos
que no es así del todo) y los números complejos.
Números enteros
El tipo de los números enteros es int . Este tipo de dato comprende el conjunto
de todos los números enteros, pero como dicho conjunto es infinito, en Python
el conjunto está limitado realmente por la capacidad de la memoria disponible.
No hay un límite de representación impuesto por el lenguaje.
Pero tranquilidad, que para el 99% de los programas que desarrolles tendrás
suficiente con el subconjunto que puedes representar.
Ejemplos:
>>> print(b)
>>> diez = 10
>>> print(diez)
10
>>> print(diez_binario)
10
>>> print(diez_octal)
10
>>> print(diez_hex)
10
¿Recuerdas que te dije que los números de punto flotante representaban, más
o menos, al conjunto de los números reales?
3.3000000000000003
Tenemos que repasar un poco de teoría que voy a tratar de simplificar porque
la explicación completa da para un artículo entero.
Al igual que ocurre con los números enteros, los números reales son infinitos y,
por tanto, es imposible representar todo el conjunto de números reales con un
ordenador.
Para representar el mayor número posible de los números reales con las
limitaciones de memoria (tamaños de palabra de 32 y 64 bits), se adaptó la
notación científica de representación de números reales al sistema
binario (que es el sistema que se utiliza en programación para representar los
datos e instrucciones).
En esta notación científica, los números se representan así:
Vaya tela, ¿no? Pero es una muy buena solución que ha llegado hasta
nuestros días.
Pero hay más casos, como por ejemplo la representación del número 1/3. En
algún momento, el ordenador tiene que truncar el número periódico resultante.
Pues una vez vista esta simplificada introducción a los números de punto
flotante, te diré que este tipo de datos en Python es float .
Puedes usar el tipo float sin problemas para representar cualquier número real
(siempre teniendo en cuenta que es una aproximación lo más precisa posible).
Por tanto para longitudes, pesos, frecuencias, …, en los que prácticamente es
lo mismo 3,3 que 3,3000000000000003 el tipo float es el más apropiado.
Cuando un número float vaya a ser usado por una persona, en lugar de por el
ordenador, puedes darle formato al número de la siguiente manera:
>>> real = 1.1 + 2.2 # real es un float
>>> print(real)
>>> print(f'{real:.2f}')
Al igual que los números enteros, un float se crea a partir de un literal, o bien
como resultado de una expresión o una función.
Y para terminar esta sección, te adelanto que, si por cualquier motivo sí que
necesitas una mayor precisión a la hora de trabajar con los números reales,
Python tiene otros tipos de datos, como Decimal.
El tipo Decimal es ideal a la hora de trabajar, por ejemplo, con dinero o tipos de
interés. Este tipo de dato trunca la parte decimal del número para ser más
preciso, pero no es el objetivo de este tutorial hablar sobre el tipo de
dato Decimal.
Números complejos
Los números complejos tienen una parte real y otra imaginaria y cada una de
ellas se representa como un float .
>>> complejo.real
1.0
>>> complejo.imag
2.0
Aritmética de los tipos numéricos
>>> 1 + 2.0
3.0
(7.7+3j)
Tipo booleano
En Python la clase que representa los valores booleanos es bool . Esta clase
solo se puede instanciar con dos valores/objetos: True para representar
verdadero y False para representar falso.
Una particularidad del lenguaje es que cualquier objeto puede ser usado en un
contexto donde se requiera comprobar si algo es verdadero o falso. Por tanto,
cualquier objeto se puede usar en la condición de un if o un while (son
estructuras de control que veremos en tutoriales posteriores) o como operando
de una operación booleana.
None
False
Una vez que hemos acabado con los números, es el turno de las letras
>>> print(hola)
Hola "Pythonista"
>>> print(hola_2)
Hola 'Pythonista'
>>> print(hola_3)
Hola 'Pythonista'
>>> print(caracter_a)
Además de los tipos básicos, otros tipos fundamentales de Python son las
secuencias ( list y tuple ), los conjuntos ( set ) y los mapas ( dict ).
Todos ellos son tipos compuestos y se utilizan para agrupar juntos varios
valores.
>>> print(lista)
[1, 2, 3, 8, 9]
>>> print(tupla)
(1, 4, 8, 0, 5)
>>> print(conjunto)
{1, 3, 4}
>>> print(diccionario)
>>> type(3)
<class 'int'>
>>> type(2.78)
<class 'float'>
>>> type('Hola')
<class 'str'>
False
True
False
True
Conversión de tipos
Lo último que veremos en este tutorial sobre tipos de datos es la conversión de
tipos.
Imagina que tienes una variable edad de tipo string cuyo valor es '25' . Se
podría decir que edad , aunque realmente es una cadena de caracteres,
contiene un número. Sin embargo, si intentas sumar 10 a edad , el intérprete te
dará un error porque edad es de tipo str y 10 un tipo numérico.
35
'35'
18.66
Bueno, espero que hayas disfrutado este tutorial tanto como yo lo he hecho
escribiéndolo. No te pierdas el siguiente ya que es la continuación de este. En
él veremos los operadores de Python para llevar a cabo operaciones sobre los
distintos tipos de datos.
Operadores en Python
En el tutorial de Introducción ya hablamos sobre los operadores en Python.
Como te indiqué, los operadores son símbolos reservados por el propio
lenguaje que se utilizan para llevar a cabo operaciones sobre uno, dos o más
elementos llamados operandos. Los operandos pueden ser variables, literales,
el valor devuelto por una expresión o el valor devuelto por una función.
10 # 10 es el resultado
>>> print(hola_python)
Hola Pythonista
concatenar y formatear
strings en Python
Una de las operaciones más comunes en cualquier lenguaje de programación
es la concatenación y/o combinación de cadenas. En este tutorial
descubrirás distintos modos de concatenar en python dos o más strings.
>>> nombre_completo
>>> hola
'Hola Python'
>>> suma = 1 + 2
>>> suma
Para poder concatenar los valores anteriores tienes que convertir suma a un
objeto de tipo string . Para ello puedes usar el método str() , que devuelve una
representación de tipo string del objeto que se le pasa como parámetro.
>>> suma = 1 + 2
>>> suma
>>> res
Suma: 1 + 2 = 3
No obstante, los dos últimos ejemplos que te he enseñado no son los más
«apropiados». Existen opciones más legibles en Python como te mostraré a
continuación.
...
>>> print_suma(1, 2)
Si quieres conocer todos los posibles tipos de conversión usando el estilo printf,
puedes consultar la documentación oficial de Python aquí.
Nuevo estilo: formatear strings usando el
método ‘format’
Python 3 y posteriormente Python 2.7 introdujeron un nuevo modo de formatear
cadenas a través del método format disponible en cualquier objeto de
tipo string .
Se puede hacer uso de este método del mismo modo que se hacía con el
método tradicional, es decir, sustituyendo valores en función de la posición a
través del marcador {} :
f'Hola {nombre}'
'Hola Python
Otro ejemplo:
...
>>> print_suma(1, 2)
Como puedes observar, el literal con el que se llama a join es lo que se utiliza
para separar los distintos elementos de la cadena.
'1, 2, 3'
Conclusiones
Python ofrece varias formas de concatenar y formatear strings. Utilizar una u
otra dependerá del código en cuestión, de cómo sea más legible y de la
versión de Python que estés usando. Personalmente, si tu versión de Python
es la 3.6+, usaría f-Strings siempre que fuera posible para formatear cadenas.
Si te encuentras con código legacy (código antiguo), quizá sea más correcto
emplear el estilo antiguo para mantener la coherencia con el resto del código.
Ejemplos:
>>> x = True
>>> y = False
>>> x or y
True
>>> x and y
False
>>> not x
False
>>> x = 0
>>> y = 10
>>> x or y
10
>>> x and y
>>> not x
True
Operadores de comparación
Los operadores de comparación se utilizan, como su nombre indica, para
comparar dos o más valores. El resultado de estos operadores siempre
es True o False .
Operador Descripción
>= Mayor o igual que. True si el operando de la izquierda es mayor o igual que el
de la derecha; False en caso contrario.
<= Menor o igual que. True si el operando de la izquierda es menor o igual que el
de la derecha; False en caso contrario.
Ejemplos:
>>> x = 9
>>> y = 1
>>> x < y
False
>>> x > y
True
>>> x == y
False
>>> x = 9
True
True
>>> x = 7
>>> y = 2
>>> x + y # Suma
9
>>> x - y # Resta
>>> x * y # Producto
14
>>> x / y # División
3.5
>>> x % y # Resto
>>> x // y # Cociente
>>> x ** y # Potencia
49
Operación Descripción
>>> x = 2
>>> y = 7
>>> x | y
>>> x ^ y
>>> x & y
>>> x << 1
>>> x >> 1
>>> ~x
-3
Operadores de asignación
El operador de asignación se utiliza para asignar un valor a una variable. Como
te he mencionado en otras secciones, este operador es el signo = .
+= x += 2 x=x+2
-= x -= 2 x=x–2
*= x *= 2 x=x*2
/= x /= 2 x=x/2
%= x %= 2 x=x%2
//= x //= 2 x = x // 2
Operador Ejemplo Equivalencia
**= x **= 2 x = x ** 2
|= x |= 2 x=x|2
^= x ^= 2 x=x^2
Operadores de pertenencia
Los operadores de pertenencia se utilizan para comprobar si un valor o variable
se encuentran en una secuencia ( list , tuple , dict , set o str ).
Todavía no hemos visto estos tipos, pero son operadores muy utilizados.
Operador Descripción
>>> 4 in lista
False
>>> 3 in lista
True
True
Operadores de identidad
Por último, los operadores de identidad se utilizan para comprobar si dos
variables son, o no, el mismo objeto.
Operador Descripción
is not Devuelve True si ambos operandos no hacen referencia al mismo objeto; False
en caso contrario.
>>> x = 4
>>> y = 2
>>> x is lista
False
>>> x is y
False
>>> x is 4
True
>>> x = 5
>>> y = 2
>>> z
11
>>> z
16
Bueno, pues hemos llegado al final de este capitulo, en el cuál hemos repasado
todos los operadores clave de Python.
Python if – Sentencia if de
control de flujo
En Python if es una de las principales sentencias de control de flujo, junto
a while y for.
Índice
Python if – Sentencia básica
Sentencia if … else
if … elif … else
Sentencias if anidadas
if condición:
bloque de código
Veamos un ejemplo:
x = 17
if x < 20:
valores = [1, 3, 4, 8]
if 5 in valores:
print('está en valores')
print('fin')
está en valores
fin
RECUERDA: En principio, en Python todos los objetos/instancias se
evalúan a True a excepción de None , False , 0 de todos los tipos numéricos y
secuencias/colecciones vacías, que se evalúan a False .
Sentencia if … else
Hay ocasiones en que la sentencia if básica no es suficiente y es necesario
ejecutar un conjunto de instrucciones o sentencias cuando la condición se
evalúa a False .
if condición:
else:
resultado = None
x = 10
y=2
if y > 0:
resultado = x / y
else:
print(resultado)
if … elif … else
También es posible que te encuentres situaciones en que una decisión
dependa de más de una condición.
if cond1:
elif cond2:
...
else:
x = 28
if x < 0:
elif x > 0:
else:
print('x es 0')
Sentencias if anidadas
Para terminar este tutorial, simplemente me gustaría añadir que en cualquiera
de los bloques de sentencias anteriores se puede volver a incluir una sentencia
if, o if … else … o if … elif … else …
x = 28
if x < 0:
else:
if x > 0:
else:
print('x es 0')
While Python – Bucle
while en Python
La sentencia o bucle while en Python es una sentencia de control de flujo que
se utiliza para ejecutar un bloque de instrucciones de forma continuada
mientras se cumpla una condición determinada.
Índice
La sentencia while en Python
Bucle while en Python – Ejemplo típico
Bucle while … else …
while condición:
bloque de código
Veamos un ejemplo:
numero = 0
print(f'{numero * 3}')
numero += 1
print('Fin')
Esto será así hasta que numero sea igual a 11 . En esa ocasión la expresión de
comparación se evaluará a False y el flujo continuará, ahora sí, por la línea 6.
El resultado del script anterior es el siguiente (la tabla de multiplicar del número
3):
Tabla del 3
3
6
12
15
18
21
24
27
30
Fin
valores = [5, 1, 9, 2, 7, 4]
encontrado = False
indice = 0
longitud = len(valores)
valor = valores[indice]
if valor == 2:
encontrado = True
else:
indice += 1
if encontrado:
print(f'El número 2 ha sido encontrado en el índice {indice}')
else:
indice : Contiene el índice del elemento de la lista valores que va a ser evaluado.
Por tanto, el bucle finaliza bien cuando se haya encontrado el elemento, bien
cuando se haya evaluado el último elemento de la lista. Si se ha encontrado el
número 2, se muestra un mensaje indicando el índice en el que está. En caso
contrario, se muestra un mensaje indicando que el número 2 no se encuentra
en la lista.
break se utiliza para finalizar y salir el bucle, por ejemplo, si se cumple alguna
condición.
Por su parte, continue salta al siguiente paso de la iteración, ignorando todas las
sentencias que le siguen y que forman parte del bucle.
encontrado = False
indice = 0
longitud = len(valores)
valor = valores[indice]
if valor == 2:
encontrado = True
break
else:
indice += 1
if encontrado:
else:
Por otro lado, al bucle while le podemos añadir la sentencia opcional else . El
bloque de código del else se ejecutará siempre y cuando la condición de la
sentencia while se evalúe a False y no se haya ejecutado una sentencia break .
valores = [5, 1, 9, 2, 7, 4]
indice = 0
longitud = len(valores)
valor = valores[indice]
if valor == 2:
break
else:
indice += 1
else:
Pues hasta aquí el tutorial sobre la sentencia while y sus casos de uso. Espero
que te haya sido útil
for en Python – El bucle
for en Python: estructura
y ejemplos
Una de las principales tareas a la hora de aprender un nuevo lenguaje de
programación es conocer las estructuras de control que ofrece el propio
lenguaje. El bucle for en Python es una de las estructuras que más utilizarás
en tus programas.
Índice
El bucle for en python
Qué es un iterable
Bucle for en diccionarios
Python for y la clase range
for _ in
Bucle for, break y continue
for … else
Su sintaxis es la siguiente:
<Tu código>
Aquí, elem es la variable que toma el valor del elemento dentro del iterador en
cada paso del bucle. Este finaliza su ejecución cuando se recorren todos los
elementos.
Como te indicaba, es muy frecuente usar el bucle for para iterar sobre los
elementos de listas, tuplas o diccionarios.
for n in nums:
print(n)
78
84
Qué es un iterable
Veamos con más detalle el concepto de iterable mencionado en el apartado
anterior. Un iterable es un objeto que se puede iterar sobre él, es decir, que
permite recorrer sus elementos uno a uno. Para ser más técnico, un objeto
iterable es aquél que puede pasarse como parámetro de la función iter() .
>>> it = iter(nums)
>>> next(it)
>>> next(it)
78
>>> next(it)
>>> next(it)
84
>>> next(it)
StopIteration
En Python, los tipos principales list , tuple , dict , set o string entre otros, son
iterables, por lo que podrán ser usados en el bucle for.
for k in valores:
print(k)
print(v)
3 – Iterar a la vez sobre la clave y el valor de cada uno de los elementos del
diccionario.
for k, v in valores.items():
k=A, v=4
k=E, v=3
k=I, v=1
k=O, v=0
for i in range(11):
print(i)
...
10
El tipo de datos range se puede invocar con uno, dos e incluso tres parámetros:
Por ejemplo, para mostrar por pantalla los números pares del 0 al 10
podríamos usar la función range del siguiente modo:
print(num)
10
for _ in <iterable>
En ocasiones, es posible que el elemento actual del iterable que se está
recorriendo sea irrelevante. En estos casos puedes usar la variable _ para
indicar esta situación. No obstante, yo no te lo recomiendo ya que también se
suele usar en librerías de traducciones de texto. Aún así, te muestro un caso de
uso. Imagínate que queremos implementar una función que devuelva la
longitud de una lista. El código podría ser como el que te muestro a
continuación:
def longitud(mi_lista):
cont = 0
for _ in mi_lista:
cont += 1
return cont
Modificando la iteración del bucle for:
break y continue
Por último, vamos a ver que es posible alterar la iteración de un bucle for en
Python. Para ello, nos valdremos de las sentencias break y continue . Pero,
¿qué hacen estas sentencias?
break se utiliza para finalizar y salir el bucle, por ejemplo, si se cumple alguna
condición.
Por su parte, continue salta al siguiente paso de la iteración, ignorando todas las
sentencias que le siguen y que forman parte del bucle.
coleccion = [2, 4, 5, 7, 8, 9, 3, 4]
for e in coleccion:
if e == 7:
break
print(e)
coleccion = [2, 4, 5, 7, 8, 9, 3, 4]
for e in coleccion:
if e % 2 != 0:
continue
print(e)
for … else
En relación al apartado anterior, Python ofrece una estructura adicional de
bucle for cuya estructura es la siguiente:
for e in iterable:
# Tu código aquí
else:
numeros = [1, 2, 4, 3, 5, 8, 6]
for n in numeros:
if n == 3:
break
else:
Conclusión
En este capitulo hemos repasado los aspectos más importantes del bucle for
en Python. Esta estructura de control es clave para trabajar colecciones.
Índice
Qué es una lista
Cómo acceder a los elementos de una lista en Python
for list Python – Recorrer una lista
Añadir elementos a una lista en Python
Modificar elementos de una lista
Eliminar un elemento de una lista en Python
Longitud (len) de una lista en Python
Cómo saber si un elemento está en una lista en Python
sort list Python – Ordenar una lista en Python
Listado de métodos de la clase list
Junto a las clases tuple, range y str, son uno de los tipos de secuencia en
Python, con la particularidad de que son mutables. Esto último quiere decir que
su contenido se puede modificar después de haber sido creada.
Para crear una lista en Python, simplemente hay que encerrar una secuencia
de elementos separados por comas entre paréntesis cuadrados [] .
Por ejemplo, para crear una lista con los números del 1 al 10 se haría del
siguiente modo:
>>> lista = [1, ['a', 'e', 'i', 'o', 'u'], 8.9, 'hola']
>>> vocales
Termino esta sección mostrando dos alternativas de crear una lista vacía:
'a'
'i'
>>> lista[8]
>>> lista[1.0]
Como hemos visto, las listas pueden contener otros elementos de tipo
secuencia de forma anidada. Por ejemplo, una lista que uno de sus ítems es
otra lista. Del mismo modo, se puede acceder a los elementos de estos tipos
usando índices compuestos o anidados:
'b'
En Python está permitido usar índices negativos para acceder a los elementos
de una secuencia. En este caso, el índice -1 hace referencia al último elemento
de la secuencia, el -2 al penúltimo y así, sucesivamente:
'u'
>>> vocales[-4]
'e'
['i']
['i', 'o']
>>> letras = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k']
['b', 'd']
['b', 'e']
for list Python – Recorrer una lista
Ya hemos visto que se puede usar el bucle for en Python para recorrer los
elementos de una secuencia. En nuestro caso, para recorrer una lista en
Python utilizaríamos la siguiente estructura:
print(color)
azul
blanco
negro
Para añadir un nuevo elemento a una lista se utiliza el método append() y para
añadir varios elementos, el método extend() :
>>> vocales
['a', 'e']
>>> vocales
[1, 2, 3, 4, 5, 6]
>>> numeros *= 3
>>> numeros
[1, 2, 3, 1, 2, 3, 1, 2, 3]
>>> vocales
>>> vocales
>>> vocales
>>> vocales
>>> vocales
>>> vocales
[]
>>> letras.remove('a')
>>> letras
'v'
>>> letras
Finalmente, es posible eliminar todos los elementos de una lista a través del
método clear() :
>>> letras.clear()
>>> letras
[]
>>> len(vocales)
... print('Sí')
...
Sí
... print('No')
...
No
>>> id(numeros)
4475439216
>>> numeros.sort()
>>> numeros
[1, 2, 3, 4, 6, 7]
>>> id(numeros)
4475439216
Listado de métodos de la clase list
Termino este tutorial mostrando la lista completa de métodos de la clase list.
Algunos de ellos ya se han mencionado en las secciones anteriores.
Método Descripción
Este tutorial describe al detalle qué es el tipo tuple y cuáles son sus
operaciones más comunes. ¿Quieres conocerlas?
Índice
Qué es una tupla
Cómo acceder a los elementos de una tupla en Python
for tuple Python – Recorrer una tupla
Modificar una tupla en Python
Longitud (len) de una tupla en Python
Cómo saber si un elemento está en una tupla en Python
Listado de métodos de la clase tuple en Python
Junto a las clases list y range, es uno de los tipos de secuencia en Python,
con la particularidad de que son inmutables. Esto último quiere decir que su
contenido NO se puede modificar después de haber sido creada.
En general, para crear una tupla en Python simplemente hay que definir una
secuencia de elementos separados por comas y encerrados entre ().
Por ejemplo, para crear una tupla con los números del 1 al 5 se haría del
siguiente modo:
>>> tup = (1, ['a', 'e', 'i', 'o', 'u'], 8.9, 'hola')
A continuación, te indico las diferentes formas que existen de crear una tupla
en Python:
Para crear una tupla vacía, usa paréntesis () o el constructor de la clase tuple() sin
parámetros.
Para crear una tupla con un único elemento: elem, o (elem, ) . Observa que siempre
se añade una coma.
Para crear una tupla de varios elementos, sepáralos con comas: a, b, c o (a, b, c) .
Las tuplas también se pueden crear usando el constructor de la
clase, tuple(iterable) . En este caso, el constructor crea una tupla cuyos elementos
son los mismos y están en el mismo orden que los ítems del iterable. El
objeto iterable puede ser una secuencia, un contenedor que soporte la iteración o un
objeto iterador.
>>> una_funcion(a, b, c)
# función "una_funcion"
>>> una_funcion((a, b, c))
Por ejemplo, en una tupla con 3 elementos, los índices de cada uno de los
ítems serían 0, 1 y 2.
'a'
'b'
>>> tupla[8]
>>> tupla[1.0]
Al igual que ocurre con las listas (y todos los tipos secuenciales), está permitido
usar índices negativos para acceder a los elementos de una tupla. En este
caso, el índice -1 hace referencia al último elemento de la secuencia, el -2 al
penúltimo y así, sucesivamente:
>>> bebidas[-1]
'sorbete'
>>> bebidas[-3]
'café'
('i',)
('i', 'o')
(4, 8)
(4, 10)
tuple unpacking
>>> a, b, c = bebidas
>>> a
'agua'
>>> b
'café'
>>> c
'batido'
print(color)
azul
blanco
negro
Modificar una tupla en Python
Como te he indicado, las tuplas son objetos inmutables. No obstante, las tuplas
pueden contener objetos u otros elementos de tipo secuencia, por ejemplo, una
lista. Estos objetos, si son mutables, sí se pueden modificar:
>>> tupla
>>> len(vocales)
... print('Sí')
...
Sí
... print('No')
...
No
Listado de métodos de la clase tuple en
Python
Para terminar, se muestran los métodos de la clase tuple en Python, que son
los métodos definidos para cualquier tipo secuencial:
Método Descripción
Con esto damos por finalizado el tutorial sobre la clase tuple en Python.
Recuerda que son un tipo secuencial que no se puede modificar. Úsalas
cuando no quieras que los elementos de una lista se deban modificar o para
almacenar las claves de un diccionario.
El tipo range en Python:
Secuencias numéricas
range en Python es un tipo que se utiliza para representar una secuencia
inmutable de números. Uno de sus principales usos es junto a la sentencia for,
para definir un bucle sobre el que se itera un número determinado de veces.
Índice
La clase range en Python
Recorrer una secuencia numérica
Ventajas de usar range en Python
Operaciones de la clase range
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[5, 6, 7, 8, 9]
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
¿Por qué estoy utilizando en los ejemplos la clase range como argumento
de list ? range , además de un tipo secuencial es un tipo iterable con una
particularidad: a diferencia de los tipos list o tuple, range calcula los ítems al
vuelo, cuando los necesita. Como list acepta un objeto iterable como
parámetro, por eso paso un objeto range al constructor de list, para que se
muestre por pantalla la secuencia completa que se genera con range.
# Nunca se puede ir de 0 a 10 de -1 en -1
[]
... print(i)
...
4
5
10
Veamos una comparación de una lista que almacena los números del 0 al
100.000 y un rango del 0 al 100.000:
>>> sys.getsizeof(lista)
900120
>>> sys.getsizeof(rango)
48
>>> r = range(0,30, 3)
>>> r[2]
6
>>> r[-1]
27
>>> 13 in r
False
>>> 12 in r
True
>>> r.index(18)
Bueno, pues con esto, hemos llegado al final de este tutorial. Recuerda, usa la
clase range para generar secuencias de números, especialmente si las
necesitas en un bucle for.
Conjuntos en Python: El
tipo set y operaciones
más comunes
El tipo set en Python es la clase utilizada por el lenguaje para representar los
conjuntos. Un conjunto es una colección desordenada de elementos únicos, es
decir, que no se repiten.
Este tutorial describe en detalle la clase set de Python, sus principales usos y
operaciones. ¡No te lo pierdas!
Índice
Qué es el tipo set en Python
Cómo acceder a los elementos de un conjunto en Python
Añadir elementos a un conjunto (set) en Python
Eliminar un elemento de un conjunto en Python
Número de elementos (len) de un conjunto
Cómo saber si un elemento está en un conjunto
Operaciones sobre conjuntos en Python (set operations)
Métodos de la clase set en Python
Estas características hacen que los principales usos de esta clase sean
conocer si un elemento pertenece o no a una colección y eliminar duplicados
de un tipo secuencial (list, tuple o str).
>>> c = {1, 3, 2, 9, 3, 1}
>>> c
{1, 2, 3, 9}
>>> a
{'a', 'H', 'h', 'y', 'n', 's', 'P', 't', ' ', 'i', 'l', 'o'}
>>> unicos
{1, 3, 5, 6}
set vs frozenset
>>> f
frozenset({1, 3, 5, 6})
... print(e)
...
>>> mi_conjunto
{1, 2, 3, 9}
>>> mi_conjunto.add(7)
>>> mi_conjunto
{1, 2, 3, 7, 9}
>>> mi_conjunto
{1, 2, 3, 4, 5, 6, 7, 9}
NOTA: add() y update() no añaden elementos que ya existen al conjunto.
>>> mi_conjunto
{1, 2, 3, 4, 5, 6, 9}
>>> mi_conjunto.remove(1)
>>> mi_conjunto
{2, 3, 4, 5, 6, 9}
>>> mi_conjunto.discard(4)
>>> mi_conjunto
{2, 3, 5, 6, 9}
KeyError: 7
# No hace nada
>>> mi_conjunto.discard(7)
>>> mi_conjunto
{2, 3, 5, 6, 9}
>>> mi_conjunto.pop()
>>> mi_conjunto
{3, 5, 6, 9}
>>> mi_conjunto.clear()
>>> mi_conjunto
set()
>>> len(mi_conjunto)
4
Cómo saber si un elemento está en un
conjunto
Con los conjuntos también se puede usar el operador de pertenencia in para
comprobar si un elemento está contenido, o no, en un conjunto:
True
False
False
>>> a = {1, 2, 3, 4}
>>> b = {2, 4, 6, 8}
>>> a | b
{1, 2, 3, 4, 6, 8}
Intersección de conjuntos en Python
>>> a = {1, 2, 3, 4}
>>> b = {2, 4, 6, 8}
>>> a & b
{2, 4}
>>> a = {1, 2, 3, 4}
>>> b = {2, 4, 6, 8}
>>> a - b
{1, 3}
>>> a = {1, 2, 3, 4}
>>> b = {2, 4, 6, 8}
a^b
{1, 3, 6, 8}
Inclusión de conjuntos en Python
>>> a = {1, 2}
>>> b = {1, 2, 3, 4}
>>> a <= b
True
>>> a >= b
False
>>> b >= a
True
>>> a = {1, 2}
>>> b = {1, 2}
False
>>> a <= b
True
>>> a = {1, 2}
>>> b = {1, 2, 3, 4}
>>> a.isdisjoint(b)
False
>>> a = {1, 2}
>>> b = {3, 4}
>>> a.isdisjoint(b)
True
>>> a = {1, 2}
>>> b = {1, 2}
>>> id(a)
4475070656
>>> id(b)
4475072096
>>> a == b
True
Método Descripción
En este tutorial te describo con todo detalle la clase dict de Python para que le
saques todo el partido y no haya diccionario que se te resista.
Índice
Qué es el tipo dict en Python
Cómo acceder a los elementos de un diccionario en Python
for dict Python – Recorrer un diccionario
Añadir elementos a un diccionario en Python
Modificar elementos de un diccionario
Eliminar un elemento de un diccionario en Python
Número de elementos (len) de un diccionario en Python
Comprobar si un elemento está en un diccionario en Python
Comparar si dos diccionarios son iguales
Diccionarios anidados en Python
Obtener una lista con las claves de un diccionario
Objetos vista de un diccionario
Listado de métodos de la clase dict
La más simple es encerrar una secuencia de pares clave: valor separados por
comas entre llaves {}
En el diccionario anterior, los enteros 1 y 89 y las cadenas 'a' y 'c' son las
claves. Como ves, se pueden mezclar claves y valores de distinto tipo sin
problema.
>>> d
>>> d2
>>> d3
>>> d4
# 5. Diccionario vacío
>>> d5 = {}
>>> d5
{}
# 6. Diccionario vacío usando el constructor
>>> d6 = dict()
>>> d6
{}
>>> d['dos']
>>> d[4]
KeyError: 4
La clase dict también ofrece el método get(clave[, valor por defecto]) . Este
método devuelve el valor correspondiente a la clave clave . En caso de que la
clave no exista no lanza ningún error, sino que devuelve el segundo
argumento valor por defecto . Si no se proporciona este argumento, se
devuelve el valor None .
>>> d.get('uno')
>>> d.get('cuatro', 4)
>>> a
>>> type(a)
<class 'NoneType'>
>>> for e in d:
... print(e)
...
uno
dos
tres
... print(k)
...
uno
dos
tres
... print(v)
...
2
3
... print(i)
...
('uno', 1)
('dos', 2)
('tres', 3)
>>> d
{'uno': 1, 'dos': 2}
>>> d['tres'] = 3
>>> d
>>> d.setdefault('tres', 3)
>>> d.setdefault('cuatro')
>>> d
>>> d
{'uno': 1, 'dos': 2}
>>> d
>>> d.pop('uno')
>>> d
>>> d.pop(6)
KeyError: 6
>>> d.popitem()
('cinco', 5)
>>> d
>>> d
{'dos': 2, 'cuatro': 4}
>>> d.clear()
>>> d
{}
>>> len(d)
>>> print('uno' in d)
True
>>> print(1 in d)
False
True
>>> if 1 in d:
>>> d
>>> d3 = {'uno': 1}
True
False
>>> d['d1']['k1']
>>> d['d2']['k1']
>>> d['d2']['k4']
>>> d['d3']['k4']
KeyError: 'd3'
>>> list(d)
>>> v = d.keys()
>>> type(v)
<class 'dict_keys'>
>>> v
>>> l = list(d)
>>> type(l)
<class 'list'>
>>> l
>>> v = d.values()
>>> type(v)
<class 'dict_values'>
>>> v
dict_values([1, 2, 3])
>>> v = d.items()
>>> type(v)
<class 'dict_items'>
>>> v
Método Descripción
items() Devuelve una vista de los pares clave: valor del diccionario.
pop(clave[, valor]) Devuelve el valor del elemento cuya clave es clave y elimina el
elemento del diccionario. Si la clave no se encuentra,
devuelve valor si se proporciona. Si la clave no se encuentra y
no se indica valor , lanza la excepción KeyError .
Índice
Qué es el tipo str en Python
Cómo crear una cadena en Python
Cómo acceder a los caracteres de una cadena en Python
for str Python – Recorrer los caracteres de una cadena
Comprobar si un carácter está en una cadena en Python
Comprobar si dos strings son iguales en Python
Longitud (len) de una cadena en Python
Escapar caracteres de una cadena en Python
Raw strings
Representación de un objeto como cadena
Otras operaciones sobre cadenas en Python
>>> s
'Hola Pythonista'
>>> type(s)
<class 'str'>
>>> s2
>>> type(s2)
<class 'str'>
Si quieres o necesitas que un string ocupe más de una línea, entonces debes
encerrar el texto entre tres comillas simples '''...''' o dobles """... """ .
>>> s = '''
... de
>>> s
Este string
ocupa más
de
una línea
Como puedes observar, el uso de las tres comillas (simples o dobles) guarda el
carácter de fin de línea. Esto se puede evitar añadiendo el carácter \ al final de
cada línea.
... de \
>>> s
>>> print(s)
>>> s
'hola Pythonista'
>>> s2
'holaholahola Pythonista'
Y para terminar esta sección, simplemente resaltar que dos strings literales se
pueden concatenar si aparecen juntos uno tras otro.
>>> s
'Hola Pythonista'
>>> s = ('Hola'
>>> s
>>> s[0]
'H'
>>> s[5]
'P'
>>> s[2]
'l'
Si se intenta acceder a un índice que está fuera del rango del string, el
intérprete lanzará la excepción IndexError . De igual modo, si se utiliza un índice
que no es un número entero, se lanzará la excepción TypeError
>>> s[30]
>>> s[1.0]
>>> s[-1]
'a'
>>> s[-2]
't'
... print(c)
...
Resultado
True
False
True
>>> s1 = 'hola'
>>> s2 = 'hola'
True
>>> s3 = 'Hola'
False
>>> len(saludo)
Lo más fácil si tienes que usar el carácter ' en tu cadena, es encerarla entre
comillas dobles. Por el contrario, si necesitas usar " dentro del string, enciérralo
entre comillas simples.
>>> print(s)
>>> print(s)
También puedes usar la combinación \' para mostrar una comilla simple
o \" para mostrar una comilla doble, independientemente de si la cadena está
encerrada entre comillas simples o dobles.
>>> print(s)
Además del carácter ' y " , hay otros caracteres especiales que para ser
usados dentro de una cadena necesitan ser «escapados» con el carácter \ .
Son, entre otros, los siguientes: tabulador ( \t ), barra invertida ( \\ ), retroceso
( \b ), nueva línea ( \n ) o retorno de carro ( \r ).
>>> s = 'C:\\Users\\Documents\\'
>>> print(s)
C:\Users\Documents\
>>> s = 'Hola\n\tPythonista'
>>> print(s)
Hola
Pythonista
Raw strings
En relación con la sección anterior, puede haber ocasiones en que se quiera
usar el carácter \ pero sin ser utilizado como carácter de escape. Para ello, se
puede hacer uso de las raw strings. Una cadena de este tipo comienza
anteponiendo el carácter r a las comillas (simples o dobles).
>>> s = 'C:\python\noticias'
>>> print(s)
C:\python
oticias
>>> print(s)
C:\python\noticias
Por ejemplo, en JAVA, para comprobar si una cadena no está vacía podemos
encontrarnos con cosas como:
E incluso:
Siguiendo con el lenguaje JAVA, si queremos saber si una lista (por ejemplo
ArrayList
if (list.size() == 0) {
// Lista vacía
}
O también:
if (list.isEmpty()) {
// Lista vacía
Pero en Python es mucho más simple. Dado que en Python las listas, tuplas,
diccionarios, cadenas o conjuntos vacíos se evalúan como
False
vacía es la siguiente:
if list:
# No vacía
else:
# Vacía
if dict:
# No vacío
else:
# Vacío
Por tanto, si una estructura de datos está vacía, devuelve «False» cuando es
usada en un contexto booleano. Por el contrario, si contiene elementos,
devuelve «True» al tratarla en un contexto booleano.
Vamos a definir una función para comprobar si una estructura de datos está
vacía:
def is_empty(data_structure):
if data_structure:
return False
else:
print("Está vacía")
return True
>>>d = {}
>>>t = ()
>>>l = []
>>>str = ''
>>>s = set()
>>>is_empty(d)
Está vacía
>>>is_empty(t)
Está vacía
>>>is_empty(l)
Está vacía
>>>is_empty(str)
Está vacía
>>>is_empty(s)
Está vacía
>>>d['a'] = 1
>>>t = tuple('a')
>>>l.append('a')
>>>str = 'a'
>>>s.add('a')
>>>is_empty(d)
No está vacía
>>>is_empty(t)
No está vacía
>>>is_empty(l)
No está vacía
>>>is_empty(str)
No está vacía
>>>is_empty(s)
No está vacía
Hay que tener en cuenta que esta forma de comprobar si una estructura de
datos (ya sea una lista, diccionario, cadena…) está vacía, también devolverá
False
si su valor es
None
Además, las claves «vacías» que tienen valores en los diccionarios también
serán evaluadas como «no vacías«. Véamoslo:
>>> is_empty(empty_key)
No está vacía
False
Evita la forma no «pythonica»
Sí, seguro que te lo has preguntado o lo has pensado. ¿Por qué no hago uso
de la función
len
comunidad.
if len(dict) == 0:
...
if len(dict.keys()) == 0:
...
Concatenar en Python:
Cómo concatenar y
formatear strings en
Python
Una de las operaciones más comunes en cualquier lenguaje de programación
es la concatenación y/o combinación de cadenas. En este tutorial
descubrirás distintos modos de concatenar en python dos o más strings.
>>> nombre_completo
>>> hola
'Hola 'Python'
>>> suma = 1 + 2
>>> suma
Para poder concatenar los valores anteriores tienes que convertir suma a un
objeto de tipo string . Para ello puedes usar el método str() , que devuelve una
representación de tipo string del objeto que se le pasa como parámetro.
>>> suma = 1 + 2
>>> suma
>>> res
Suma: 1 + 2 = 3
No obstante, los dos últimos ejemplos que te he enseñado no son los más
«apropiados». Existen opciones más legibles en Python como te mostraré a
continuación.
Formatear strings en Python usando el
operador ‘%’
Formatear strings en Python usando el operador % es el modo tradicional,
muy similar a la función printf del lenguaje C.
'Hola 'Python'
...
>>> print_suma(1, 2)
Si quieres conocer todos los posibles tipos de conversión usando el estilo printf,
puedes consultar la documentación oficial de Python aquí.
nombre = ''Python''
f'Hola {nombre}'
'Hola 'Python''
Otro ejemplo:
...
>>> print_suma(1, 2)
Como puedes observar, el literal con el que se llama a join es lo que se utiliza
para separar los distintos elementos de la cadena.
'1, 2, 3'
Conclusiones
Python ofrece varias formas de concatenar y formatear strings. Utilizar una u
otra dependerá del código en cuestión, de cómo sea más legible y de la
versión de Python que estés usando. Personalmente, si tu versión de Python
es la 3.6+, usaría f-Strings siempre que fuera posible para formatear cadenas.
Si te encuentras con código legacy (código antiguo), quizá sea más correcto
emplear el estilo antiguo para mantener la coherencia con el resto del código.
String replace:
reemplazar caracteres en
una cadena en Python
Antes o después, en algún proyecto Python te tocará manipular objetos de
tipo string . De hecho, yo ahora mismo estoy trabajando en un script
procesando imágenes de satélite y necesito crear un directorio cuyo nombre lo
toma de base de otro directorio, pero cambian los primeros caracteres. Para
crear el nombre de este directorio estoy usando el método replace de la clase
string.
>>> new_dir_name
'S2A_MSIL2A_20190106T105431_N0207_R051_T30SXH_20190106T112304'
>>> nueva
'bbbaaa'
'cadena'.replace('c', 'C')
y no
.
Eliminar los espacios en
blanco – trim python –
función strip
Las operaciones con cadenas son imprescindibles en cualquier lenguaje de
programación. Una tarea muy común al trabajar con objetos de tipo string es
eliminar los espacios en blanco (conocida como trim python string) al principio
y/o final de los mismos, por ejemplo, para limpiar la entrada de datos de un
usuario. La función strip() es la solución a tus problemas.
Imagina que tienes un campo de texto en el que es obligatorio introducir un
mínimo de caracteres. En este caso, puedes usar la función strip para eliminar
todos los espacios en blanco sobrantes y verificar que el usuario completó
correctamente el campo de texto.
>>> print(hola)
Hola
>>> print(hola_limpio)
Hola
Parámetros del método strip()
Opcionalmente, al método strip() se le puede pasar como parámetro un
conjunto de caracteres. Si todos estos caracteres se encuentran al principio o
al final de la cadena serán eliminados. Veámoslo con un ejemplo:
mundo hola
mund
>>> print(hola.rstrip())
' hola'
>>> print(hola.lstrip())
'hola '
Convertir a mayúsculas y
minúsculas en Python
En este tutorial vas a descubrir los diferentes métodos para convertir texto a
mayúsculas y minúsculas en Python. Todos estos métodos pertenecen a la
clase String.
>>> print(hola)
Hola pythonista
>>> print(hola_upper)
HOLA PYTHONISTA
>>> print(hola)
HOLA Pythonista
>>> print(hola_lower)
hola pythonista
Convertir solo la primera letra de un
texto a mayúsculas
Para convertir la primera letra de una cadena a mayúsculas, utiliza el
método capitalize() . capitalize() devuelve una copia de la cadena con la
primera letra en mayúsculas.
>>> print(hola)
>>> print(hola_swaped)
>>> print(hola)
>>> 'Hola'.isupper()
False
>>> 'HOLA'.isupper()
True
>>> 'Hola'.islower()
False
>>> 'hola'.islower()
True
Pues hemos llegado al final de este tutorial. En él, hemos repasado los
diferentes métodos de la clase String para convertir una cadena a mayúsculas
y minúsculas en Python.
Python split – Dividir
string en Python en
tokens
En este tutorial te voy a mostrar cómo dividir una cadena de caracteres en
Python con el método split() de la clase string.
['', '', 'Me', '', '', '', 'gusta', '\t\nPython', '', '', '', '', '']
>>> '1,2,3'.split(sep=',')
Este tutorial es una guía que te muestra qué es una función, cuál es su
estructura y cómo usarlas en tus aplicaciones.
Índice
Qué son las funciones en Python
Cómo definir una función en Python
Cómo usar o llamar a una función
Sentencia return
Parámetros de las funciones en Python
Ámbito y ciclo de vida de las variables
Sin embargo, tú como programador, puedes definir tus propias funciones para
estructurar el código de manera que sea más legible y para reutilizar aquellas
partes que se repiten a lo largo de una aplicación. Esto es una tarea
fundamental a medida que va creciendo el número de líneas de un programa.
La idea la puedes observar en la siguiente imagen:
Tras los dos puntos se incluye el cuerpo de la función (con un sangrado mayor,
generalmente cuatro espacios) que no es más que el conjunto de instrucciones
que se encapsulan en dicha función y que le dan significado.
Veámoslo con un ejemplo. Vamos a crear una función que muestra por pantalla
el resultado de multiplicar un número por cinco:
def multiplica_por_5(numero):
multiplica_por_5(7)
print('Siguiente')
multiplica_por_5(113)
print('Fin')
7 * 5 = 35
Siguiente
113 * 5 = 565
Fin
Sentencia return
Anteriormente te indicaba que cuando acaba la última instrucción de una
función, el flujo del programa continúa por la instrucción que sigue a la llamada
de dicha función. Hay una excepción: usar la sentencia return . return hace
que termine la ejecución de la función cuando aparece y el programa continúa
por su flujo normal.
... return
... else:
... print(numero ** 2)
...
>>> cuadrado_de_par(8)
64
>>> cuadrado_de_par(3)
Varios return en una misma función
... if numero % 2 == 0:
... else:
...
>>> es_par(2)
True
>>> es_par(5)
False
En Python, es posible devolver más de un valor con una sola sentencia return .
Por defecto, con return se puede devolver una tupla de valores. Un ejemplo
sería la siguiente función cuadrado_y_cubo() que devuelve el cuadrado y el cubo
de un número:
...
>>> cuad
16
>>> cubo
64
... resultados = []
... resultados.append(numero * i)
...
>>> res
...
>>> print(saludo(''Python''))
Hola Python
None
Antes de contestar a estas dos preguntas, tenemos que conocer los conceptos
de programación paso por valor y paso por referencia.
Paso por valor: Un lenguaje de programación que utiliza paso por valor de los
argumentos, lo que realmente hace es copiar el valor de las variables en los
respectivos parámetros. Cualquier modificación del valor del parámetro, no afecta a la
variable externa correspondiente.
Paso por referencia: Un lenguaje de programación que utiliza paso por referencia, lo
que realmente hace es copiar en los parámetros la dirección de memoria de las
variables que se usan como argumento. Esto implica que realmente hagan referencia
al mismo objeto/elemento y cualquier modificación del valor en el parámetro afectará a
la variable externa correspondiente.
Una vez aclarado este tema, a continuación, te dejo unos tutoriales muy, muy
interesantes para que sigas profundizando sobre los tipos de parámetros en
Python:
Tipos de parámetros
*args y **kwargs. Número de parámetros indefinido
Tipos de parámetros en
una función Python
En este tutorial quiero enseñarte algo que considero esencial para que
controles el lenguaje Python: Los tipos de parámetros de una función. Si
has estado jugando con el lenguaje, sabrás que a la hora de definir una función
puedes indicar una serie de parámetros.
return x > y
>>>es_mayor(5, 3)
True
>>>es_mayor(5)
Antes de seguir es importante que tengas en cuenta que, por defecto, los
valores de los argumentos se asignan a los parámetros en el mismo orden en
el que los pasas al llamar a la función. Más adelante veremos que esta
circunstancia puede cambiar.
Parámetros opcionales en una función
Python
Además de como hemos visto hasta ahora, en una función Python se
pueden indicar una serie de parámetros opcionales. Son parámetros que se
indican con un valor por defecto y si no se pasan al invocar a la función
entonces toman este valor.
Imaginemos el constructor (método __init__) de una clase Punto que toma los
valores de las coordenadas en las que se creará un objeto de dicha clase:
class Punto:
self.x = x
self.y = y
def __repr__(self):
>>>Punto(1, 2)
x: 1, y: 2
>>>Punto()
self.x = x
self.y = y
Ahora podemos invocar a la función del siguiente modo:
>>>Punto()
x: 0, y: 0
>>>Punto(3)
x: 3, y: 0
Por defecto, al llamar a una función los valores de los argumentos se asignan en el
mismo orden en el que se pasan al invocar a dicha función.
Los parámetros opcionales se indican con el operador ‘=’, tienen un valor por defecto y
siempre se definen después de los parámetros obligatorios.
Se puede modificar el orden de los argumentos con el que se invoca a una función si
se indica el nombre de los parámetros. Los parámetros con nombre siempre aparecen
después de los posicionales.
*args y **kwargs en
Python. Una explicación y
ejemplos de uso.
Sí, lo sé, tú también los has visto en un montón de ejemplos, pero no te termina
de quedar claro qué significan los parámetros *args y **kwargs en una función
en Python. Y no solo como parámetros, sino que también pueden ser pasados
como argumentos. Quiero explicarte qué significan y cuándo usarlos.
Lo que realmente indica que el parámetro es de este tipo es el símbolo ‘*’, el nombre
args se usa por convención.
El parámetro recibe los argumentos como una tupla.
Es un parámetro opcional. Se puede invocar a la función haciendo uso del mismo, o
no.
El número de argumentos al invocar a la función es variable.
Son parámetros posicionales, por lo que, a diferencia de los parámetros con nombre,
su valor depende de la posición en la que se pasen a la función.
Pero como yo siempre digo, las cosas se ven mejor con un ejemplo:
return x + y
Si llamamos a la función con los valores x=2 e y=3, el resultado devuelto será
5.
>>>sum(2, 3)
>>>sum(2, 3, 4)
¿Cómo podemos solucionar este problema? Pues una opción sería añadir más
parámetros a la función, pero ¿cuántos?
def sum(*args):
value = 0
for n in args:
value += n
return value
>>>sum(2, 3)
>>>sum(2, 3, 4)
>>>sum(2, 3, 4, 6, 9, 21)
45
Entendiendo **kwargs
Lo que realmente indica que el parámetro es de este tipo es el símbolo ‘**’, el nombre
kwargs se usa por convención.
El parámetro recibe los argumentos como un diccionario.
Al tratarse de un diccionario, el orden de los parámetros no importa. Los parámetros
se asocian en función de las claves del diccionario.
Imaginemos que queremos implementar una función filter que nos devuelva
una consulta SQL de una tabla clientes que tiene los siguientes
campos: nombre, apellidos, fecha_alta, ciudad, provincia,
tipo y fecha_nacimiento.
No es una función para sentirse muy contento. Entre los diferentes problemas
que pueden surgir tenemos:
def filter(**kwargs):
i=0
if i == 0:
else:
i += 1
query += ";"
return query
>>>filter()
>>>filter(ciudad="Madrid")
>>>filter(ciudad="Madrid", fecha_alta="25-10-2018")
Hasta aquí hemos visto qué significan los parámetros *args y **kwargs en
una función en Python y dos ejemplos de cuándo y cómo usarlos. Otros
ejemplos de uso comunes son los decoradores (de los cuáles te hablaré en
otro post) y el método __init__ en la herencia. Te mostraré este último ya que
hace un uso combinado de ambos.
Supongamos que tenemos la siguiente clase Punto:
class Punto:
self.x = x
self.y = y
def __repr__(self):
Y ahora queremos añadir una clase Circulo que herede de Punto. Para conocer
todos los detalles del círculo, nos hace falta conocer su radio, por lo que debe
ser incluido en el método __init__. Sin embargo, la definición será un poco
diferente a la de la clase Punto:
class Circulo(Punto):
self.radio = radio
super().__init__(*args, **kwargs)
def __repr__(self):
>>>Circulo(10, 1, 1)
x: 1, y: 1, radio: 10
El orden importa
Quiero mencionar que el orden de los parámetros *args y **kwargs en la
definición de una función importa, y mucho. Ambos pueden aparecer de
forma conjunta o individual, pero siempre al final y de la siguiente manera:
def ejemplo(arg1, arg2, *args, **kwargs)
if op == '+':
return x + y
elif op == '-':
return x - y
>>>resultado(1, 2, '+')
>>>resultado(*a)
O incluso así:
>>>resultado(3, *a)
>>>resultado(**a)
Conclusión
Bueno, en resumen, qué significan y cómo y cuándo usar los parámetros
*args y **kwargs en Python. Repasemos las cuestiones clave:
Utiliza *args para pasar de forma opcional a una función un número variable de
argumentos posicionales.
El parámetro *args recibe los argumentos como una tupla.
Emplea **kwargs para pasar de forma opcional a una función un número variable de
argumentos con nombre.
El parámetro **kwargs recibe los argumentos como un diccionario.
Por último, quiero comentarte que un gran poder conlleva una gran
responsabilidad. Utilizar *args y **kwargs puede ahorrarte muchos mareos de
cabeza y convertirte en un programador top pero también puede llevarte a
resultados inesperados si no llevas cuidado con su uso.
... x = 10
>>> saludo('Python')
Hola j2logo
>>> print(x)
... x = 10
...
>>> x = 20
>>> muestra_x()
x vale 10
>>> print(x)
20
>>> y = 20
... x = 10
...
>>> muestra_x()
x vale 10
y vale 20
Para modificar dentro de una función una variable definida fuera de la misma,
hay que usar la palabra reservada global para declarar la variable dentro de la
función, pero esto lo veremos con más detenimiento en el siguiente capitulo.
Espacios de nombres,
módulos y paquetes en
Python
Los módulos y paquetes en Python son la forma de organizar los scripts y
programas a medida que estos crecen en número de líneas de código. Por otro
lado, un espacio de nombres define los límites en que se puede utilizar un
nombre o identificador determinado.
Índice
Nombres y espacios de nombres en Python
Ámbito de una variable en Python
Qué es un módulo en Python
Cómo importar módulos en Python
Ejecutar módulos como scripts
Dónde y cómo busca Python los módulos
La función dir()
Paquetes en Python
Importar definiciones de un paquete
Espacios de nombres
Una vez aclarado este término, paso a explicarte qué son los espacios de
nombres en Python. Un espacio de nombres es una colección aislada de
nombres (o identificadores) que referencian a objetos. Como veremos a
continuación, en un mismo script o programa Python pueden coexistir varios
espacios de nombres a la vez.
Si hay una función dentro de otra función, se anida un nuevo ámbito dentro del
ámbito local.
local, nonlocal y global en Python
def funcion_a():
y=2
def funcion_b():
z=3
print(z)
funcion_b()
print(y)
x=1
funcion_a()
print(x)
def funcion_a():
x=2
def funcion_b():
x=3
print(x)
funcion_b()
print(x)
x=1
funcion_a()
print(x)
def funcion_a():
global x
x=2
def funcion_b():
global x
x=3
print(x)
funcion_b()
print(x)
x=1
funcion_a()
print(x)
def saludo(nombre):
print(f'Hola {nombre}')
>>> mis_funciones.saludo('python')
Hola j2logo
from … import …
saludo('python')
from … import *
Es similar al caso anterior, solo que importa todas las definiciones del módulo a
excepción de los nombres que comienzan por guión bajo _ .
from … import as
Por último, podemos redefinir el nombre con el que una definición será usada
dentro de un módulo utilizando la palabra reservada as :
>>> hola('python')
Hola j2logo
Esto hace realmente interesante añadir al final del módulo las siguientes líneas
de código, que solo se ejecutarán en caso de que dicho módulo se haya
ejecutado como el principal:
if __name__ == '__main__':
hola('python')
Ahora bien, cuando importamos un módulo, ¿cómo sabe Python a qué módulo
nos referimos? ¿Dónde busca Python los ficheros correspondientes a los
módulos?
La función dir()
La función dir() devuelve una lista con todas las definiciones (variables,
funciones, clases, …) contenidas en un módulo.
>>> dir(mis_funciones)
Paquetes en Python
Del mismo modo en que agrupamos las funciones y demás definiciones
en módulos, los paquetes en Python permiten organizar y estructurar de forma
jerárquica los diferentes módulos que componen un programa. Además, los
paquetes hacen posible que existan varios módulos con el mismo nombre y
que no se produzcan errores.
Al igual que sucede con los módulos, cuando se importa un paquete, Python
busca a través de los directorios definidos en sys.path el directorio
perteneciente a dicho paquete.
Para que lo veas todo de forma gráfica, te muestro los conceptos con una
imagen. Imagina que estás haciendo una aplicación para gestionar pedidos.
Una forma de organizar los diferentes módulos podría ser la siguiente:
# Módulo app.pedidos.vistas
import app.usuarios.dao
El único problema de hacerlo así, es que si, por ejemplo, dicho módulo define
una función llamada guardar() , hay que especificar toda la jerarquía para
invocar a esta función:
app.usuarios.dao.guardar(usuario)
# Módulo app.pedidos.vistas
dao.guardar(usuario)
# Módulo app.pedidos.vistas
guardar(usuario)
Y para terminar este tutorial, vamos a ver que dentro de un módulo los
paquetes se pueden referenciar de forma relativa.
# Módulo app.pedidos.vistas
# Módulo app.pedidos.vistas
from . import dao # Un punto referencia al paquete actual
Bueno, hemos llegado al final de este tutorial. Ha sido intenso pero necesario
para conocer mejor cómo funciona Python internamente y poder sacar más
provecho al lenguaje. ¡Te espero en el siguiente, en el que veremos conceptos
de programación orientada a objetos!
Programación orientada a
objetos (POO) en Python
De todos los tutoriales que hemos visto hasta ahora, diría que este es uno de
los más importantes: Programación Orientada a Objetos en Python. Y es
que, como te he mencionado en varias ocasiones, en Python todo es un objeto.
Si dominas los conceptos que describo en este artículo, estarás un paso más
cerca de ser un auténtico Pythonista.
Índice
Python es un lenguaje orientado a objetos
Clases y objetos en Python
Constructor de una clase en Python
Atributos, atributos de datos y métodos
Atributos de clase y atributos de instancia
Herencia en Python
Herencia múltiple en Python
Encapsulación: atributos privados
Polimorfismo
Pues todo lo que acabo de describir viene a ser una clase y cada uno de los de
coches que has imaginado, serían objetos de dicha clase.
Como te decía, una clase engloba datos y funcionalidad. Cada vez que se
define una clase en Python, se crea a su vez un tipo nuevo (¿recuerdas?
tipo int , float , str , list , tuple , … todos ellos están definidos en una clase).
¿Ves ya la diferencia?
NOTA: Es una convención utilizar la notación CamelCase para los
nombres de las clases. Esto es, la primera letra de cada palabra del nombre
está en mayúsculas y el resto de letras se mantienen en minúsculas.
obj = MiClase()
El código anterior crea una nueva instancia de la clase MiClase y asigna dicho
objeto a la variable obj . Esto crea un objeto vacío, sin estado.
Sin embargo, hay clases (como nuestra clase Coche ) que deben o necesitan
crear instancias de objetos con un estado inicial.
En este caso, para instanciar un objeto de tipo coche, debemos pasar como
argumentos el color y la aceleración como vimos en el ejemplo:
c1 = Coche('rojo', 20)
Como habrás podido apreciar, un objeto tiene dos tipos de atributos: atributos
de datos y métodos.
Los atributos de datos definen el estado del objeto. En otros lenguajes son
conocidos simplemente como atributos o miembros.
Los métodos son las funciones definidas dentro de la clase.
Métodos
Como te explicaba al comienzo de esta sección, los métodos son las funciones
que se definen dentro de una clase y que, por consiguiente, pueden ser
referenciadas por los objetos de dicha clase. Sin embargo, realmente los
métodos son algo más.
Si te has fijado bien, pero bien de verdad, habrás observado que las
funciones acelera() y frena() definen un parámetro self .
def acelera(self):
self.velocidad = self.velocidad + self.aceleracion
Sabiendo esto, podemos entender, por ejemplo, por qué todos los objetos de
tipo Coche pueden referenciar a los atributos de datos velocidad o color . Son
inicializados para cada objeto en el método __init__() .
Para la clase Coche , acelera() es una función. Sin embargo, para los objetos de
la clase Coche , acelera() es un método.
>>> print(Coche.acelera)
<function Coche.acelera at 0x10c60b560>
>>> print(c1.acelera)
<bound method Coche.acelera of <__main__.Coche object at 0x10c61efd0>>
Los atributos de clase son atributos compartidos por todas las instancias de
esa clase.
Los atributos de instancia, por el contrario, son únicos para cada uno de los
objetos pertenecientes a dicha clase.
En el ejemplo de la clase Coche , ruedas se ha definido como un atributo de
clase, mientras que color , aceleracion y velocidad son atributos de instancia.
class CocheVolador(Coche):
ruedas = 6
def __init__(self, color, aceleracion, esta_volando=False):
super().__init__(color, aceleracion)
self.esta_volando = esta_volando
def vuela(self):
self.esta_volando = True
def aterriza(self):
self.esta_volando = False
Sin embargo, Python incorpora otras dos funciones que pueden ser de utilidad
cuando se quiere conocer el tipo de una clase.
Son: isinstance() e issubclass() .
isinstance(objeto, clase) devuelve True si objeto es de la clase clase o de
una de sus clases hijas. Por tanto, un objeto de la clase CocheVolador es
instancia de CocheVolador pero también lo es de Coche . Sin embargo, un objeto
de la clase Coche nunca será instancia de la clase CocheVolador .
issubclass(clase, claseinfo) comprueba la herencia de clases.
Devuelve True en caso de que clase sea una subclase de claseinfo , False en
caso contrario. claseinfo puede ser una clase o una tupla de clases.
class A:
def print_a(self):
print('a')
class B:
def print_b(self):
print('b')
class C(A, B):
def print_c(self):
print('c')
c = C()
c.print_a()
c.print_b()
c.print_c()
El script anterior dará como resultado
a
b
c
Bien, por defecto, en Python, todos los atributos de una clase (atributos de
datos y métodos) son públicos. Esto quiere decir que desde un código que use
la clase, se puede acceder a todos los atributos y métodos de dicha clase.
También es posible usar un doble guión bajo __atributo . Esto hace que el
identificador sea literalmente reemplazado por el texto _Clase__atributo ,
donde Clase es el nombre de la clase actual.
class A:
def __init__(self):
self._contador = 0 # Este atributo es privado
def incrementa(self):
self._contador += 1
def cuenta(self):
return self._contador
class B(object):
def __init__(self):
self.__contador = 0 # Este atributo es privado
def incrementa(self):
self.__contador += 1
def cuenta(self):
return self.__contador
>>> a = A()
>>> a.incrementa()
>>> a.incrementa()
>>> a.incrementa()
>>> print(a.cuenta())
3
>>> print(a._contador)
3
>>> b = B()
>>> b.incrementa()
>>> b.incrementa()
>>> print(b.cuenta())
2
>>> print(b.__contador)
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'B' object has no attribute '__contador'
>>> print(b._B__contador)
2
Aunque este concepto te suene raro ahora mismo, lo vas a entender con un
ejemplo. Imagina que tenemos las siguientes clases que representan animales:
class Perro:
def sonido(self):
print('Guauuuuu!!!')
class Gato:
def sonido(self):
print('Miaaauuuu!!!')
class Vaca:
def sonido(self):
print('Múuuuuuuu!!!')
def a_cantar(animales):
for animal in animales:
animal.sonido()
if __name__ == '__main__':
perro = Perro()
gato = Gato()
gato_2 = Gato()
vaca = Vaca()
perro_2 = Perro()
granja = [perro, gato, vaca, gato_2, perro_2]
a_cantar(granja)
>?
>>> edad
'28'
>>> edad
28
Como ves, ahora edad es un int (ya no se muestra con las comillas simples).
>>> edad
28
¿Cuánto es 2 + 3?>? 2 + 3
>>> suma
Conclusión
Como ves, solicitar al usuario datos por consola en Python es muy simple. Ten
en cuenta las diferencias entre Python 2.x y Python 3.x, especialmente si
realizas una migración de versión. En este último caso, si necesitas que los
datos no sean de tipo str asegúrate de llevar a cabo las conversiones y
comprobaciones necesarias.
Cómo leer un fichero,
línea a línea en Python
A la hora de programar siempre hay una serie de tareas repetitivas que me
cuesta trabajo recordar. No sé si a ti te pasa lo mismo. Es por eso por lo que
decidí crear la sección «Desayuno con Python» en el blog, para recopilar todos
esos scripts sencillos pero útiles de uso cotidiano. Uno los scripts que no podía
faltar en esta sección es cómo leer un fichero, línea a línea en Python.
with open('ruta_del_fichero') as f:
for linea in f:
# Tu código aquí
contenido = f.read()
print(contenido)
¿Qué significa la palabra with al principio
del bloque?
A la hora de gestionar y manipular recursos, como puede ser un fichero, hay
ciertos patrones que se suelen repetir. Para estos casos, Python nos ayuda a
abstraernos del código repetitivo introduciendo lo que se conocen como
«Manejadores de contexto» a través de la sentencia with .
for linea in f:
...
f = open('hola.txt', 'r')
try:
for linea in f:
...
finally:
f.close()
Cómo escribir en un
fichero en Python
Sí, antes o después cualquier programador se tiene que enfrentar a la tarea de
escribir en un fichero. Y en Python, como en cualquier otro lenguaje, esto es
posible. Por eso, este tutorial sobre cómo escribir en un fichero no podía faltar
en la sección «Desayuno con Python».
Cuando se trabaja con un fichero de texto, hay que tener en cuenta que este se
estructura como una secuencia de líneas. Cada una de estas líneas acaba con
un carácter especial conocido como EOL (fin de línea). En función del sistema
operativo, este carácter puede variar. Puede ser \n (Unix) o \r\n (Windows).
No obstante, en Python, cuando escribimos o leemos el carácter \n en un
fichero de texto, el propio lenguaje se encarga de convertir dicho carácter al
correspondiente por el sistema operativo, por lo que es algo a prever si nuestro
código se va a ejecutar en diferentes sistemas.
El primero de ellos es la ruta del fichero (en la que está o donde se va a crear).
El segundo es el modo en el que se abre el fichero: lectura, escritura, …
r Solo lectura. El fichero solo se puede leer. Es el modo por defecto si no se indica.
try:
finally:
f.close()
f.write('Hola mundo\n')
f.write(b'0x28')
Conclusión
Bueno, este post es muy importante tenerlo en cuenta para cualquier
pythonista. En él hemos repasado el objeto File de Python, los distintos tipos de
ficheros que existen y cómo escribir en un fichero. Espero que te haya gustado.
Interfaces gráficas en Python con
Tkinter
Índice de contenidos
1. Introducción
2. Entorno
3. Widgets
4. Configuración
5. Gestión de la composición
6. Ejecución
7. Ejemplo práctico
1. Introducción
Hardware: Portátil MacBook Pro 15′ (2.2 Ghz Intel Core i7, 16GB
DDR3).
Sistema Operativo: Mac OS Mojave 10.14
Aplicación de desarrollo: Sublime Text 3.2.2
3. Widgets
widgets.
Frame: marco que permite agrupar diferentes widgets.
Text: campo que permite introducir texto largo (típico para añadir
comentarios).
Button: ejecuta una función al ser pulsado.
4. Configuración
5. Gestión de la composición
6. Ejecución
7. Ejemplo práctico
Finalmente, dejo por aquí el código de una sencilla calculadora, que hace uso
de varios componentes y configuraciones.
5 class Pycalc(Frame):
9 self.parent = master
10 self.grid()
11 self.createWidgets()
12
13 def deleteLastCharacter(self):
14 textLength = len(self.display.get())
15
16 if textLength >= 1:
17 self.display.delete(textLength - 1, END)
18 if textLength == 1:
19 self.replaceText("0")
20
22 self.display.delete(0, END)
23 self.display.insert(0, text)
24
26 actualText = self.display.get()
27 textLength = len(actualText)
28 if actualText == "0":
29 self.replaceText(text)
30 else:
31 self.display.insert(textLength, text)
32
33 def evaluate(self):
34 try:
35 self.replaceText(eval(self.display.get()))
38 self.replaceText("0")
39 except ZeroDivisionError:
41 self.replaceText("0")
42
43 def containsSigns(self):
45 display = self.display.get()
46 for c in display:
47 if c in operatorList:
48 return True
49 return False
50
51 def changeSign(self):
52 if self.containsSigns():
53 self.evaluate()
54 firstChar = self.display.get()[0]
55 if firstChar == "0":
56 pass
58 self.display.delete(0)
59 else:
60 self.display.insert(0, "-")
61
62 def inverse(self):
63 self.display.insert(0, "1/(")
64 self.append(")")
65 self.evaluate()
66
67 def createWidgets(self):
72
self.ceButton = Button(self, font=("Arial", 12), fg='red', text="CE", highlightbackground='red',
73 command=lambda: self.replaceText("0"))
83
84 self.sevenButton = Button(self, font=("Arial", 12), fg='white', text="7", highlightbackground='black',
command=lambda: self.append("7"))
85
self.sevenButton.grid(row=2, column=0, sticky="nsew")
86
self.eightButton = Button(self, font=("Arial", 12), fg='white', text="8", highlightbackground='black',
87 command=lambda: self.append("8"))
95
self.fourButton = Button(self, font=("Arial", 12), fg='white', text="4", highlightbackground='black',
96 command=lambda: self.append("4"))
106
self.oneButton = Button(self, font=("Arial", 12), fg='white', text="1", highlightbackground='black',
107
command=lambda: self.append("1"))
108
self.oneButton.grid(row=4, column=0, sticky="nsew")
109
self.twoButton = Button(self, font=("Arial", 12), fg='white', text="2", highlightbackground='black',
110 command=lambda: self.append("2"))
117
Calculator = Tk()
Calculator.title("AdictoCalculator")
Calculator.resizable(False, False)
Calculator.config(cursor="pencil")
root = Pycalc(Calculator).grid()
Calculator.mainloop()