Preguntas de la entrevista sobre el diccionario de Python

Tiempo estimado de lectura: 6 minutos

En nuestro primer vídeo sobre las preguntas de la entrevista de python hablamos de algunas de las preguntas de alto nivel que te pueden hacer en una entrevista.

En este post, hablaremos de las preguntas de la entrevista sobre los diccionarios de python.

¿Qué son los diccionarios de Python y sus propiedades?

En primer lugar, son mutables, lo que significa que pueden cambiarse, siga leyendo para ver ejemplos.

De este modo, puede añadir o quitar pares clave-valor según le convenga.

Además, los nombres de las teclas pueden cambiarse.

Otra de las propiedades que hay que tener en cuenta es que distinguen entre mayúsculas y minúsculas, lo que significa que puede existir el mismo nombre de clave si está en diferentes mayúsculas.

¿Cómo se crea un diccionario vacío en Python?

Como se puede ver a continuación, el proceso es sencillo, sólo tienes que declarar una variable igual a dos llaves, y listo, ya estás en marcha.

Una alternativa es declarar una variable igual a dict(), y en una instancia, tienes un diccionario vacío.

El siguiente bloque de código debería ser un buen ejemplo de cómo hacerlo:

# How do you create an empty dictionary?
empty_dict1 = {}
empty_dict2 = dict()
print(empty_dict1)
print(empty_dict2)
print(type(empty_dict1))
print(type(empty_dict2))

Output:
{}
{}
<class 'dict'>
<class 'dict'>

¿Cómo se añaden valores a un diccionario de Python?

Si quieres añadir valores a tu diccionario de Python, hay varias formas posibles, el código de abajo, puede ayudarte a tener una mejor idea:

#How do add values to a python dictionary
empty_dict1 = {}
empty_dict2 = dict()

empty_dict1['Key1'] = '1'
empty_dict1['Key2'] = '2'
print(empty_dict1)

#Example1 - #Appending values to a python dictionary
empty_dict1.update({'key3': '3'})
print(empty_dict1)

#Example2 - Use an if statement
if "key4" not in empty_dict1:
    empty_dict1["key4"] = '4'
else:
    print("Key exists, so not added")
print(empty_dict1)

Output:
{'Key1': '1', 'Key2': '2'}
{'Key1': '1', 'Key2': '2', 'key3': '3'}
{'Key1': '1', 'Key2': '2', 'key3': '3', 'key4': '4'}

¿Cómo se ordena un diccionario de Python?

Una de las propiedades de los diccionarios es que no están ordenados, por lo que si es grande encontrar lo que necesitas puede llevar un poco de tiempo.

Por suerte, Python ha proporcionado la capacidad de ordenar de la siguiente manera:

#How to sort a python dictionary?
empty_dict1 = {}

empty_dict1['Key2'] = '2'
empty_dict1['Key1'] = '1'
empty_dict1['Key3'] = '3'
print("Your unsorted by key dictionary is:",empty_dict1)
print("Your sorted by key dictionary is:",dict(sorted(empty_dict1.items())))

#OR - use list comprehension
d = {a:b for a, b in enumerate(empty_dict1.values())}
print(d)
d["Key2"] = d.pop(0) #replaces 0 with Key2
d["Key1"] = d.pop(1) #replaces 1 with Key1
d["Key3"] = d.pop(2) #replaces 2 with Key3
print(d)
print(dict(sorted(d.items())))

Output:
Your unsorted by key dictionary is: {'Key2': '2', 'Key1': '1', 'Key3': '3'}
Your sorted by key dictionary is: {'Key1': '1', 'Key2': '2', 'Key3': '3'}
{0: '2', 1: '1', 2: '3'}
{'Key2': '2', 'Key1': '1', 'Key3': '3'}
{'Key1': '1', 'Key2': '2', 'Key3': '3'}

¿Cómo se elimina una clave de un diccionario de Python?

De vez en cuando, algunas llaves pueden dejar de ser necesarias. En este caso, tendrá que eliminarlas. Al hacerlo, también se elimina el valor asociado a la clave.

#How do you delete a key from a dictionary?
empty_dict1 = {}

empty_dict1['Key2'] = '2'
empty_dict1['Key1'] = '1'
empty_dict1['Key3'] = '3'
print(empty_dict1)

#1. Use the pop function
empty_dict1.pop('Key1')
print(empty_dict1)

#2. Use Del

del empty_dict1["Key2"]
print(empty_dict1)

#3. Use dict.clear()
empty_dict1.clear() # Removes everything from the dictionary.
print(empty_dict1)

Output:
{'Key2': '2', 'Key1': '1', 'Key3': '3'}
{'Key2': '2', 'Key3': '3'}
{'Key3': '3'}
{}

¿Cómo se elimina más de una clave de un diccionario de Python?

A veces puede ser necesario eliminar varias claves y sus valores. Utilizar el código anterior repetidamente puede no ser la forma más eficiente de conseguirlo.

Para ayudar a ello, Python ha proporcionado una serie de formas de conseguirlo, como se indica a continuación:

#How do you delete more than one key from a dictionary
#1. Create a list to lookup against
empty_dict1 = {}

empty_dict1['Key2'] = '2'
empty_dict1['Key1'] = '1'
empty_dict1['Key3'] = '3'
empty_dict1['Key4'] = '4'
empty_dict1['Key5'] = '5'
empty_dict1['Key6'] = '6'

print(empty_dict1)

dictionary_remove = ["Key5","Key6"] # Lookup list

#1. Use the pop method

for key in dictionary_remove:
  empty_dict1.pop(key)
print(empty_dict1)

#2 Use the del method
dictionary_remove = ["Key3","Key4"]
for key in dictionary_remove:
  del empty_dict1[key]
print(empty_dict1)

¿Cómo se cambia el nombre de una clave en un diccionario de Python?

Habrá situaciones en las que los nombres de las claves no sean los correctos, por lo que habrá que cambiarlos.

Hay que tener en cuenta que al cambiar los nombres de las claves, el nuevo nombre no debe existir ya.

