Funciones de orden superior | Python

Funciones de orden superior

Las funciones de Python pueden tomar funciones como parámetros y devolver funciones como resultado. Una función que hace ambas cosas o alguna de ellas se llama función de orden superior.

filter()

La función filter() es una función la cual toma un predicado y una lista y devuelve una lista con los elementos que satisfacen el predicado. Tal como su nombre indica filter() significa filtrar, ya que a partir de una lista o iterador y una función condicional, es capaz de devolver una nueva colección con los elementos filtrados que cumplan la condición.

Todo esto podría haberse logrado también usando listas por comprensión que usaran predicados. No hay ninguna regla que diga cuando usar la función map() o la función filter() en lugar de las listas por comprensión, simplemente debe decidir que es más legible dependiendo del contexto.

Por ejemplo, suponga que tiene una lista varios números y requiere filtrarla, quedando únicamente con los números múltiples de 5, eso seria así:

>>> # Primero declaramos una función condicional
def multiple(numero):
# Comprobamos si un numero es múltiple de cinco
if numero % 5 == 0:
    # Sólo devolvemos True si lo es
    return True

>>> numeros = [2, 5, 10, 23, 50, 33]
>>> filter(multiple, numeros)
[5, 10, 50]

Si ejecuta el filtro obtiene una lista los números múltiples de 5. Por tanto cuando utiliza la función filter() tiene que enviar una función condicional, para esto, puede utilizar una función anónima lambda, como se muestra a continuación:

>>> numeros = [2, 5, 10, 23, 50, 33]
>>> filter(lambda numero: numero%5 == 0, numeros)
[5, 10, 50]

Así, en una sola línea ha definido y ejecutado el filtro utilizando una función condicional anónima y devolviendo una lista de números.

Filtrando objetos

Sin embargo, más allá de filtrar listas con valores simples, el verdadero potencial de la función filter() sale a relucir cuando usted necesita filtrar varios objetos de una lista.

Por ejemplo, dada una lista con varias personas, a usted le gustaría filtrar únicamente las cuales son menores de edad:

>>> class Persona:
...
...     def __init__(self, nombre, edad):
...         self.nombre = nombre
...         self.edad = edad
...
...     def __str__(self):
...         return "{} de {} años".format(self.nombre, self.edad)
...
>>> personas = [
...     Persona("Leonardo", 38),
...     Persona("Ana", 33),
...     Persona("Sabrina", 12),
...     Persona("Enrique", 3)
... ]
>>> menores = filter(lambda persona: persona.edad < 18, personas)
>>> for menor in menores:
print menor
Sabrina de 12 años
Enrique de 3 años

Este es un ejemplo sencillo, con el cual usted puede realizar filtrados con objetos, de forma amigable.

map()

La función map() toma una función y una lista y aplica esa función a cada elemento de esa lista, produciendo una nueva lista. Va a ver su definición de tipo y como se define.

Esta función trabaja de una forma muy similar a filter(), con la diferencia que en lugar de aplicar una condición a un elemento de una lista o secuencia, aplica una función sobre todos los elementos y como resultado se devuelve un lista de números doblado su valor:

>>> def doblar(numero):
return numero*2

>>> numeros = [2, 5, 10, 23, 50, 33]
>>> map(doblar, numeros)
[4, 10, 20, 46, 100, 66]

Usted puede simplificar el código anterior usando una función lambda para substituir la llamada de una función definida, como se muestra a continuación:

>>> map(lambda x: x*2, numeros)
[4, 10, 20, 46, 100, 66]

La función map() se utiliza mucho junto a expresiones lambda ya que permite evitar escribir bucles for.

Además se puede utilizar sobre más de un objeto iterable con la condición que tengan la misma longitud. Por ejemplo, si requiere multiplicar los números de dos listas:

>>> a = [1, 2, 3, 4, 5]
>>> b = [6, 7, 8, 9, 10]
>>> map(lambda x,y : x*y, a,b)
[6, 14, 24, 36, 50]

E incluso usted puede extender la funcionalidad a tres listas o más:

>>> a = [1, 2, 3, 4, 5]
>>> b = [6, 7, 8, 9, 10]
>>> c = [11, 12, 13, 14, 15]
>>> map(lambda x,y,z : x*y*z, a,b,c)
[66, 168, 312, 504, 750]

Mapeando objetos

Evidentemente, siempre que la función map() la utilice correctamente podrá mapear una serie de objetos sin ningún problema:

>>> class Persona:
...
...     def __init__(self, nombre, edad):
...         self.nombre = nombre
...         self.edad = edad
...
...     def __str__(self):
...         return "{} de {} años".format(self.nombre, self.edad)
...
>>> personas = [
...     Persona("Leonardo", 38),
...     Persona("Ana", 33),
...     Persona("Sabrina", 12),
...     Persona("Enrique", 3)
... ]
>>> def incrementar(p):
...     p.edad += 1
...     return p
...
>>> personas = map(incrementar, personas)
>>> for persona in personas:
...     print persona
...
Leonardo de 39 años
Ana de 34 años
Sabrina de 13 años
Enrique de 4 años

Claro que en este caso tiene que utilizar una función definida porque no necesitamos actuar sobre la instancia, a no ser que usted se tome la molestia de rehacer todo el objeto:

>>> class Persona:
...
...     def __init__(self, nombre, edad):
...         self.nombre = nombre
...         self.edad = edad
...
...     def __str__(self):
...         return "{} de {} años".format(self.nombre, self.edad)
...
>>> personas = [
...     Persona("Leonardo", 38),
...     Persona("Ana", 33),
...     Persona("Sabrina", 12),
...     Persona("Enrique", 3)
... ]
>>> def incrementar(p):
...     p.edad += 1
...     return p
...
>>> personas = map(lambda p: Persona(p.nombre, p.edad+1), personas)
>>> for persona in personas:
...     print persona
...
Leonardo de 39 años
Ana de 34 años
Sabrina de 13 años
Enrique de 4 años

lambda

La expresión lambda, es una función anónima que suelen ser usadas cuando necesita una función una sola vez. Normalmente usted crea funciones lambda con el único propósito de pasarlas a funciones de orden superior.

En muchos lenguajes, el uso de lambdas sobre funciones definidas causa problemas de rendimiento. No es el caso en Python.

>>> import os
>>> archivos = os.listdir(os.__file__.replace("/os.pyc", "/"))
>>> print filter(lambda x: x.startswith('os.'), archivos)
['os.pyc', 'os.py']

