<jupyter_start><jupyter_text>1.2 Elementos básicos de Python====================En este notebook trabajaremos interactivamente para entender los conceptos básicos del lenguaje de programación PythonContenidos---------------------+ Trabajar con variables tipo _string_ y tipo numérico+ Funciones+ Tipos de listas+ _Loops_ e _if/else_+ Leer ficheros **A** es una variable tipo texto. Las variables de tipo texto se generan con texto entre comillas<jupyter_code>A = 'un texto muy largo'
type(A)<jupyter_output><empty_output><jupyter_text>En Python las variables son objectos. Y todos los objectos tienen metodos asociados,y son diferentes en funcion de que clase de objetos se trate.Por ejemplo, si estamos ante un objeto de tipo _string_ algo que podriamos esperar es pasar el texto a mayusculas.<jupyter_code>A.upper()<jupyter_output><empty_output><jupyter_text>Los metodos se aplican a la derecha, con un punto seguido del metodo.Algunos metodos exigen argumentos que se introducen entre las parentesis.Otros metodos, los sencillo, no requieren de argumentos, de ahi que las parentesis estén vacias. Las variables de tipo texto pueden substituirse mediante el simbolo %.En este caso, mediante %s, la s corresponde al tipo _string_.<jupyter_code>titulo = 'A es %s' % A.upper()<jupyter_output><empty_output><jupyter_text>Hemos creado la variable titulo a partir de substituir en un string (está entre comillas, y todo lo que estáentre comillas es un _string_) una variable tipo _string_ mediante el uso de % A parte de los metodos, existen las funciones.Las funcions en Python son muy parecidas a las tipicas funciones en matematicas, _x = f(x)_ Usaremos la funcion _print_ para que nos _'imprima'_ el contenido de la variable _titulo_<jupyter_code>print(titulo)<jupyter_output>A es UN TEXTO MUY LARGO<jupyter_text>Otro tipo muy utilizado de variables es la variable de tipo numerico.En este caso la denominaremos **x**, y le asignaremos un valor (numerico).<jupyter_code>x = 212
type(x)<jupyter_output><empty_output><jupyter_text>El tipo _int_ se corresponde con el tipo numero entero Si queremos comprobar que hemos asignado correctamente el valor, haremos uso de la funcion _print_<jupyter_code>print(x)<jupyter_output>212<jupyter_text>Como se puede comprobar, se puede imprimir tanto valores del tipo _string_ como del tipo _int_.El nombre _print_ es una herencia del pasado... Podemos crear una variable de tipo _string_ a partir de una variable numerica usando %<jupyter_code>titulo = 'x = %s' % (2*x)
print(titulo)<jupyter_output>x = 424<jupyter_text>Podemos crear una variable de tipo _string_ con informacion de ambas variables.<jupyter_code>titulo = 'A es %s y x = %s' % (A.upper(),x)
print (titulo)<jupyter_output>A es UN TEXTO MUY LARGO y x = 212<jupyter_text>Ejercicio : Crea una variable del tipo _string_ en la que se puede leer el valor y el _type_ de las A y x<jupyter_code>titulo = '' % ()<jupyter_output><empty_output><jupyter_text>FuncionesLas funciones en Python se definen precedidas por **def** y terminan por **return**<jupyter_code>def mifuncion():
    # Aqui viene descrita la funcion
    return<jupyter_output><empty_output><jupyter_text>La indentacion es una parte fundamental del lenguaje de programcion Python y sirve para organizar el codigo.En Python la indentacion es de 4 espacios **Nota** : La almohadilla  se utiliza para poder hacer comentarios en el codigo.Toda lo situado a la derecha de  no se ejecuta Las funciones admiten argumentos de entrada<jupyter_code>def mifuncion(y,z):
    # Aqui viene descrita la funcion
    return<jupyter_output><empty_output><jupyter_text>Y tambien admiten devolver algo cuando son ejecutadas<jupyter_code>def mifuncion(y,z):
    # Devolvemos el valor de multiplicar los dos argumentos
    return y*z<jupyter_output><empty_output><jupyter_text>Al ejecutar la funcion :<jupyter_code>mifuncion(2,9)<jupyter_output><empty_output><jupyter_text>Las funciones tienen su propio ecosistema. Las variables definidas dentro de la funcion solo existen dentro de la funcion, se dice que son 'locales'Si por ejemplo la variable 'y' se invoca fuera de la funcion, se producirá un error.<jupyter_code>y<jupyter_output><empty_output><jupyter_text>Las variables definidad fuera de las funciones se consideran globales. Aunque esa propiedad no las permite**por defecto** poder ser alteradas por la funcion<jupyter_code>y = mifuncion(3,9)