A continuación se presentan algunos ejemplos que le mostrarán las diferentes maneras en que esto puede lograrse.

# How do you change the name of a key in a dictionary
#1. Create a new key , remove the old key, but keep the old key value

# create a dictionary
European_countries = {
    "Ireland": "Dublin",
    "France": "Paris",
    "UK": "London"
}
print(European_countries)
#1. rename key in dictionary
European_countries["United Kingdom"] = European_countries.pop("UK")
# display the dictionary
print(European_countries)

#2. Use zip to change the values

European_countries = {
    "Ireland": "Dublin",
    "France": "Paris",
    "United Kingdom": "London"
}

update_elements=['IRE','FR','UK']

new_dict=dict(zip(update_elements,list(European_countries.values())))

print(new_dict)

Output:
{'Ireland': 'Dublin', 'France': 'Paris', 'UK': 'London'}
{'Ireland': 'Dublin', 'France': 'Paris', 'United Kingdom': 'London'}
{'IRE': 'Dublin', 'FR': 'Paris', 'UK': 'London'}

¿Cómo se obtiene la clave y los valores mínimos y máximos en un diccionario de Python?

Por último, es posible que tenga un diccionario grande y necesite ver las fronteras o los límites de los valores que contiene.

En el siguiente código, algunos ejemplos de lo que puede hablar deberían ayudar a explicar sus conocimientos.

#How do you get the min and max keys and values in a dictionary?
dict_values = {"First": 1,"Second": 2,"Third": 3}

#1. Get the minimum value and its associated key
minimum = min(dict_values.values())
print("The minimum value is:",minimum)
minimum_key = min(dict_values.items())
print(minimum_key)

#2. Get the maximum value and its associated key
maximum = max(dict_values.values())
print("The maximum value is:",maximum)
maximum_key = max(dict_values.items())
print(maximum_key)

#3. Get the min and the max key
minimum = min(dict_values.keys())
print("The minimum key is:",minimum)

#2. Get the maximum value and its associated key
maximum = max(dict_values.keys())
print("The maximum key is:",maximum)

Output:
The minimum value is: 1
('First', 1)
The maximum value is: 3
('Third', 3)
The minimum key is: First
The maximum key is: Third

Preguntas de la entrevista sobre Python

Tiempo estimado de lectura: 4 minutos

Así que has conseguido una entrevista y has trabajado duro para mejorar tus conocimientos de Python . Habrá algunas preguntas sobre Python y los diferentes aspectos de este lenguaje de los que tendrás que ser capaz de hablar y que no se limitan a la codificación.

A continuación, analizamos algunos de los elementos clave que debe explicar con comodidad.

¿Cuáles son las principales características de Python?

En la siguiente captura de pantalla que aparecerá en nuestro vídeo, si te hacen esta pregunta te ayudarán a ser capaz de discutir.

A continuación, he señalado algunas de las principales ventajas de las que debería hablar.

Es genial, ya que es de código abierto y está bien soportado, siempre encontrarás una respuesta a tu pregunta en alguna parte.

Además, como es fácil de codificar y entender, la capacidad de mejorar rápidamente y ofrecer buenos programas es una gran ventaja.

Como hay muchas plataformas diferentes, se ha adaptado para que funcione fácilmente en cualquiera con poco esfuerzo. Esto es un gran impulso para poder utilizarlo en varios entornos de desarrollo sin necesidad de hacer demasiados ajustes.

Por último, algunos lenguajes necesitan que compiles la aplicación primero, Python no lo hace, simplemente se ejecuta.

¿Cuáles son las limitaciones de Python?

Aunque se habla mucho de Python, también hay que tener en cuenta algunas advertencias.

Una de las primeras cosas a discutir es que su velocidad puede inhibir el rendimiento de una aplicación. Si necesitas datos en tiempo real y utilizas Python, debes tener en cuenta que el rendimiento se verá inhibido por ello.

Hay escenarios en los que una aplicación está escrita en una versión antigua de código, y se quiere introducir una nueva funcionalidad, con una versión más nueva. Esto podría llevar a problemas de funcionamiento del código que existe actualmente, que necesita ser reescrito. Como resultado, puede ser necesario un tiempo de programación adicional para arreglar los problemas de compatibilidad encontrados.

Finalmente, como Python utiliza mucha memoria, necesitas tenerlo en un ordenador o servidor que pueda manejar las peticiones de memoria. Esto es especialmente importante cuando la aplicación se utiliza en tiempo real y necesita entregar la salida muy rápidamente a la interfaz de usuario.

¿Para qué sirve Python?

Como se detalla a continuación, hay muchos usos de Python, esta no es una lista exhaustiva puedo añadir.

Un tema común para algunos de los puntos que se mencionan a continuación es que Python puede procesar datos y proporcionar información que no se conoce y que puede ayudar a la toma de decisiones.

Por otra parte, también puede utilizarse como herramienta para automatizar y/o predecir el comportamiento de los sujetos a los que se refiere, que a veces puede no ser evidente, pero que ayuda a agilizar la realización de ciertas tareas repetitivas.

¿Cuáles son los tipos de datos que soporta Python?

Por último, a continuación se presenta una lista de los tipos de datos con los que debería estar familiarizado y ser capaz de discutir. Algunos de ellos se utilizan con frecuencia.

Estos provienen de la propia página web de tipos de datos de Python, por lo que es un buen punto de referencia si necesitas entender más o mejorar tus conocimientos.

ValueError: Las columnas deben tener la misma longitud que la clave

Tiempo estimado de lectura: 3 minutos

¿Estás buscando aprender python, y en el proceso te encuentras con este error y tratas de entender por qué ocurre?

En esencia, esto suele ocurrir cuando tienes más de un marco de datos y en el proceso de escribir tu programa estás intentando utilizar los marcos de datos y sus datos, pero hay un desajuste en el número de elementos en cada uno que el programa no puede procesar hasta que se arregle.

Una situación común en la que esto puede ocurrir es cuando se unen marcos de datos o se dividen los datos, lo que se demostrará a continuación.

Escenario 1 - Unir marcos de datos