En el ejemplo anterior se usa el método os.__file__ para obtener la ruta donde esta instalada el módulo os en su sistema, ejecutando la siguiente sentencia:

>>> os.__file__
'/usr/lib/python2.7/os.pyc'

Si con el método os.__file__ obtiene la ruta del módulo os con el método replace("/os.pyc", "/") busca la cadena de carácter «/os.pyc» y la remplaza por la cadena de carácter «/»

>>> os.__file__.replace("/os.pyc", "/")
'/usr/lib/python2.7/'

Luego se define la variable archivos generando una lista de archivos usando la función os.listdir(), pasando el parámetro obtenido de la ruta donde se instalo el módulo os ejecutando en el comando previo, con la siguiente sentencia:

>>> archivos = os.listdir("/usr/lib/python2.7/")

De esta forma se define en la variable archivos un tipo lista con un tamaño de 433, como se puede comprobar a continuación:

>>> type(archivos)
<type 'list'>
>>> len(archivos)
443

Opcionalmente puede comprobar si la cadena de caracteres os.pyc se encuentras una de las posiciones de la lista archivos, ejecutando la siguiente sentencia:

>>> "os.pyc" in archivos
True

Ya al comprobar que existe la cadena de caracteres «os.pyc» se usa una función lambda como parámetro de la función filter() para filtrar todos los archivos del directorio «/usr/lib/python2.7/» por medio del función os.listdir() que inicien con la cadena de caracteres «os.» usando la función startswith().

>>> print filter(lambda x: x.startswith('os.'), os.listdir('/usr/lib/python2.7/'))
['os.pyc', 'os.py']

Así de esta forma se comprueba que existe el archivo compilado «os.pyc» de Python junto con el mismo módulo Python «os.py».

Funciones recursivas | Python

Funciones recursivas

Las funciones recursivas son funciones que se llaman a sí mismas durante su propia ejecución. Ellas funcionan de forma similar a las iteraciones, pero debe encargarse de planificar el momento en que dejan de llamarse a sí mismas o tendrá una función recursiva infinita.

Estas funciones se estilan utilizar para dividir una tarea en sub-tareas más simples de forma que sea más fácil abordar el problema y solucionarlo.

Función recursiva sin retorno

Un ejemplo de una función recursiva sin retorno, es el ejemplo de cuenta regresiva hasta cero a partir de un número:

>>> def cuenta_regresiva(numero):
...     numero -= 1
...     if numero > 0:
...         print numero
...         cuenta_regresiva(numero)
...     else:
...         print "Boooooooom!"
...     print "Fin de la función", numero
...
>>> cuenta_regresiva(5)
4
3
2
1
Boooooooom!
Fin de la función 0
Fin de la función 1
Fin de la función 2
Fin de la función 3
Fin de la función 4

Función recursiva con retorno

Un ejemplo de una función recursiva con retorno, es el ejemplo del calculo del factorial de un número corresponde al producto de todos los números desde 1 hasta el propio número. Es el ejemplo con retorno más utilizado para mostrar la utilidad de este tipo de funciones:

>>> def factorial(numero):
...     print "Valor inicial ->",numero
...     if numero > 1:
...         numero = numero * factorial(numero -1)
...     print "valor final ->",numero
...     return numero
...
>>> print factorial(5)
Valor inicial -> 5
Valor inicial -> 4
Valor inicial -> 3
Valor inicial -> 2
Valor inicial -> 1
valor final -> 1
valor final -> 2
valor final -> 6
valor final -> 24
valor final -> 120
120

Funciones avanzadas | Python

Funciones avanzadas

En Python hay varias funciones avanzadas que se describen a continuación:

Funciones de predicado

Las funciones de predicado no es más que una función la cual dice si algo es True o False, es decir, es una función que devuelve un tipo de datos booleano.

Funciones anónimas

Una función anónima, como su nombre indica es una función sin nombre. Es decir, es posible ejecutar una función sin referenciar un nombre, en Python puede ejecutar una función sin definirla con def.

De hecho son similares pero con una diferencia fundamental, el contenido de una función anónima debe ser una única expresión en lugar de un bloque de acciones.

Las funciones anónimas se implementan en Python con las funciones o expresiones lambda, esta es unas de las funcionalidades más potentes de Python, pero a la vez es la más confusas para los principiantes.

Más allá del sentido de función que usted tiene hasta el momento, con su nombre y sus acciones internas, una función en su sentido más trivial significa realizar algo sobre algo. Por tanto se podría decir que, mientras las funciones anónimas lambda sirven para realizar funciones simples, las funciones definidas con def sirven para manejar tareas más extensas.

Expresión lambda

Si deconstruye una función sencilla, puede llegar a una función lambda. Por ejemplo la siguiente función es para doblar un valor de un número:

>>> def doblar(numero):
...     resultado = numero*2
...     return resultado

>>> doblar(2)
4
>>> type(doblar)
<type 'function'>

Si el código fuente anterior se simplifica se verá, de la siguiente forma:

>>> def doblar(numero):
...     return numero*2

>>> doblar(2)
4
>>> type(doblar)
<type 'function'>

Usted puede todavía simplificar más, escribirlo todo en una sola línea, de la siguiente forma:

>>> def doblar(numero): return numero*2

>>> lambda numero: numero*2
<function <lambda> at 0x7f1023944e60>
>>> doblar(2)
4
>>> type(doblar)
<type 'function'>

Esta notación simple es la que una función lambda intenta replicar, observe, a continuación se va a convertir la función en una función anónima:

>>> lambda numero: numero*2
<function <lambda> at 0x7f1023944e60>

En este ejemplo tiene una función anónima con una entrada que recibe numero, y una salida que devuelve numero * 2.

Lo único que necesita hacer para utilizarla es guardarla en una variable y utilizarla tal como haría con una función normal:

>>> doblar = lambda numero: numero*2
>>> doblar(2)
4
>>> type(doblar)
<type 'function'>

Con la flexibilidad de Python usted puede implementar infinitas funciones simples. Usted puede encontrar más ejemplos de funciones anónimas usando lambda en la sección ejemplos de funciones avanzadas.

Usted puede explotar al máximo la función lambda utilizándola en conjunto con otras funciones como filter() y map().

Ejemplos de funciones avanzadas

A continuación, se presentan algunos ejemplos de su uso:

Función lambda – operaciones aritméticas

A continuación, se presenta un ejemplo para comprobar si un número es impar:

>>> impar = lambda numero: numero%2 != 0
>>> impar(5)
True

Función lambda – operaciones de cadena

A continuación, se presenta un ejemplo para darle la vuelta a una cadena rebanándola en sentido inverso:

>>> revertir = lambda cadena: cadena[::-1]
>>> revertir("Plone")
'enolP'
>>> revertir("enolP")
'Plone'

Función lambda – varios parámetros

A continuación, se presenta un ejemplo para varios parámetros, por ejemplo para sumar dos números:

>>> sumar = lambda x,y: x+y
>>> sumar(5,2)
7

Funciones | Python

Funciones

Una función es un bloque de código con un nombre asociado, que recibe cero o más argumentos como entrada, sigue una secuencia de sentencias, la cuales ejecuta una operación deseada y devuelve un valor y/o realiza una tarea, este bloque puede ser llamados cuando se necesite.

El uso de funciones es un componente muy importante del paradigma de la programación llamada estructurada, y tiene varias ventajas:

  • modularización: permite segmentar un programa complejo en una serie de partes o módulos más simples, facilitando así la programación y el depurado.
  • reutilización: permite reutilizar una misma función en distintos programas.

Python dispone de una serie de funciones integradas al lenguaje, y también permite crear funciones definidas por el usuario para ser usadas en su propios programas.

Sentencia def

La sentencia def es una definición de función usada para crear objetos funciones definidas por el usuario.

Una definición de función es una sentencia ejecutable. Su ejecución enlaza el nombre de la función en el namespace local actual a un objecto función (un envoltorio alrededor del código ejecutable para la función). Este objeto función contiene una referencia al namespace local global como el namespace global para ser usado cuando la función es llamada.

La definición de función no ejecuta el cuerpo de la función; esto es ejecutado solamente cuando la función es llamada.

La sintaxis para una definición de función en Python es:

def NOMBRE(LISTA_DE_PARAMETROS):
    """DOCSTRING_DE_FUNCION"""
    SENTENCIAS
    RETURN [EXPRESION]

A continuación se detallan el significado de pseudo código fuente anterior:

  • NOMBRE, es el nombre de la función.
  • LISTA_DE_PARAMETROS, es la lista de parámetros que puede recibir una función.
  • DOCSTRING_DE_FUNCION, es la cadena de caracteres usada para documentar la función.
  • SENTENCIAS, es el bloque de sentencias en código fuente Python que realizar cierta operación dada.
  • RETURN, es la sentencia return en código Python.
  • EXPRESION, es la expresión o variable que devuelve la sentencia return.

Un ejemplo simple de función esta seguidamente:

>>> def hola(arg):
...     """El docstring de la función"""
...     print "Hola", arg, "!"
...
>>> hola("Plone")
Hola Plone !

Advertencia

Los bloques de function deben estar indentado como otros bloques estructuras de control.

La palabra reservada def se usa para definir funciones. Debe seguirle el nombre de la función en el ejemplo anterior hola() y la lista de parámetros formales entre paréntesis. Las sentencias que forman el cuerpo de la función empiezan en la línea siguiente, y deben estar indentado.

La primer sentencia del cuerpo de la función puede ser opcionalmente una cadenas de caracteres literal; esta es la cadenas de caracteres de documentación de la función, o docstrings.

Hay herramientas que usan las docstrings para producir automáticamente documentación en línea o imprimible, o para permitirle al usuario que navegue el código en forma interactiva; es una buena práctica incluir docstrings en el código que uno escribe, por lo que se debe hacer un hábito de esto.

La ejecución de la función hola() muestra la impresión de un mensaje Hola Plone ! que se imprime por consola. Devolver el objeto por los valores de retorno opcionales.

La ejecución de una función introduce una nueva tabla de símbolos usada para las variables locales de la función. Más precisamente, todas las asignaciones de variables en la función almacenan el valor en la tabla de símbolos local; así mismo la referencia a variables primero mira la tabla de símbolos local, luego en la tabla de símbolos local de las funciones externas, luego la tabla de símbolos global, y finalmente la tabla de nombres predefinidos. Así, no se les puede asignar directamente un valor a las variables globales dentro de una función (a menos se las nombre en la sentencia global), aunque si pueden ser referenciadas.

Los parámetros reales (argumentos) de una función se introducen en la tabla de símbolos local de la función llamada cuando esta es ejecutada; así, los argumentos son pasados por valor (dónde el valor es siempre una referencia a un objeto, no el valor del objeto). Cuando una función llama a otra función, una nueva tabla de símbolos local es creada para esa llamada.

La definición de una función introduce el nombre de la función en la tabla de símbolos actual. El valor del nombre de la función tiene un tipo que es reconocido por el interprete como una función definida por el usuario. Este valor puede ser asignado a otro nombre que luego puede ser usado como una función. Esto sirve como un mecanismo general para renombrar.

Argumentos y parámetros

Al definir una función los valores los cuales se reciben se denominan parámetros, pero durante la llamada los valores que se envían se denominan argumentos.

Por posición

Cuando enviá argumentos a una función, estos se reciben por orden en los parámetros definidos. Se dice por tanto que son argumentos por posición:

>>> def resta(a, b):
...     return a - b
...
>>> resta(30, 10)
20

En el ejemplo anterior el argumento 30 es la posición 0 por consiguiente es el parámetro de la función a, seguidamente el argumento 10 es la posición 1 por consiguiente es el parámetro de la función b.

Por nombre

Sin embargo es posible evadir el orden de los parámetros si indica durante la llamada que valor tiene cada parámetro a partir de su nombre:

>>> def resta(a, b):
...     return a - b
...
>>> (b=30, a=10)
-20

Llamada sin argumentos

Al momento de llamar una función la cual tiene definidos unos parámetros, si no pasa los argumentos correctamente provocará una excepción TypeError:

>>> resta()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: resta() takes exactly 2 arguments (0 given)

Parámetros por defecto

Para solucionar la excepción TypeError ejecutada al momento de la llamada a una función sin argumentos, entonces usted puede asignar unos valores por defecto nulos a los parámetros, de esa forma puede hacer una comprobación antes de ejecutar el código de la función:

>>> def resta(a=None, b=None):
...     if a == None or b == None:
...         print "Error, debes enviar dos números a la función"
...         return
...     return a - b
...
>>> resta(30, 10)
20
>>> resta()
Error, debes enviar dos números a la función

Como puede ver el el código anterior, se indica el final de la función luego de la sentencia print, usando la sentencia return aunque no devuelva nada.

Argumentos indeterminados

En alguna ocasión usted no sabe previamente cuantos elementos necesita enviar a una función. En estos casos puede utilizar los parámetros indeterminados por posición y por nombre.

Por posición

Usted debe crear una lista dinámica de argumentos, es decir, un tipo tupla, definiendo el parámetro con un asterisco, para recibir los parámetros indeterminados por posición:

>>> def indeterminados_posicion(*args):
...     for arg in args:
...         print arg
...
>>> indeterminados_posicion(5,"Hola Plone",[1,2,3,4,5])
5
Hola Plone
[1, 2, 3, 4, 5]

Por nombre

Para recibir un número indeterminado de parámetros por nombre (clave-valor o en inglés keyword args), usted debe crear un diccionario dinámico de argumentos definiendo el parámetro con dos asteriscos:

>>> def indeterminados_nombre(**kwargs):
...     print kwargs
...
>>> indeterminados_nombre(n=5, c="Hola Plone", l=[1,2,3,4,5])
{'c': 'Hola Plone', 'l': [1, 2, 3, 4, 5], 'n': 5}

Al recibirse como un diccionario, puede iterarlo y mostrar la clave y valor de cada argumento:

>>> def indeterminados_nombre(**kwargs):
...     for kwarg in kwargs:
...         print kwarg, "=>", kwargs[kwarg]
...
>>> indeterminados_nombre(n=5, c="Hola Plone", l=[1,2,3,4,5])
c => Hola Plone
l => [1, 2, 3, 4, 5]
n => 5

Por posición y nombre

Si requiere aceptar ambos tipos de parámetros simultáneamente en una función, entonces debe crear ambas colecciones dinámicas. Primero los argumentos indeterminados por valor y luego los cuales son por clave y valor:

>>> def super_funcion(*args,**kwargs):
...     total = 0
...     for arg in args:
...         total += arg
...     print "sumatorio => ", total
...     for kwarg in kwargs:
...         print kwarg, "=>", kwargs[kwarg]
...
>>> super_funcion(50, -1, 1.56, 10, 20, 300, cms="Plone", edad=38)
sumatorio =>  380.56
edad => 38
cms => Plone

Los nombres args y kwargs no son obligatorios, pero se suelen utilizar por convención.

Muchos frameworks y librerías los utilizan por lo que es una buena practica llamarlos así.

Sentencia pass

Es una operación nula — cuando es ejecutada, nada sucede. Eso es útil como un contenedor cuando una sentencia es requerida sintácticamente, pero no necesita código que ser ejecutado, por ejemplo:

>>> # una función que no hace nada (aun)
... def consultar_nombre_genero(letra_genero): pass
...
>>> type(consultar_nombre_genero)
<type 'function'>
>>> consultar_nombre_genero("M")
>>>
>>> # una clase sin ningún método (aun)
... class Persona: pass
...
>>> macagua = Persona
>>> type(macagua)
<type 'classobj'>

Sentencia return

Las funciones pueden comunicarse con el exterior de las mismas, al proceso principal del programa usando la sentencia return. El proceso de comunicación con el exterior se hace devolviendo valores. A continuación, un ejemplo de función usando return:

def devuelve_fibonacci(n): 
    '''devuelve la sucesión Fibonacci hasta n'''
    resultado = []
    a, b = 0, 1
    while b < n:
        resultado.append(b)
        a, b = b, a + b
    return resultado

Esta función se llama de la siguiente forma:

>>> devuelve_fibonacci(10)
[1, 1, 2, 3, 5, 8]

Nota

Por defecto, las funciones retorna el valor None.

Retorno múltiple

Una característica interesante, es la posibilidad de devolver valores múltiples separados por comas:

>>> def prueba():
...     return "Plone CMS", 20, [1,2,3]
...
>>> prueba()
('Plone CMS', 20, [1, 2, 3])

En el código anterior los valores múltiples se tratan en conjunto como una tupla inmutable y se pueden reasignar a distintas variables:

>>> def prueba():
...     return "Plone CMS", 20, [1,2,3]
...
>>> prueba()
('Plone CMS', 20, [1, 2, 3])
>>> cadena, numero, lista = prueba()
>>> print cadena, type(cadena)
Plone CMS <type 'str'>
>>> print numero, type(numero)
20 <type 'int'>
>>> print lista, type(lista)
[1, 2, 3] <type 'list'>

En el código anterior puede observa como se asignar a distintas variables en base a los valores de la tupla inmutable.

Ejemplos de funciones

A continuación, se presentan algunos ejemplos de su uso:

Definición de funciones

A continuación, se presenta un ejemplo del uso de definir funciones:

def iva():
    '''función básica para el calculo del IVA'''
    iva = 12
    costo = int(input('¿Cual es el monto a calcular?: '))
    calculo = costo * iva / 100
    print ("El calculo de IVA es: " + str(calculo) + "\n")

Invocar funciones

A continuación, se presenta un ejemplo del uso de llamar funciones:

>>> iva()
¿Cual es el monto a calcular?: 300
36

Funciones con argumentos múltiple

A continuación, se presenta un ejemplo del uso de funciones con argumentos múltiple:

def suma(numero1, numero2):
    '''función la cual suma dos números'''
    print (numero1 + numero2)
    print ("\n")

Y se llama de la siguiente forma:

>>> suma(23, 74)
97

Programación estructurada | Python

Programación estructurada

La programación estructurada es un paradigma de programación basado en utilizar funciones o subrutinas, y únicamente tres estructuras de control:

  • secuencia: ejecución de una sentencia tras otra.
  • selección o condicional: ejecución de una sentencia o conjunto de sentencias, según el valor de una variable booleana.
  • iteración (ciclo o bucle): ejecución de una sentencia o conjunto de sentencias, mientras una variable booleana sea verdadera.

Este paradigma se fundamente en el teorema correspondiente, que establece que toda función computable puede ser implementada en un lenguaje de programación que combine sólo estas tres estructuras lógicas o de control.

La estructura de secuencia es la que se da naturalmente en el lenguaje, ya que por defecto las sentencias son ejecutadas en el orden en que aparecen escritas en el programa.

