<jupyter_start><jupyter_text>**Notas para contenedor de docker:** Comando de docker para ejecución de la nota de forma local:nota: cambiar `dir_montar` por la ruta de directorio que se desea mapear a `/datos` dentro del contenedor de docker.```dir_montar=aquí colocar la ruta al directorio a montar, por ejemplo: dir_montar=/Users/erick/midirectorio.```Ejecutar:```$docker run --rm -v $dir_montar:/datos --name jupyterlab_prope_r_kernel_tidyverse -p 8888:8888 -d palmoreck/jupyterlab_prope_r_kernel_tidyverse:3.0.16   ``` Ir a `localhost:8888` y escribir el password para jupyterlab: `<PASSWORD>`Detener el contenedor de docker:```docker stop jupyterlab_prope_r_kernel_tidyverse``` Documentación de la imagen de docker `palmoreck/jupyterlab_prope_r_kernel_tidyverse:3.0.16` en [liga](https://github.com/palmoreck/dockerfiles/tree/master/jupyterlab/prope_r_kernel_tidyverse). --- Para ejecución de la nota usar:[docker](https://www.docker.com/) (instalación de forma **local** con [Get docker](https://docs.docker.com/install/)) y ejecutar comandos que están al inicio de la nota de forma **local**. O bien dar click en alguno de los botones siguientes: [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/palmoreck/dockerfiles-for-binder/jupyterlab_prope_r_kernel_tidyerse?urlpath=lab/tree/Propedeutico/Python/clases/1_introduccion/1_informacion_general.ipynb) esta opción crea una máquina individual en un servidor de Google, clona el repositorio y permite la ejecución de los notebooks de jupyter. [![Run on Repl.it](https://repl.it/badge/github/palmoreck/dummy)](https://repl.it/languages/python3) esta opción no clona el repositorio, no ejecuta los notebooks de jupyter pero permite ejecución de instrucciones de *Python* de forma colaborativa con [repl.it](https://repl.it/). Al dar click se crearán nuevos ***repl*** debajo de sus users de ***repl.it***.  Información general  *Statements* En Computación un *statement* es una sección de código que representa una instrucción, comando o una acción. Como ejemplos en Computación están el *assignment* y *print statements* o los que se obtienen con el uso de operadores.  Valores, tipos y operadores aritméticos en los lenguajes de programación Los valores son unidades básicas de información. Pertenecen a diferentes tipos como un número, una cadena de caracteres, *aka string*, que un programa manipula.Un tipo es una categoría de valores. Pueden ser por ejemplo: *integers*, *float* o *str* para números enteros, números con punto flotante o cadenas de caracteres respectivamente.Los operadores son símbolos especiales que representan cómputos. Ejemplos están: suma, multiplicación, asignación.  Ejemplos de valores y tipos<jupyter_code>2 #es un número entero
type(2)
3.0 #es un número en punto flotante
type(3.0)
"Hola mundo!" #es una cadena de caracteres o string
type("Hola mundo!")
"2" #es un string, en Python3 no hacemos distinción con '2'
'2'
type("2")
type('2')<jupyter_output><empty_output><jupyter_text>Ejemplos de operadores<jupyter_code>7 + 1
-4 + 2
5*3
8/4
4**3
a = 5<jupyter_output><empty_output><jupyter_text>Lenguajes formales y naturales Los **lenguajes naturales** son los que hablamos las personas como el Español, Inglés, Francés, evolucionaron naturalmente y las personas les hemos dado orden para comunicarnos entre nosotros.Los **lenguajes formales** son lenguajes diseñados por las personas para aplicaciones específicas. Por ejemplo la notación que es utilizada en Matemáticas es un lenguaje formal para denotar relaciones entre números y símbolos. Los **lenguajes de programación** son lenguajes formales que han sido diseñados para expresar cómputos.Los lenguajes naturales y formales comparten características y difieren en otras. Ambos utilizan reglas de sintaxis que hacen referencia a unidades básicas (palabras y números, por ejemplo, nombradas ***tokens***) y a una estructura (forma de combinar las *tokens*). Los lenguajes formales, sin embargo, tienen la característica de tener reglas estrictas de sintaxis para escribir ***statements*** de forma correcta y estructurada. En los lenguajes naturales es más flexible esto último.En Matemáticas encontramos *statements* al escribir 3 + 3 = 6. Un *statement* con una sintaxis incorrecta en Mate es 3 + = 3 o 3 ? 3 = 1 o bien en Español "casa está lloviendo en mi" o "cas- está lloviendo en m" (aunque tales *statements* utilicen *tokens* o símbolos correctos). **En Computación un *statement* es una sección de código que representa un comando o una acción**. Como ejemplos en Computación están el ***assignment*** y ***print statements***. También los lenguajes naturales están llenos de ambiguedad y las personas usamos el contexto y otra información para entender los *statements*. Los lenguajes formales están diseñados para no tener ambiguedad.  ¿Qué es un programa? Una secuencia de instrucciones que especifican cómo realizar un cómputo. Podemos distinguir **instrucciones básicas** en todos los lenguajes de programación:* *input:* datos de entrada (p.ej. obtenidos del teclado, un archivo, internet u otro dispositivo).* *output:* datos de salida (p.ej. mostrar información en la pantalla, o guardarla en un archivo o enviarla por internet)* *math:* operaciones matemáticas (p.ej. suma, multiplicación).* *conditional execution:* revisión de condiciones y ejecución del código.* *repetition*: realización de una acción repetidamente.Un programa está construído por instrucciones que son similares a las anteriores (no importa lo complejo de este programa). **Programación:** piensen a la programación como el proceso de dividir una tarea grande o compleja en tareas más pequeñas hasta tener tareas lo suficientemente sencillas para realizarlas con alguna(s) de éstas instrucciones.Como ejemplo de las instrucciones básicas en los lenguajes de programación que revisaremos, Python y R, permiten el uso de operadores siendo los más simples los operadores aritméticos (*math*). También ambos lenguajes permiten imprimir en pantalla con funciones como `print` (*output*).  Ejemplo de programa Calcular el punto medio de dos valores proporcionados con valores de entrada en una celda de *jupyterlab*<jupyter_code>#valores: <- utilizamos el símbolo de hashtag para escribir una línea de comentario

7

3.1

#punto medio:

(7 + 3.1)/2<jupyter_output><empty_output><jupyter_text>Variables, expresiones, *assignment statement*, *print statement* En un lenguaje de programación manejamos variables. Una variable es un nombre que hace referencia a un valor.Un *assignment statement* crea una nueva variable y le da un valor. Un *print statement* imprime en pantalla.Una expresión es una combinación de valores, variables y operadores. Un valor y una variable son por sí mismas consideradas expresiones. **Los lenguajes de programación se apoyan de funciones u operadores para crear *statements*.** En *Python* utilizamos la función `print` y el operador de asignación `=` para *print statement* y *assignment statement* respectivamente.  Python3 y R podemos empezar a usarlos dando click en el botón siguiente Al dar click en el siguiente botón se crea un ambiente para escribir códigos con sintaxis de Python3 o R. El ambiente es de *jupyterlab* el cual corre un programa que nombramos **intérprete**. En programación escribimos en lenguajes que podemos leer y escribir y este intérprete realiza la traducción de tal escritura a lenguaje de máquina y también del lenguaje de máquina hacia lenguaje que podemos leer. [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/palmoreck/dockerfiles-for-binder/jupyterlab_prope_r_kernel_tidyerse?urlpath=lab/tree/Propedeutico/Python/clases/1_introduccion/2_core_python.ipynb)  Ejemplo: *print statement*<jupyter_code>print("Hola mundo!") #imprime en pantalla
print(4.0)
print("{:4d}".format(2))
print("{:0.4e}".format(2.141519182))
print("{:.1f}".format(1.87919))<jupyter_output>1.9<jupyter_text>En *jupyterlab* al sólo colocar en una nueva celda una sintaxis correcta del lenguaje el *default* es imprimir en pantalla:<jupyter_code>"Hola mundo!"<jupyter_output><empty_output><jupyter_text>Ejemplo: *assignment statement* Creamos una variable y le damos un valor:<jupyter_code>m = "Este mensaje es un string que almacenamos en la variable m, tal variable hace referencia a un valor de tipo string"
print(m)
n = 17 #variable que hace referencia a un valor tipo integer
n<jupyter_output><empty_output><jupyter_text>*Python* *Python* es un lenguaje [orientado a objetos](https://en.wikipedia.org/wiki/Object-oriented_programming) desarrollado a finales de los 80's como un *scripting language* y actualmente es utilizado en las ciencias de datos y millones de proyectos afines. Los programas de *Python* no se compilan en lenguaje de máquina y más bien son interpretados. Los lenguajes intérpretes (como *MATLAB* o *R*) tienen la ventaja que pueden ser probados y *debuggeados* rápidamente. Por esto, el desarrollo de software en *Python* resulta ser más rápido que sus equivalentes en *Fortran* o en *C*. Sin embargo, una desventaja de los lenguajes intérpretes es que no producen aplicaciones *stand alone* por lo que los programas hechos en *Python* sólo pueden ejecutarse en computadoras que tengan el intérprete de *Python* instalado. Otra desventaja es que la velocidad de los programas en *Python* es menor que los programas compilados, por ejemplo los compilados en *C*. Algunas ventajas que tiene *Python* sobre los lenguajes *mainstream* son las siguientes:* Es open source o de código abierto.* Disponible para la mayoría de sistemas operativos (GNU/Linux, Unix, Windows, Mac OS) y en varios de éstos se encuentra de inicio instalado.* Sencillo de instalar sus extensiones (paqueterías y librerías). El *core language* de *Python* es pequeño para mantener su simplicidad y se utilizan extensiones como paquetes y librerías para hacerlo más poderoso. Hay una notable influencia de *java* y *C++* y similitud con *MATLAB*.  Un ejemplo para ver la similitud entre *MATLAB* y *Python* es el siguiente. ```%Función en MATLABfunction result = myfunc(a,b)    n = length(a);    resultado = zeros(n,1);    for i = 1:n            result(i) = a(i) + b(i);    endend%Llamada a función myfunc:a=[1 2 3]b=[4 5 6]myfunc(a,b)ans =   5   7   9``` ---**Comentario**La documentación de *MATLAB* es mejor que la de *Python* principalmente pues este último es *open source* y la documentación depende de la comunidad de *developers* y *users* por lo que puede estar dispersa en distintos sitios. --- *Python* implementa los conceptos de lenguajes orientados a objetos como clases, herencia, métodos.  Clases, objetos, atributos e instancias. En los lenguajes de programación orientada a objetos como *Python* se hace uso de nombres como clases, objetos y atributos. Con los objetos y clases modelamos entidades de nuestro mundo. Por ejemplo el plano de una casa y una casa se pueden modelar con una clase y un objeto respectivamente. La clase para una casa contiene los detalles respecto a las ventanas, pisos y puertas. El objeto de la clase anterior es la casa misma ya construída.El nombre de atributo hace referencia a valores (referidos por variables) y métodos de un objeto. En el ejemplo de la casa del párrafo anterior, los atributos serían las ventanas, pisos y puertas del objeto casa.El nombre de instancia se utiliza para nombrar a los objetos creados a partir de una clase. Normalmente se le asigna una instancia a una variable vía un *assignment statement*.  Ejemplo de función para el programa anterior Podríamos crear una función con el *statement* `def` que reciba dos valores y devuelva el punto medio. La estructura general de una función en *Python* es: ```pythondef func(param1, param2): puede haber más parámetros    statements    return return_values``` Un parámetro puede ser cualquier objeto de *Python* incluyendo una función. ---**Observación**Es común utilizar el nombre de párametros y argumentos como sinónimos, sin embargo sí existe diferencia: el nombre parámetros se utiliza dentro de funciones y el nombre argumentos se utiliza en llamadas a funciones, esto es, los valores que se le pasan a la función.--- Para el cálculo del punto medio:<jupyter_code>def middle_point(p1, p2): #parámetros p1, p2
    return (p1+p2)/2
p1 = 7 
p2 = 3.1

middle_point(p1, p2) #argumentos p1, p2<jupyter_output><empty_output><jupyter_text>Paquetes **El *core language* de Python es pequeño para mantener su simplicidad y se utilizan extensiones como paquetes y librerías para hacerlo más poderoso.**<jupyter_code>#importamos el paquete de NumPy:
import numpy as np
#Función en Python:
def myfunc(a,b):
    n, = a.shape
    result = np.zeros(n)
    for i in range(0,n):
        result[i] = a[i] + b[i]
    return result
#Llamada a función myfunc:
a=np.array([1,2,3])
b=np.array([4,5,6])
result = myfunc(a,b)
print(result)<jupyter_output>[5. 7. 9.]
{'fraction_non_alphanumeric': 0.0759611650485437, 'fraction_numerical': 0.010485436893203883, 'mean_word_length': 5.3428571428571425, 'pattern_counts': {'":': 0, '<': 33, '<?xml version=': 0, '>': 32, 'https://': 11, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '8', 'dir': 'jupyter-structured-clean-dedup', 'id': '585255', 'license': 'Apache-2.0', 'n_tokens_mistral': 4267, 'n_tokens_neox': 4184, 'n_words': 1683, 'path': 'Python/clases/1_introduccion/1_informacion_general.ipynb', 'repo_name': 'CarlosJChV/Propedeutico', 'size': '12871'}