print(y)<jupyter_output>27<jupyter_text>En este caso y _global_ es 27, mientras que _y_ local, es 3 Existe un modo de poder alterar variables globales dentro de una funcion, pero no es recomendable.Puede llevar a resultados **catastroficos**. Las funciones pueden devolver más de un elemento.<jupyter_code>def miotrafuncion(x,y):
    multi = x*y
    suma = x+y
    return multi,suma
Para obtener el resultado de la multiplicacion y de la suma, es necesario definir ambas variables.<br>
multiplicacion , suma = miotrafuncion(3,5)<jupyter_output><empty_output><jupyter_text>AlmacenamientoEn Python existen varios tipos de elementos para almacenar variables.Los 2 más comunes son :+ list : Comunmente usado con listas de strings y números+ dictionary : Objetos multidimensionales que mezclan listas y arrays Empezaremos con la lista. En este caso esta compuesta por 3 _strings_<jupyter_code>lista = ['A','B','C']
print(lista)<jupyter_output>['A', 'B', 'C']<jupyter_text>En Python, las listas pueden estar compuestas practicamente de cualquier objeto...<jupyter_code>lista_b = [A,'B','C']<jupyter_output><empty_output><jupyter_text>Que diferencia hay entre lista y lista_b?<jupyter_code>print(lista_b)<jupyter_output>['un texto muy largo', 'B', 'C']<jupyter_text>A es una variable en lugar de un texto. Las comillas hacen la diferencia.Del mismo modo podemos usar x como variable o introducir un valor numerico en la lista.<jupyter_code>lista = [A,'B',x,'x',345]
print(lista)<jupyter_output>['un texto muy largo', 'B', 212, 'x', 345]<jupyter_text>**Nota** : En Jupyter se puede ver la diferencia por el distinto color que toman los objetos Ejercicio : hacer una funcion que devuelva la multiplicacion y suma almacenadas en una lista<jupyter_code>def mifuncion(x,y):
    return [x*y,x+y]
flista = mifuncion(4,0)
print(flista)<jupyter_output>[0, 4]<jupyter_text>Las listas estan compuestas de elementos ordenados, por lo tanto es posible poder acceder a estos tomando suposicion como refencia.El primer elemento corresponde a la posicion **CERO** (esto arbitrario y no es todos los lengaujes ocurre...aunque si en casi todos)<jupyter_code>lista[0]<jupyter_output><empty_output><jupyter_text>Y asi sucesivamente:<jupyter_code>print(lista[1])
print(lista[2])
print(lista[3])
print(lista[4])<jupyter_output>B
212
x
345<jupyter_text>Es posible acceder de modo inverso a los elementos.Y asi, la posicion (o _index_) final toma el valor -1.El valor anterior al ultimo toma el valor -2, y asi sucesivamente.<jupyter_code>print(lista[-1])
print(lista[-2])
print(lista[-3])
print(lista[-4])<jupyter_output>345
x
212
B<jupyter_text>Otro elemento muy utilizado es el _dictionary_. Se utiliza para almacenar valores numericos en varias dimensiones. Los diccionarios se definen por elementos denominados _keys_.Una vez definido el _key_ este puede contener todos y cada uno de los objetos que existen en Python.<jupyter_code>a = dict({'A':2 , 'B':[1,34,2], 'C':A})
print(a)<jupyter_output>{'A': 2, 'B': [1, 34, 2], 'C': 'un texto muy largo'}<jupyter_text>Para acceder a un elemento, se debe acudir a su _key_.<jupyter_code>a['C']<jupyter_output><empty_output><jupyter_text>A diferencia de las listas, los elementos de los diccionarios no estan ordenados, y por lo tanto no hay primer o ultimo elemento.Las _keys_ pueden ser del tipo entero o texto<jupyter_code>a = dict({'A':2 , 'B':[1,34,2], 'C':A, 3:5})
print(a)<jupyter_output>{'A': 2, 'B': [1, 34, 2], 'C': 'un texto muy largo', 3: 5}<jupyter_text>Como se puede apreciar, los diccionarios otorgan una gran flexibilidad<jupyter_code>a = dict({'A':2 , 'B':[1,34,2], 'C':A, 3:5, 'funcion':mifuncion(3,4)})
print(a)
a['funcion']<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.09173062639267145, 'fraction_numerical': 0.012131715771230503, 'mean_word_length': 6.258760107816712, 'pattern_counts': {'":': 0, '<': 101, '<?xml version=': 0, '>': 101, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '28', 'dir': 'jupyter-structured-clean-dedup', 'id': '655764', 'license': 'Apache-2.0', 'n_tokens_mistral': 2907, 'n_tokens_neox': 2837, 'n_words': 950, 'path': '1.2-Elementos_basicos.ipynb', 'repo_name': 'mlcordoba/curso_DA', 'size': '8078'}