Para las estructuras condicionales o de selección, Python dispone de la sentencia if, que puede combinarse con sentencias elif y/o else.

Para los bucles o iteraciones existen las estructuras while y for.

Ventajas del paradigma

Entre las ventajas de la programación estructurada sobre el modelo anterior (hoy llamado despectivamente código espagueti), cabe citar las siguientes:

  • Los programas son más fáciles de entender, pueden ser leídos de forma secuencial y no hay necesidad de tener que rastrear saltos de líneas (GOTO) dentro de los bloques de código para intentar entender la lógica interna.
  • La estructura de los programas es clara, puesto que las sentencias están más ligadas o relacionadas entre sí.
  • Se optimiza el esfuerzo en las fases de pruebas y depuración. El seguimiento de los fallos o errores del programa (debugging), y con él su detección y corrección, se facilita enormemente.
  • Se reducen los costos de mantenimiento. Análogamente a la depuración, durante la fase de mantenimiento, modificar o extender los programas resulta más fácil.
  • Los programas son más sencillos y más rápidos de confeccionar.
  • Se incrementa el rendimiento de los programadores.

Iteradores | Python

Iteradores

Para entender los la filosofía de los Iteradores, busca la simplicidad de las operaciones, evitando la duplicación del esfuerzo, el cual es un derroche y busca reemplazar varios de los enfoques propios con una característica estándar, normalmente, deriva en hacer las cosas más legibles además de más interoperable.

Guido van Rossum — Añadiendo tipado estático opcional a Python (Adding Optional Static Typing to Python).

Un iterador es un objeto adherido al iterator protocol, básicamente esto significa que tiene una función next(), es decir, cuando se le llama, devuelve la siguiente elemento en la secuencia, cuando no queda nada para ser devuelto, lanza la excepción StopIteration y se causa el detener la iteración. Pero si se llama de forma explícita puede ver que, una vez que el iterador esté agotado, al llamarlo nuevamente verá que se lanza la excepción comentada anteriormente.

A continuación el uso de iteradores usando del método especial __iter__() incluido en el objeto integrado file:

>>> archivo = open('/etc/hostname')
>>> archivo
<open file '/etc/hostname', mode 'r' at 0x7fa44ba379c0>
>>> archivo.__iter__()
<open file '/etc/hostname', mode 'r' at 0x7fa44ba379c0>
>>> iter(archivo)
<open file '/etc/hostname', mode 'r' at 0x7fa44ba379c0>
>>> archivo is archivo.__iter__()
True
>>> linea = archivo.__iter__()
>>> linea.next()
'laptop\n'
>>> linea.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

En el ejemplo, el método especial __iter__(), hace lo mismo que la función integrada iter(archivo).

Iteradores y secuencias

Los iteradores se usan con los tipos de secuencias estándar. A continuación, se describen algunos ejemplos:

Iterar sobre la secuencia inmutable cadena de carácter

A continuación, un ejemplo del uso de los iteradores con la secuencia inmutable de tipo cadena de caracteres ASCII:

>>> frase = 'Hola Mundo'
>>> letra = iter(frase)
>>> letra.next()
'H'
>>> letra.next()
'o'
>>> letra.next()
'l'
>>> letra.next()
'a'
>>> letra.next()
' '
>>> letra.next()
'M'
>>> letra.next()
'u'
>>> letra.next()
'n'
>>> letra.next()
'd'
>>> letra.next()
'o'
>>> letra.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

En el ejemplo anterior, cuando se itera en la secuencia frase, al llegar al final mediante el iterador letra se llama a la excepción StopIteration y se causa el detener la iteración.

Iterar sobre la secuencia inmutable cadena Unicode

A continuación, un ejemplo del uso de los iteradores con la secuencia inmutable de tipo cadena de caracteres Unicode:

>>> frase = u'Jekechitü'
>>> letra = iter(frase)
>>> letra.next()
u'J'
>>> letra.next()
u'e'
>>> letra.next()
u'k'
>>> letra.next()
u'e'
>>> letra.next()
u'c'
>>> letra.next()
u'h'
>>> letra.next()
u'i'
>>> letra.next()
u't'
>>> letra.next()
u'\xfc'
>>> letra.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

En el ejemplo anterior, cuando se itera en la secuencia frase, al llegar al final mediante el iterador letra se llama a la excepción StopIteration y se causa el detener la iteración.

Iterar sobre la secuencia inmutable tupla

A continuación, un ejemplo del uso de los iteradores con la secuencia inmutable de tipo tupla:

>>> valores = ("Python", True, "Zope", 5)
>>> valores
('Python', True, "Zope", 5)
>>> valores.__iter__()
<tupleiterator object at 0x7fa44b9fa450>
>>> valor = valores.__iter__()
>>> valor.next()
'Python'
>>> valor.next()
True
>>> valor.next()
'Zope'
>>> valor.next()
5
>>> valor.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

En el ejemplo anterior, cuando se itera en la secuencia valores, al llegar al final mediante el iterador valor se llama a la excepción StopIteration y se causa el detener la iteración.

Iterar sobre la función inmutable xrange

A continuación, un ejemplo del uso de los iteradores con la secuencia inmutable con la función integrada xrange():

>>> lista = iter(xrange(5))
>>> lista
<rangeiterator object at 0x7fa44b9fb7b0>
>>> lista.next()
0
>>> lista.next()
1
>>> lista.next()
2
>>> lista.next()
3
>>> lista.next()
4
>>> lista.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

En el ejemplo anterior, cuando se itera en la secuencia lista, al llegar al final se llama a la excepción StopIteration y se causa el detener la iteración.

Iterar sobre la secuencia mutable lista

A continuación, un ejemplo del uso de los iteradores con la secuencia mutable de tipo lista:

>>> versiones_plone = [2.1, 2.5, 3.6, 4, 5, 6]
>>> iter(versiones_plone)
<listiterator object at 0x7fa44b9fa450>
>>> version = iter(versiones_plone)
>>> version
<listiterator object at 0x7fa44b9fa550>
>>> version.next()
2.1
>>> version.next()
2.5
>>> version.next()
3.6
>>> version.next()
4
>>> version.next()
5
>>> version.next()
6
>>> version.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

En el ejemplo anterior, cuando se itera en la secuencia versiones_plone, al llegar al final mediante el iterador version se llama a la excepción StopIteration y se causa el detener la iteración.