Donde tenemos df1[['a']] = df2 estamos asignando los valores del lado izquierdo del signo de igualdad a lo que está a la derecha.

Cuando miramos el lado derecho tiene tres columnas, el lado izquierdo tiene una.

Como resultado, aparecerá el error "ValueError: Las columnas deben tener la misma longitud que la clave", como se indica a continuación.

import pandas as pd

list1 = [1,2,3]
list2 = [[4,5,6],[7,8,9]]

df1 = pd.DataFrame(list1,columns=['column1'])
df2 = pd.DataFrame(list2,columns=['column2','column3','column4'])

df1[['a']] = df2

El código anterior arroja el siguiente error:

El objetivo aquí es tener todas las columnas del lado derecho, al lado de las columnas del lado izquierdo de la siguiente manera:

Lo que hemos hecho es igualar ambos lados en cuanto al número de columnas a mostrar de df2
Esencialmente estamos tomando la columna de DF1, y luego trayendo las tres columnas de DF2.
La columna, columnab, columnac de abajo corresponden a las tres columnas de DF2, y almacenarán los datos de ellas.

La solución a este problema es: df1[['columna','columnb','columnc']] = df2

print (df1)

Escenario 2 - Dividir los datos

Puede haber una ocasión en la que tengas una lista en python, y necesites dividir los valores de esa lista en columnas separadas.

new_list1 = ['1 2 3']
df1_newlist = pd.DataFrame(new_list1,columns=['column1'])

En lo anterior, hemos creado una lista, con tres valores que forman parte de una cadena. Aquí lo que buscamos es crear una nueva columna con el siguiente código:

df1_newlist[["column1"]] = df1_newlist["column1"].str.split(" ", expand=True) #Splitting based on the space between the values.

print(df1_newlist)

Cuando ejecutamos lo anterior arroja el siguiente error de valor:

La razón por la que arroja el error es que la lógica tiene tres valores a repartir en tres columnas, pero sólo hemos definido una columna en df1_newlist[["columna1"]]

Para solucionar esto, ejecutamos el siguiente código:

df1_newlist[["column1","column2","column3"]] = df1_newlist["column1"].str.split(" ", expand=True) #Splitting based on the space between the values.

print(df1_newlist)

Esto devuelve la siguiente salida, ¡con el problema solucionado!

Cómo comprobar los caracteres no deseados utilizando bucles con Python

Tiempo estimado de lectura: 3 minutos

En este sitio web, hemos publicado sobre cómo eliminar caracteres no deseados de sus datos y Cómo eliminar caracteres de un archivo CSV importado, ambos le mostrarán diferentes enfoques.

En esta publicación del blog, vamos a abordar el proceso utilizando bucles dentro de una función. Esencialmente vamos a pasar una lista y luego vamos a hacer un bucle a través de las cadenas para comprobar los datos contra ella.

Paso 1 - Importar los datos y crear un marco de datos

El primer trabajo que debemos realizar es cargar los datos. Aquí creamos un diccionario con sus respectivos pares clave-valor.

Para preparar los datos que se van a procesar mediante la función del paso 2, los cargamos en un marco de datos.

import pandas as pd
#Create a dataset locally
data = {'Number':  ["00&00$000", '111$11111','2222€2222','3333333*33','444444444£','555/55555','666666@666666'],
        'Error' : ['0','0','0','0','0','0','0']}

#Create a dataframe and tell it where to get its values from
df = pd.DataFrame (data, columns = ['Number','Error'])

Paso 2 - Crear la función que comprueba los datos no válidos

Esta es la pieza principal de la lógica que da la salida. Como se puede ver hay una lista "L" que se alimenta a la función de ejecución.

Una cosa a tener en cuenta es que *l se pasa a la función, ya que hay más de un valor en la lista, de lo contrario el programa no se ejecutaría correctamente.

Para empezar creamos un marco de datos, que extrae mediante una expresión regular los caracteres que no queremos tener.

A continuación, tenemos que eliminar una columna que se genera con valores NAN, ya que no son necesarios.

A continuación, actualizamos la fama de los datos originales con los valores que hemos encontrado.

Por si acaso, si hay algún valor NAN en esta columna actualizada "Error", lo eliminamos en la siguiente línea.

El siguiente paso es el bucle que crea una nueva columna llamada "Fix". Esta columna contiene los valores que se rellenarán en el fix después de que se eliminen los datos que no queremos y se limpien los datos.

Los datos que no necesitamos están en str.replace.

#Function to loop through the dataset and see if any of the list values below are found and replace them
def run(*l):
    #This line extracts all the special characters into a new column
    #Using regular expressions it finds values that should not appear
    df2 = df['Number'].str.extract('(\D+|^(0)$)') # New dataframe to get extraction we need
    print(df2)
    df2 = df2.drop(1, axis=1) # Drops the column with NAN in it, not required

    df['Error'] = df2[0] # Updates original dataframe with values that need to be removed.
    #This line removes anything with a null value
    df.dropna(subset=['Error'], inplace=True)
    #This line reads in the list and assigns it a value i, to each element of the list.
    #Each i value assigned also assigns an index number to the list value.
    #The index value is then used to check whether the value associated with it is in the df['Number'] column 
    #and then replaces if found
    for i in l:
        df['Fix']= df['Number'].str.replace(i[0],"").str.replace(i[1],"").str.replace(i[2],"").str.replace(i[3],"") \
        .str.replace(i[4],"").str.replace(i[5],"").str.replace(i[6],"")
        print("Error list to check against")
        print(i[0])
        print(i[1])
        print(i[2])
        print(i[3])
        print(i[4])
        print(i[5])
        print(i[6])
    print(df)

#This is the list of errors you want to check for
l = ['$','*','€','&','£','/','@']

Paso 3 - Ejecutar el programa

Para ejecutar este programa, simplemente ejecutamos el siguiente código. Todo lo que hace es leer la lista "L" a la función "run" y entonces se produce la salida en el paso 4

run(l)

Paso 4 - Salida

Error list to check against
$
*
€
&
£
/
@
          Number Error           Fix
0      00&00$000     &       0000000
1      111$11111     $      11111111
2      2222€2222     €      22222222
3     3333333*33     *     333333333
4     444444444£     £     444444444
5      555/55555     /      55555555
6  666666@666666     @  666666666666

Process finished with exit code 0

Cómo crear múltiples archivos XML desde Excel con Python

Así que tienes un archivo de Excel que tiene cientos o quizás miles de registros, pero quieres convertirlo en un archivo XML , y tener cada fila como un archivo separado?

Esto se puede conseguir muy fácilmente utilizando Python, en tres sencillos pasos.

En primer lugar, ¿qué es XML?

XML significa "lenguaje de marcado extensible", y se utiliza mucho en sitios web, servicios web y cuando las empresas quieren transferir datos entre sí en un formato predefinido que sigue una norma reconocida.

Para saber más sobre qué es xml, siga el enlace. Una cosa a tener en cuenta es que puede hacer referencia a la industria de los servicios financieros, pero XML se utiliza ampliamente a través de múltiples industrias también, ya que ahora estamos digitalizando una gran cantidad de nuestros procesos, la transferencia de datos tiene que seguir un estándar que todo el mundo puede trabajar sin problemas.

Paso 1 - Veamos nuestros datos en bruto

A continuación se muestra un archivo de Excel con tres columnas y ocho filas. El objetivo es crear ocho archivos XML separados para cada fila.

datos en bruto para rellenar varios archivos de excel

Paso 2 - Importar los datos y crear un archivo XML maestro

A continuación está la lógica que utilicé en Cómo crear un archivo XML desde Excel usando Python, he adjuntado comentarios donde es necesario para explicar lo que hace cada línea.

El propósito en este punto es crear un archivo con todos los datos de Excel llamado output.xml. Luego usaremos esto para crear los archivos separados que necesitamos y luego lo borraremos.

Los siguientes pasos le llevarán a ello.

import pandas as pd
from lxml import etree as et
import os


# STEP 1 - This step creates a master XML file

raw_data = pd.read_excel(r'\Users\haugh\OneDrive\dataanalyticsireland\YOUTUBE\how_to_read_each_excel_row_into_a_separate_XML_file\excel_raw_data_city.xlsx')

root = et.Element('root')

for row in raw_data.iterrows(): #==> This is a loop that takes runs through each record and populates for each tag.
    root_tags = et.SubElement(root, 'ExportData') #=== > Root name
# These are the tag names for each row (SECTION 1)
    Column_heading_1 = et.SubElement(root_tags, 'City')
    Column_heading_2 = et.SubElement(root_tags, 'Area')
    Column_heading_3 = et.SubElement(root_tags, 'Population')


###These are the values that will be populated for each row above
# The values inside the [] are the raw file column headings.(SECTION 2)
    Column_heading_1.text = str(row[1]['City'])
    Column_heading_2.text = str(row[1]['Area'])
    Column_heading_3.text = str(row[1]['Population'])

# This Section outputs the data to an xml file
# Unless you tell it otherwise it saves it to the same folder as the script.
tree = et.ElementTree(root) #==> The variable tree is to hold all the values of "root"
et.indent(tree, space="\t", level=0) #===> This just formats in a way that the XML is readable
tree.write('output.xml', encoding="utf-8") #==> The data is saved to an XML file

Paso 3 - Recorrer cada fila y crear los archivos separados

En el siguiente código, abre el archivo output.xml y mediante el bucle busca todos los datos entre las etiquetas "ExportData".

Luego los copia y crea un nuevo archivo.

Una vez que uno ha terminado, pasa al siguiente conjunto de etiquetas y repite el proceso, hasta llegar al final del archivo output.xml.

master_file = et.iterparse('output.xml', events=('end', ))
index = 0
for i, j in master_file:
    if j.tag == 'ExportData':
        index += 1
        filename = format(str(index) + ".xml")
        with open(filename, 'wb') as f:
            f.write(et.tostring(j))

Paso 4 - Eliminar el archivo output.xml - puramente opcional

El objetivo aquí era crear archivos XML separados, basados en la entrada del archivo original de Excel.

También hemos creado un archivo adicional llamado output.xml para llegar al objetivo final.

Si no necesitamos este archivo, puede ser eliminado con el siguiente código, asegúrese de que está al final de su lógica.

La declaración de importación para os.unlink está en el segundo paso.

os.unlink(r'\Users\haugh\OneDrive\dataanalyticsireland\YOUTUBE\how_to_read_each_excel_row_into_a_separate_XML_file\output.xml')

Cómo arreglar el TypeError: tipo 'slice' no hachable

Tiempo estimado de lectura: 2 minutos

Así que tienes un diccionario de Python, y quieres recuperar datos de él e imprimirlos en una pantalla. Hay algunas características de Python que primero hay que entender:

  1. Son mutables
  2. También tienen la capacidad de crecer y encogerse según las necesidades.
  3. El acceso a los datos dentro del diccionario se realiza mediante claves.

El último punto es muy importante, ya que los diccionarios no tienen un valor de índice, y es por eso que se obtiene el TypeError que está aquí para resolver.

Así que vamos a recrear el problema

En el siguiente código tenemos un diccionario llamado "userdata", con sus pares clave-valor.

El bucle está tratando de recuperar el valor del índice 1 para todos los valores en dai_data.

Como puede verse, dai_data está intentando recuperar los tres últimos valores del índice dentro del diccionario.

Como se ha indicado anteriormente, la única forma de acceder a los valores del diccionario es a través de sus valores clave.

userdata = {
	  "name": "Data Analytics Ireland",
	  "Country": "Ireland",
	  "City": "Dublin",
	  "Age": "1000 years!",
}

dai_data = userdata[:3]

for i in dai_data:
	     print(i[1])

Output:
Traceback (most recent call last):
  File "", line 8, in <module>
    dai_data = userdata[:3]
TypeError: unhashable type: 'slice'

¿Cómo podemos solucionar este problema?

En primer lugar, se accede a los valores a través de la clave dentro del diccionario