Usted puede devolver un objeto iterador en orden inverso sobre una secuencia mutable de tipo lista usando su función integrada __reversed__().

>>> versiones_plone = [2.1, 2.5, 3.6, 4, 5, 6]
>>> versiones_plone.__reversed__()
<listreverseiterator object at 0xb712ebec>
>>> version = versiones_plone.__reversed__()
>>> version.next()
6
>>> version.next()
5
>>> version.next()
4
>>> version.next()
3.6
>>> version.next()
2.5
>>> version.next()
2.1
>>> version.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

En el ejemplo anterior, cuando se itera en la secuencia versiones_plone, al llegar al final mediante el iterador version se llama a la excepción StopIteration y se causa el detener la iteración.

También puede acceder al uso del método especial __iter__() incluido en la secuencia mutable del tipo integrado lista:

>>> versiones_plone = [2.1, 2.5, 3.6, 4, 5, 6]
>>> versiones_plone.__iter__()
<listiterator object at 0x7fa44b9fa510>

Iterar sobre la función mutable range

A continuación, un ejemplo del uso de los iteradores con la secuencia mutable de la función integrada range():

>>> lista = iter(range(5))
>>> lista
<listiterator object at 0x7fa44b9fa490>
>>> lista.next()
0
>>> lista.next()
1
>>> lista.next()
2
>>> lista.next()
3
>>> lista.next()
4
>>> lista.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

En el ejemplo anterior, cuando se itera en la secuencia lista, al llegar al final se llama a la excepción StopIteration y se causa el detener la iteración.

Iteradores y conjuntos

Los iteradores se usan con los tipos de conjuntos estándar. A continuación, se describen algunos ejemplos:

Iterar sobre el conjunto mutable

A continuación, un ejemplo del uso de los iteradores con el conjunto mutable de tipo conjuntos:

>>> versiones_plone = set([2.1, 2.5, 3.6, 4, 5, 6, 4])
>>> version = iter(versiones_plone)
>>> version
<setiterator object at 0x7fac9c7c7a50>
>>> version.next()
2.5
>>> version.next()
4
>>> version.next()
5
>>> version.next()
6
>>> version.next()
2.1
>>> version.next()
3.6
>>> version.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

En el ejemplo anterior, cuando se itera en la secuencia versiones_plone, al llegar al final mediante el iterador version se llama a la excepción StopIteration y se causa el detener la iteración.

Iterar sobre el conjunto inmutable

A continuación, un ejemplo del uso de los iteradores con el conjunto inmutable de tipo conjuntos:

>>> versiones_plone = frozenset([6, 2.1, 2.5, 3.6, 4, 5, 4, 2.5])
>>> version = iter(versiones_plone)
>>> version
<setiterator object at 0x7fac9c7c7cd0>
>>> version.next()
2.5
>>> version.next()
4
>>> version.next()
5
>>> version.next()
6
>>> version.next()
2.1
>>> version.next()
3.6
>>> version.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

En el ejemplo anterior, cuando se itera en la secuencia versiones_plone, al llegar al final mediante el iterador version se llama a la excepción StopIteration y se causa el detener la iteración.

Iteradores y mapeos

Los iteradores se usan con los tipos de secuencias estándar. A continuación, se describen algunos ejemplos:

Iterar sobre las claves del diccionario

A continuación, un ejemplo del uso de los iteradores con la secuencia de mapeo, tipo diccionario, por defecto muestra la clave de la secuencia:

>>> versiones_plone = dict(python=2.7, zope=2.13, plone=5.1)
>>> paquete = iter(versiones_plone)
>>> paquete
<dictionary-keyiterator object at 0x7fa44b9e99f0>
>>> paquete.next()
'zope'
>>> paquete.next()
'python'
>>> paquete.next()
'plone'
>>> paquete.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

En el ejemplo anterior, cuando se itera en la secuencia versiones_plone, al llegar al final mediante el iterador paquete se llama a la excepción StopIteration y se causa el detener la iteración.

Iterar sobre los valores del diccionario

A continuación, un ejemplo del uso de los iteradores con la secuencia de mapeo, tipo diccionario para mostrar el valor de una clave usando el método integrado itervalues():

>>> versiones_plone = dict(python=2.7, zope=2.13, plone=5.1)
>>> version = iter(versiones_plone.itervalues())
>>> version
<dictionary-valueiterator object at 0x7fa44b9e9c00>
>>> version.next()
2.13
>>> version.next()
2.7
>>> version.next()
5.1
>>> version.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

En el ejemplo anterior, cuando se itera en la secuencia versiones_plone, al llegar al final mediante el iterador version se llama a la excepción StopIteration y se causa el detener la iteración.

Iterar sobre los elementos del diccionario

A continuación, un ejemplo del uso de los iteradores con la secuencia de mapeo, tipo diccionario para mostrar el par clave/valor usando el método integrado iteritems():

>>> versiones_plone = dict(python=2.7, zope=2.13, plone=5.1)
>>> paquete = iter(versiones_plone.iteritems())
>>> paquete
<dictionary-itemiterator object at 0x7fa44b9e9b50>
>>> paquete.next()
('zope', 2.13)
>>> paquete.next()
('python', 2.7)
>>> paquete.next()
('plone', 5.1)
>>> paquete.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

En el ejemplo anterior, cuando se itera en la secuencia versiones_plone, al llegar al final mediante el iterador paquete se llama a la excepción StopIteration y se causa el detener la iteración.

Bucle for | Python

Bucle for

La sentencia for en Python difiere un poco de lo que uno puede estar acostumbrado en lenguajes como C o Pascal. En lugar de siempre iterar sobre una progresión aritmética de números (como en Pascal) o darle al usuario la posibilidad de definir tanto el paso de la iteración como la condición de fin (como en C), la sentencia for de Python itera sobre los ítems de cualquier secuencia (una lista o una cadenas de caracteres), en el orden que aparecen en la secuencia.

Tipos de Bucle “for”

A continuación, se presentan algunos ejemplos del uso del bucle for:

Bucle “for” con Listas

A continuación, se presenta un ejemplo del uso del bucle for con tipos de estructuras de datos listas:

animales = ['gato', 'perro', 'serpiente']
for animal in animales:
    print ("El animal es: {0}, tamaño de palabra es: {1}".format(
        animal, len(animal)))

Bucle “for” con Listas y función “range”

A continuación, se presenta un ejemplo del uso del bucle for con tipos de estructuras de datos listas con la función range() y la función len():