En el siguiente diccionario los valores clave son: Nombre, País, Ciudad, Edad

userdata = {
	  "Name": "Data Analytics Ireland",
	  "Country": "Ireland",
	  "City": "Dublin",
	  "Age": "1000 years!",
}

print(userdata["Name"])
print(userdata["Country"])
print(userdata["City"])
print(userdata["Age"])

Output:
Data Analytics Ireland
Ireland
Dublin
1000 years!

Como resultado, ahora podemos acceder a los valores asociados a cada clave.

¿Sabías que puedes añadir una lista a uno de tus pares clave-valor?

En el ejemplo anterior, nos hemos centrado en un único valor, pero también podríamos hacer que una clave fuera igual a una lista.

userdata = {
	  "Name": ["Joe","Jim"],
	  "Country": "Ireland",
	  "City": ["Dublin","Cork","Limerick"],
	  "Age": "1000 years!"
}

print(userdata["Name"])
print(userdata["Country"])
print(userdata["City"])
print(userdata["Age"])

Output:
['Joe', 'Jim']
Ireland
['Dublin', 'Cork', 'Limerick']
1000 years!

Cómo ejecutar la validación de Python desde Javascript

Tiempo estimado de lectura: 6 minutos

Cada vez más, los desarrolladores de sitios web buscan combinar diferentes tecnologías de programación para poder utilizar funcionalidades que quizá no estén disponibles en el lenguaje de programación que utilizan actualmente.

En los posts anteriores cómo pasar variables de python a Javascript y cómo ejecutar python directamente desde javascript, hemos tocado el tema de cómo usar Python y Javascript indistintamente para pasar datos.

En esta entrada del blog, vamos a ver la validación de datos usando Python, con datos capturados por Javascript. El propósito aquí es permitir otra manera de validar los datos que no sea depender de javascript.

Validación en Python desde Javascript

Hay varias razones para ello:

  1. Es posible que desee utilizar Python para procesar los datos y proporcionar la salida.
  2. Los datos podrían ser pasados desde Python a una base de datos, es necesario realizar algunas comprobaciones antes de proceder.
  3. Python es su lenguaje principal, sólo utiliza Javascript para capturar los datos y pasarlos desde un sitio web.

Hay cuatro comprobaciones de validación

  1. Validación si existe un nombre de usuario.
  2. Validación si se ha introducido un número en un campo de nombre de usuario.
  3. Validación de una contraseña introducida.
  4. Una comprobación de validación para asegurarse de que una dirección de correo electrónico introducida tiene el formato correcto.

Tenemos dos archivos con el código requerido en ellos como sigue:

  1. app.py ===> Como esta aplicación está construida en Python Flask, este archivo contiene la lógica para abrir los archivos del sitio web, y contiene las comprobaciones de validación de Python .
  2. index.html ====> Este archivo contiene el HTML que crea las páginas, etiquetas y cuadros de entrada que aparecen en el navegador web. También incluye el Javascript que capturará los datos que se pasarán a Python para su validación.

Resumen del código - App.PY

A continuación, trataré de explicar lo que sucede de la siguiente manera:

La variable Regex se utiliza en la validación del correo electrónico para comprobar si el correo electrónico introducido es correcto.

def inputcheck ===> Esto sólo comprueba el nombre de usuario pasado y realiza algunas validaciones sobre él.

def inputvalidation ====> Esto también está comprobando el nombre de usuario pero mirando si sólo se introducen números, o si está vacío.

def passvalidation ====> En esta parte de la lógica, se comprueba si la contraseña está vacía, tiene menos de cinco caracteres, es sólo números.

def emailvalidation ====> Todo lo que hace es comprobar si los datos recibidos del Javascript están en el formato correcto de correo electrónico. Hace referencia a la variable regex anterior, que se utiliza para confirmar si el formato es correcto o no.

Dentro de cada una de las funciones, hay sentencias if que son el núcleo de las comprobaciones de validación utilizadas por Python.

Además, todos los menús emergentes utilizan ctypes, lo que le permite acceder a las bibliotecas de Windows que contienen cuadros de mensaje, personalizarlos y llamarlos dentro de su programa.

import json
import ctypes
import re
from flask import request,redirect,url_for

from flask import Flask, render_template

app = Flask(__name__)

regex = '^[a-z0-9]+[\._]?[a-z0-9]+[@]\w+[.]\w{2,3}$'

@app.route('/')
def index():
    return render_template('index.html')


@app.route('/inputcheck', methods=['GET','POST'])
def inputcheck():
    output = request.get_json()
    result = json.loads(output) #this converts the json output to a python dictionary
    username_list = ['joe','john']
    if result['username'] in username_list:
        MessageBox = ctypes.windll.user32.MessageBoxW(0, 'Username ' + result['username'] + ' ' + 'exists', "Username check", 0x00001000)
        return render_template('various.html')
    elif result['username'] == '':
        MessageBox = ctypes.windll.user32.MessageBoxW(None, 'You cannot enter an empty value', 'Username check', 0x00001000)
    else:
        MessageBox = ctypes.windll.user32.MessageBoxW(None, 'Username ' + result['username'] + ' ' + 'does not exist', 'Username check', 0x00001000)

@app.route('/inputvalidation', methods=['GET','POST'])
def inputvalidation():
    output = request.get_json()
    result = json.loads(output) #this converts the json output to a python dictionary
    if result['username'].isdecimal():
        MessageBox = ctypes.windll.user32.MessageBoxW(None, 'Your username cannot be numbers',"Number check", 0x00001000)
    elif result['username'] == '':
        MessageBox = ctypes.windll.user32.MessageBoxW(None, 'The username cannot be empty', "Number check",0x00001000)
    else:
        MessageBox = ctypes.windll.user32.MessageBoxW(None, 'Your username looks ok', "Number check", 0x00001000)
    return render_template('index.html')

@app.route('/passvalidation', methods=['GET','POST'])
def passvalidation():
    output = request.get_json()
    result = json.loads(output) #this converts the json output to a python dictionary
    if result['password'].isdecimal():
        MessageBox = ctypes.windll.user32.MessageBoxW(None, 'Your password cannot be numbers',"Password check", 0x00001000)
    elif result['password'] == '':
        MessageBox = ctypes.windll.user32.MessageBoxW(None, 'The password cannot be empty', "Password empty check",0x00001000)
    elif len(result['password']) < 5:
        MessageBox = ctypes.windll.user32.MessageBoxW(None, 'Your username should be greater than five characters', "Password length check", 0x00001000)
    else:
        MessageBox = ctypes.windll.user32.MessageBoxW(None, 'Your password looks ok', "Number check", 0x00001000)
    return render_template('index.html')

@app.route('/emailvalidation', methods=['GET','POST'])
def emailvalidation():
    output = request.get_json()
    result = json.loads(output) #this converts the json output to a python dictionary
    if re.search(regex, result['email']):
        MessageBox = ctypes.windll.user32.MessageBoxW(None, 'Your email is in the correct format', "Email check", 0x00001000)
    else:
        MessageBox = ctypes.windll.user32.MessageBoxW(None, 'Your email is invalid, please correct', "Email check", 0x00001000)
    return render_template('index.html')



if __name__ == "__main__":
    app.run(debug=True)


Resumen del código - Index.html

El siguiente código es el código de la página, que permite la captura de datos a través de una página HTML del navegador web.

Between the <style></style> tags these are the CSS properties that format the labels and buttons on the page.

Within the <div></div> tags are where we create the labels and buttons to show on the screen. Also within these, are the references to the on click event function that should run once the buttons are clicked.

Within the <script></script> tags, this is where the javascript is written which captures the data entered into the input boxes within the <div> tags.

Además, verás que dentro de este javascript, hay secciones llamadas $.ajax, que es donde se almacenan los datos capturados por el javascript , y luego se pasan al archivo de script de Python (app.py)

Observe que en cada ajax se hace referencia a url:"/APAGENAME". Estas son las secciones dentro del app.py a las que se pasan los datos, y luego la lógica de Python entra en acción y valida los datos.

<html lang="en">

<head>

    <title>Data Analytics Ireland</title></head>
<style>
.button1 {
    position: absolute;
    top: 50%;
    left: 55%;
    width: 900px;
    height: 300px;
    margin-left: -300px;
    margin-top: -80px;
}



.labels {
    position: absolute;
    top: 50%;
    left: 55%;
    width: 900px;
    height: 300px;
    margin-left: -300px;
    margin-top: -150px;
}

</style>

<body>



<div class="labels" id="mem1" >
<label  for="username">username:</label> <input type="text" id="username" name="username">
<label for="password">password:</label><input type="text" id="password" name="password">
    <label for="email">email:</label><input type="text" id="email" name="password">
</div>


<div class="button1" id="mem2" >
<button type="submit" onclick='myfunction();'>Click here to validate your username</button>
<button type="submit" onclick='myfunctionval();'>Click here to check if a number</button>
    <button type="submit" onclick='myfunctionpass();'>Click here to check password</button>
      <button type="submit" onclick='myfunctionemail();'>Click here to check your email</button>
</div>


<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script>

<script>
    function myfunction() {

        const username = document.getElementById("username").value;
        const password = document.getElementById("password").value;


        const dict_values = {username, password} //Pass the javascript variables to a dictionary.
        const s = JSON.stringify(dict_values); // Stringify converts a JavaScript object or value to JSON.
        console.log(s); // Prints the variables to console window, which are in the JSON format
        //window.alert(s)
        $.ajax({
            url:"/inputcheck",
            type:"POST",
            contentType: "application/json",
            data: JSON.stringify(s)});
}
</script>
<script>
    function myfunctionval() {

        const username = document.getElementById("username").value;
        const password = document.getElementById("password").value;


        const dict_values = {username, password} //Pass the javascript variables to a dictionary.
        const s = JSON.stringify(dict_values); // Stringify converts a JavaScript object or value to JSON.
        console.log(s); // Prints the variables to console window, which are in the JSON format
        //window.alert(s)
        $.ajax({
            url:"/inputvalidation",
            type:"POST",
            contentType: "application/json",
            data: JSON.stringify(s)});
}
</script>

<script>
    function myfunctionpass() {

        const username = document.getElementById("username").value;
        const password = document.getElementById("password").value;


        const dict_values = {username, password} //Pass the javascript variables to a dictionary.
        const s = JSON.stringify(dict_values); // Stringify converts a JavaScript object or value to JSON.
        console.log(s); // Prints the variables to console window, which are in the JSON format
        //window.alert(s)
        $.ajax({
            url:"/passvalidation",
            type:"POST",
            contentType: "application/json",
            data: JSON.stringify(s)});
}
</script>

<script>
    function myfunctionemail() {

        const email = document.getElementById("email").value;


        const dict_values = {email} //Pass the javascript variables to a dictionary.
        const s = JSON.stringify(dict_values); // Stringify converts a JavaScript object or value to JSON.
        console.log(s); // Prints the variables to console window, which are in the JSON format
        //window.alert(s)
        $.ajax({
            url:"/emailvalidation",
            type:"POST",
            contentType: "application/json",
            data: JSON.stringify(s)});
}
</script>




</body>
</html>

Cómo pasar variables de Python a Javascript

Tiempo estimado de lectura: 4 minutos

En nuestra reciente publicación en el blog Cómo pasar una variable de Javascript a Python usando JSON, demostramos cómo usar fácilmente AJAX para pasar cualquier dato que quieras y luego manipularlo con Python.

En esta publicación del blog, vamos a mostrar cómo hacer esto al revés. El escenario es que usted tiene una aplicación y o sitio web que quiere utilizar los datos generados a través de Python, pero dejar que Javascript luego utilizarlo dentro de la aplicación.

Como Python puede conectarse a numerosas bases de datos y archivos (txt, excel), etc., esta pieza de lógica es muy útil para el programador que busca integrar ambos lenguajes de programación.

Empecemos a ver el código, y veamos cómo se puede lograr esto.

Paso 1 - ¿Qué archivos se generan?