oracion = 'Mary entiende muy bien Python'
frases = oracion.split() # convierte a una lista cada palabra
print ("La oración analizada es:", oracion, ".\n")
for palabra in range(len(frases)):
    print ("Palabra: {0}, en la frase su posición es: {1}".format(
        frases[palabra], palabra))

Si se necesita iterar sobre una secuencia de números. Genera una lista conteniendo progresiones aritméticos, por ejemplo, como se hace en el fragmento de código fuente anterior.

Bucle “for” con Tuplas

A continuación, se presenta un ejemplo del uso del bucle for con tipos de estructuras de datos Tuplas:

conexion_bd = "127.0.0.1","root","123456","nomina"
for parametro in conexion_bd:
    print (parametro)

El ejemplo anterior itera una tupla de parámetros.

Bucle “for” con Diccionarios

A continuación, se presenta un ejemplo del uso del bucle for con tipos de estructuras de datos diccionarios:

datos_basicos = {
    "nombres":"Leonardo Jose",
    "apellidos":"Caballero Garcia",
    "cedula":"26938401",
    "fecha_nacimiento":"03/12/1980",
    "lugar_nacimiento":"Maracaibo, Zulia, Venezuela",
    "nacionalidad":"Venezolana",
    "estado_civil":"Soltero"
}
clave = datos_basicos.keys()
valor = datos_basicos.values()
cantidad_datos = datos_basicos.items()

for clave, valor in cantidad_datos:
    print (clave + ": " + valor)

El ejemplo anterior itera un diccionario con datos básicos de una persona.

Bucle “for” con “else”

Al igual que la sentencia if y el bucle while, la estructura for también puede combinarse con una sentencia else.

El nombre de la sentencia else es equivocada, ya que el bloque else se ejecutará en todos los casos, es decir, cuando la expresión condicional del bucle for sea False, (a comparación de la sentencia if).

db_connection = "127.0.0.1","5432","root","nomina"
for parametro in db_connection:
    print (parametro)
else:
    print ("""El comando PostgreSQL es: 
$ psql -h {server} -p {port} -U {user} -d {db_name}""".format(
        server=db_connection[0], port=db_connection[1], 
        user=db_connection[2], db_name=db_connection[3]))

La sentencia else tiene la ventaja de mantener el mismo nombre y la misma sintaxis que en las demás estructuras de control.

Bucle while | Python

Bucle while

En Python tiene una palabra reservada llamada while que nos permite ejecutar ciclos, o bien secuencias periódicas que nos permiten ejecutar código múltiples veces.

El ciclo while nos permite realizar múltiples iteraciones basándonos en el resultado de una expresión lógica que puede tener como resultado un valor True o False.

Tipos de Bucle “while”

A continuación, se presentan algunos ejemplos del uso del bucle while:

Bucle “while” controlado por Conteo

A continuación, se presenta un ejemplo del uso del bucle while controlado por conteo:

suma, numero = 0, 1

while numero <= 10:
    suma = numero + suma
    numero = numero + 1
print ("La suma es " + str(suma))

En este ejemplo tiene un contador con un valor inicial de cero, cada iteración del while manipula esta variable de manera que incremente su valor en 1, por lo que después de su primera iteración el contador tendrá un valor de 1, luego 2, y así sucesivamente.

Eventualmente cuando el contador llegue a tener un valor de 10, la condición del ciclo numero <= 10 sera False, por lo que el ciclo terminará arrojando el siguiente resultado.

Bucle “while” controlado por Evento

A continuación, se presenta un ejemplo del uso del bucle while controlado por Evento:

promedio, total, contar = 0.0, 0, 0

print ("Introduzca la nota de un estudiante (-1 para salir): ")
grado = int(input())
while grado != -1:
    total = total + grado
    contar = contar + 1
    print ("Introduzca la nota de un estudiante (-1 para salir): ")
    grado = int(input())
promedio = total / contar
print ("Promedio de notas del grado escolar es: " + str(promedio))

En este casi el evento que se dispara cuando el usuario ingresa el valor -1, causando que el bucle while se interrumpo o no se inicie.

Bucle “while” con “else”

Al igual que la sentencia if, la estructura while también puede combinarse con una sentencia else).

El nombre de la sentencia else es equivocada, ya que el bloque else se ejecutará en todos los casos, es decir, cuando la expresión condicional del while sea False, (a comparación de la sentencia if).

promedio, total, contar = 0.0, 0, 0
mensaje = "Introduzca la nota de un estudiante (-1 para salir): "

grado = int(input(mensaje))
while grado != -1:
    total = total + grado
    contar += 1
    grado = int(input(mensaje))
else:
    promedio = total / contar
    print ("Promedio de notas del grado escolar: " + str(promedio))

La sentencia else tiene la ventaja de mantener el mismo nombre y la misma sintaxis que en las demás estructuras de control.

Sentencias utilitarias

A continuación, se presentan algunos ejemplos del uso de sentencias utilitarias usadas en el bucle while:

Sentencia break

A continuación, se presenta un ejemplo del uso del bucle while controlado la sentencia break:

variable = 10

while variable > 0:
    print ("Actual valor de variable:", variable)
    variable = variable -1
    if variable == 5:
        break

Adicionalmente existe una forma alternativa de interrumpir o cortar los ciclos utilizando la palabra reservada break.

Esta nos permite salir del ciclo incluso si la expresión evaluada en while (o en otro ciclo como for) permanece siendo True. Para comprender mejor use el mismo ejemplo anterior pero se interrumpe el ciclo usando la sentencia break.

Sentencia continue

A continuación, se presenta un ejemplo del uso del bucle while controlado la sentencia continue:

variable = 10

while variable > 0:              
   variable = variable -1
   if variable == 5:
      continue
   print ("Actual valor de variable:", variable)

La sentencia continue hace que pase de nuevo al principio del bucle aunque no se haya terminado de ejecutar el ciclo anterior.

Ejemplos

Sucesión de Fibonacci

Ejemplo de la Sucesión de Fibonacci con bucle while:

a, b = 0, 1
while b < 100:
    print (b,)
    a, b = b, a + b

Operadores lógicos | Python

Operadores lógicos

Estos son los distintos tipos de operadores con los que puede trabajar con valores booleanos, los llamados operadores lógicos o condicionales:

Operador and