Este programa utiliza Python Flask para crear una página web, que tiene un menú desplegable. Los dos archivos utilizados para generar esto son los siguientes:

(A) app.py - Este es el archivo python que crea un sitio web y carga un archivo HTML de plantilla como se indica a continuación.

(B) Index.html - Este es el archivo de plantilla que se carga en el navegador y ejecuta todo el javascript. El javascript cargado aquí también carga los datos de python pasados desde app.py

Paso 2 - Resumen del código APP.PY

La biblioteca de Python que permite la creación de páginas web se llama Flask, y como se puede ver a continuación hay que importarla.

Además, tenemos que importar también render_template que indica al programa que vaya a la carpeta de plantillas y cargue "Index.HTML"

La variable que se pasa a JavaScript se llama nombre, y estos son los valores que se verán en el navegador web cuando se cargue.

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def index():
    name = ['Joe','John','Jim','Paul','Niall','Tom']
    return render_template('index.html', name=name)

if __name__ == "__main__":
    app.run(debug=True)

Paso 3 - Resumen de Index.HTML

Aquí está el archivo HTML de la plantilla que se ejecuta en el navegador. Puedes añadirle CSS, etc. para que tenga un aspecto más agradable y sea más fácil de usar.

Como puede ver, tiene las etiquetas HTML habituales que aparecen como parte de un sitio web.

Bueno, mira un poco más el código:

In this bit <select id =’select’> </select>, this is the dropdown menu that will appear when Index.html is opened. It will store all the values passed from python. Note that its id is “select”, this will be used later on.

The main parts to focus on next is between <script></script>. This is what reads in the python data and populates it to the dropdown menu.

En el paso 2 mencionamos que había una variable llamada "nombre", con valores a pasar.

Esto se consigue en esta línea:

var select = document.getElementById(“select”), test = {{ name | tojson }};

Observe que el nombre aparece aquí, y esto hace referencia al mismo valor que se discutió en el paso 2.

Para el resto de las líneas, he explicado con comentarios lo que hace cada una.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Pass Python variable to Javascript</title>
</head>
<body>

<select id ='selectvalue'>
</select>
<script>
    //name = ['Joe','John','Jim','Paul','Niall','Tom']

    var selectvalue = document.getElementById("selectvalue"), test = {{ name | tojson }};
    //The increment operator (++) increments (adds one to) its operand and returns a value.
    for(var i = 0; i < test.length; i++) // This line checks for the length of the data you feeding in i.e the no of items
         {
var selection = document.createElement("OPTION"), // This line creates a variable to store the different values fed in from the JSON object "TEST"
txt = document.createTextNode(test[i]); // This just reads each value from the test JSON variable above
selection.appendChild(txt); // This line appends each value as it is read.
selection.setAttribute("value",test[i]); // This line sets each value read in as a value for the drop down
selectvalue.insertBefore(selection,selectvalue.lastChild); //This reads eah value into the dropdown based on the order in the "TEST" above.
 }
</script>
</body>
</html>

Paso 4 - ¡Cómo es el resultado!

Desde el paso 2, estos son valores que pedimos que se usen en Javascript para rellenar un desplegable:

name = ['Joe','John','Jim','Paul','Niall','Tom']

Variable de Python pasada a Javascript

Cómo pasar varias listas a una función y compararlas

Tiempo estimado de lectura: 3 minutos

¿Alguna vez se ha enfrentado a una situación en la que tiene varias listas que quiere comparar y necesita una función que las lea y le muestre las diferencias entre todas ellas?

En este escenario, esto puede ser útil cuando se tienen grandes conjuntos de datos y se necesita una forma rápida de encontrar esas diferencias y arreglarlas cuando corresponda.

Comparación de dos listas

Veamos lo que ocurre a continuación.

En primer lugar, hemos definido dos listas. La única diferencia entre ambas es que una tiene un valor de seis y la otra no.

A continuación, tenemos la función "comparelists". Lo que hace es tomar las dos listas como parámetros (a,b), y luego procesarlas.

Las listas se pasan como argumentos a los parámetros en esta línea ===> comparelists(list1,list2)

Los parámetros a se asignan a la lista1, y b se asigna a la lista2.

La parte principal de la función es la comprensión de la lista, y hace lo siguiente:

  1. x para x es básicamente crear una variable x, e iniciar un bucle que recorra todos los valores de b.
  2. Cada iteración de x se almacena y se compara con a.
  3. "Si x no está en a" completa la comparación y si es verdadero devuelve el valor, en caso contrario pasa al siguiente valor.

Como resultado de esta lógica, se puede ver que seis es el único valor devuelto, y esto es lo que estamos esperando basado en una inspección visual.

#Reading in two lists
list1 = [1,2,3,4,5] # parameter a below
list2 = [1,2,3,4,5,6] # parameter b below

def comparelists(a,b):
    z = [x for x in b if x not in a] #list comprehension
    print(z)

comparelists(list1,list2)

Output:

[6]

Comparación de más de dos listas

En la lógica anterior, hemos visto que se pueden comparar dos listas. Pero, ¿qué pasa si quieres comparar una lista con otras dos listas?

Eso es fácil de hacer, con algunos ajustes en el código.

Como antes se definen las tres listas, creadas como argumentos en comparelists(list1,list2,list3), y luego se pasan a los parámetros de la función a,b,c.

La única diferencia en esta lógica es que la comprensión de la lista se escribe de forma un poco diferente como sigue:

  1. x for x es básicamente crear una variable x, e iniciar un bucle que recorra todos los valores de b. ====> Esto es lo mismo que lo anterior
  2. Cada iteración de x se almacena y se compara con a y c ===> Esta línea es diferente como comparar a dos listas ahora.
  3. "si x no está en a y x no está en c" ====> Aquí tenemos dos comparaciones
    • Comprobación del valor x de b en a
    • Comprobación del valor x de b en c
  4. El valor de seis es correcto ya que no está ni en a ni en c.
  5. Tenga en cuenta que la sentencia if es específica en cuanto a lo que se debe comprobar con la sentencia "y". Esto se puede cambiar para adaptarse a sus necesidades.