El operador and evalúa si el valor del lado izquierdo y el lado derecho se cumple.

>>> True and False
False

Operador or

El operador or evalúa si el valor del lado izquierdo o el lado derecho se cumple.

>>> True or False
True

Operador not

El operador not devuelve el valor opuesto la valor booleano.

>>> not True
False

Si la expresión es True el valor devuelto es False, de lo contrario si la expresión es False el valor devuelto es True.

>>> not False
True

Ejemplos

A continuación, se presentan algunos ejemplos de su uso:

Definir variables usadas en los siguientes ejemplos:

a, b = 10, 20

Ejemplo de operador lógico and:

if (a and b):
   print ("Las variables 'a' y 'b' son VERDADERO.")
else:
   print ("O bien la variable 'a' no es VERDADERO " + \
   "o la variable 'b' no es VERDADERO.")

Ejemplo de operador lógico or:

if (a or b):
   print ("O bien la variable 'a' es VERDADERA " + \
   "o la variable 'b' es VERDADERA " + \
   "o ambas variables son VERDADERAS.")
else:
   print ("Ni la variable 'a' es VERDADERA ni " + \
   "la variable 'b' es VERDADERA.")

Ejemplo de operador lógico not:

if not(a and b):
   print ("Ni la variable 'a' NO es VERDADERA " + \
   "o la variable 'b' NO es VERDADERA.")
else:
   print ("Las variables 'a' y 'b' son VERDADERAS.")

Bloques de código y estructuras de control | Condificional IF | Python

Condicional if

La sentencia condicional if se usa para tomar decisiones, este evaluá básicamente una operación lógica, es decir una expresión que de como resultado True o False, y ejecuta la pieza de código siguiente siempre y cuando el resultado sea verdadero.

A continuación un de estructura condicional if/elif/else completo:

numero = int(input("\nIngresa un número entero, por favor: "))

if numero < 0:
    numero = 0
    print ('El número ingresado es negativo cambiado a cero.\n')
elif numero == 0:
    print ('El número ingresado es 0.\n')
elif numero == 1:
    print ('El número ingresado es 1.\n')
else:
    print ('El número ingresado es mayor que uno.\n')

En el ejemplo anterior usa dos funciones integradas en el interprete Python:

  • La función int() que convierte el valor ingresado a número entero.
  • La función raw_input() lee el valor ingresado por la entrada estándar.

El valor es ingresado en la variable numero comprobará en el sentencia condicional if, si la comprobación devuelve False intentará con el siguiente bloque condicional elif, si la comprobación devuelve False nuevamente intentará con el siguiente bloque condicional elif si de nuevo la comprobación devuelve False por ultimo intentará con el siguiente bloque condicional else la cual se ejecutara sin comprobación.

Sentencia if

La sentencia if EXPRESION, significa, Si se cumple la expresión condicional se ejecuta el bloque de sentencias seguidas.

Sentencia elif

La sentencia elif EXPRESION, significa, De lo contrario Si se cumple la expresión condicional se ejecuta el bloque de sentencias seguidas.

Sentencia else

La sentencia else, significa, De lo contrario se cumple sin evaluar ninguna expresión condicional y ejecuta el bloque de sentencias seguidas.

Operador is

El operador is, significa, que prueba identidad: ambos lados de la expresión condicional debe ser el mismo objecto:

>>> 1 is 1.
False
>>> a, b = 1, 1
>>> a is b
True

Operador in

El operador in, significa, para cualquier colección del valor del lado izquierdo contenga el valor del lado derecho:

>>> b = [1, 2, 3]
>>> 2 in b
True
>>> 5 in b
False

En el ejemplo anterior, si b es una lista, este prueba que 2 y 5 sean elementos de la lista b.

Operador not in

El operador not in, el contrario de operador in, devuelve True cuando un elemento no está en una secuencia.

>>> b = [1, 2, 3]
>>> 4 not in b
True
>>> 1 not in b
False

En el ejemplo anterior, si b es una lista, este prueba que 4 y 1 sean elementos de la lista b.

Expresiones condicional

Estos son los distintos tipos de expresiones condicionales:

Expresión if

La expresión de la sentencia if se evaluá a False cuando se cumple las siguientes expresiones están presente:

  • Cualquier numero igual a cero (0, 0.0, 0+0j).
  • Un contenedor vació (listatuplaconjuntodiccionario).
  • FalseNone.

De lo contrario evaluá a True cuando se cumple la siguiente expresión esta presente:

  • cualquier cosa de lo contrario.
if EXPRESION:
    pass

Expresión ==

Esta expresión usa el operador == para validar la misma.

Expresión is

Esta expresión usa el operador is para validar la misma.

Expresión in

Esta expresión usa el operador in para validar la misma.

Ejemplos

A continuación, se presenta un ejemplo del uso de condicionales if:

Definir variables usadas en los siguientes ejemplos:

dato1, dato2, dato3, dato4 = 21, 10, 5, 20;

Ejemplo de operador de comparación Igual:

if (dato1 == dato2):
    print ("'dato1' y 'dato2' son iguales.")
else:
    print ("'dato1' y 'dato2' no son iguales.")

Ejemplo de operador de comparación Distinto:

if (dato1 != dato2):
    print ("'dato1' y 'dato2' son distintas/diferentes.")
else:
    print ("'dato1' y 'dato2' no son distintas/diferentes.")

Ejemplo de operador de comparación Diferente:

if (dato1 != dato2):
    print ("'dato1' y 'dato2' son distintas/diferentes.")
else:
    print ("'dato1' y 'dato2' no son distintas/diferentes.")

Ejemplo de operador de comparación Menor que:

if (dato1 < dato2):
    print ("'dato1' es menor que 'dato2'.")
else:
    print ("'dato1' no es menor que 'dato2'.")

Ejemplo de operador de comparación Mayor que:

if (dato1 > dato2):
    print ("'dato1' es mayor que 'dato2'.")
else:
    print ("'dato1' no es mayor que 'dato2'.")

Ejemplo de operador de comparación Menor o igual que:

if (dato3 <= dato4):
    print ("'dato3' es menor o igual que 'dato4'.")
else:
    print ("'dato3' no es menor o igual que 'dato4'.")

Ejemplo de operador de comparación Mayor o igual que:

if (dato4 >= dato3):
    print ("'dato4' es mayor o igual que 'dato3'.")
else:
    print ("'dato4' no es mayor o igual que 'dato3'.")