list1 = [1,2,3,4,5] # parameter a below
list2 = [1,2,3,4,5,6] # parameter b below
list3 = [1,2,3,7,8,9] # parameter c below

def comparelists(a,b,c):
    z = [x for x in b
         if x not in a and x not in c] #list comprehension
    print(z)

comparelists(list1,list2,list3)

Output:
[6]

Cómo utilizar los parámetros en Python

Tiempo estimado de lectura: 5 minutos

¿Estás usando una función y buscas pasarle valores para que los procese? Bueno, si este es el caso, estás tratando de pasar argumentos a los parámetros de esa función para que te devuelvan un valor.

Los parámetros son sólo valores que se asocian a la función. Para cada función, va a tener uno o más parámetros que espera procesar.

Por ello, hay varias formas de crearlas, exploremos cómo se puede conseguir.

Pasar argumentos directamente a los parámetros de una función

En muchos casos, los valores de los argumentos a procesar van a ser pasados a los parámetros de la función, que luego ejecuta alguna lógica y devuelve un valor.

Las formas típicas en que esto puede ocurrir:

  1. Se introduce una contraseña (el argumento introducido), la función confirma entonces si es válida o no.
  2. Es posible que necesite comprobar si un valor introducido (el argumento introducido) está por encima o por debajo de un determinado valor. Se pasa a un parámetro de la función y entonces la función hace las comprobaciones necesarias, y confirma el resultado en la salida.

Los anteriores son dos ejemplos, pero veamos esto en acción.

A continuación tenemos una función. El propósito es tomar dos argumentos que se le pasan y realizar un cálculo sobre ellos.

El cálculo ocurre en la variable número 1 o número 2.

La variable número 1 y la variable número 2 obtienen sus valores de los parámetros a y b respectivamente.

La línea multiplenumber(1,2) es sólo llamar a la función y pasar los argumentos a los parámetros a,b que luego los procesa y la salida se imprime.

def multiplenumber(a,b):
    number1 = a*2
    number2 = b*3
    print(number1,number2) #===> These values are different to the variables below as they happen as a result of the processing inside the function.

number1=1
number2=2
multiplenumber(number1,number2)
print(number1,number2) #===> These values are outside the function and do not have any relationship to the variables inside the function above, hence are different.

Result:
2 6
1 2

El resultado de la pieza lógica anterior se llama "pasar por valor", que esencialmente significa que los datos se pasan de las variables ( número 1 y número 2) a los parámetros de la función, pero cuando la función se termina de procesar, no impacta en las variables originales fuera de la función.

Esto se debe a que las variables originales son inmutables.

Pasar argumentos directamente a los parámetros de la función desde una lista

En el ejemplo anterior, tal y como se ha expuesto, no habrá ningún impacto en las variables que pasan los argumentos a la función, siguen siendo las mismas.

Por otro lado, si la fuente original de los argumentos es un objeto mutable, se modificarán sus valores.

Veamos una situación en la que esto puede ocurrir.

def addnumber(a):
    number=['3']
    a.append(number)
    print(a) #===> This prints the original value of a with the addition of the value 3

number1=[1,2]
addnumber(number1)
print(number1) #===> As number1 is passed to the function, and number1 is allowed to be changed then this will print out the new list value once the function has completed processing.

Result:
[1, 2, ['3']]
[1, 2, ['3']]

Así que en este caso, como number1 es una lista, y ésta es mutable, su valor cambiará una vez que la función complete su procesamiento.

Esto también puede llamarse "pasar por referencia".

Paso de argumentos entre funciones

En otro video, completamos llamado cómo pasar datos entre funciones esto discute cómo puede pasar los datos entre dos funciones e imprimirlos.

Efectivamente en lo que sigue los argumentos son nombre, país, ciudad, y estos valores se pasan a la funciónb

def funcióna():
    nombre = "José" 
    país = " Marte" 
    ciudad = " atlantis" 
    #esto captura las tres variables anteriores
    return nombre,país,ciudad
funcióna()

def funciónb():
    minombre,mipaís,miciudad = funcióna()
    print(minombre)
    print(mipaís)
    print(miciudad)

funciónb()

Resultado:
Joseph
Marte
atlantis

Pasar argumentos utilizando *args como parámetro

Para entender esto, antes de ver algo de código tenemos que entender qué son los *args?

*args esencialmente le permite pasar múltiples argumentos posicionales a una función, y esto puede variar con el tiempo.

Como resultado, no tienes que asignar los argumentos posicionales a más de una variable. Los *args toman todos los argumentos, sin importar lo largos o cortos que sean y luego devuelven un valor.

def addnumbers(*args):
    result = 2
    for x in args:
        result = result * x
    return result

print(addnumbers(1,2,3))

Result:
12

Pasar argumentos utilizando **kwargs como parámetro

A diferencia de lo anterior, esto procesará un conjunto de valores que tienen un nombre adjunto.

Como se puede ver en el ejemplo anterior, los argumentos pasados no tenían ningún nombre.

Veamos un ejemplo. En este escenario, a los argumentos se les asigna un valor de a,b,c.

def addnumbers(**kwargs):
    result = 2
    for x in kwargs.values():
        result = result * x
    return result

print(addnumbers(a=1,b=2,c=3))

Result:
12

Aquí está claro que la lógica toma cada valor de a,b,c lo procesa y luego devuelve el resultado requerido.

En esencia, tanto *args como **kwargs te dan la misma respuesta, sólo depende de otras partes de tu código y de cómo esté procesando tus datos.

Por ejemplo, en los **kwargs podría ser que los valores de a,b,c fueran rellenados por otras variables dentro del programa.

Así que en ese escenario, la variable que se ha pasado puede cambiar y no ser estática.

Así que en resumen:

a. Los argumentos pueden ser pasados de múltiples maneras a las funciones, los parámetros entonces sólo los procesan.

b. Los parámetros tampoco tienen que ser asignados a una variable, pueden ser leídos a través de *args.

c. Por otro lado, puedes tener varios argumentos leídos a la vez utilizando los **kwargs.