Mostrando entradas con la etiqueta Python. Mostrar todas las entradas
Mostrando entradas con la etiqueta Python. Mostrar todas las entradas

Neurona en Python


Bueno este es programa puede ser usado para que aprenda las compuertas logicas or y and y otras cuantas cosillas que le indiquemos que sean linealmente separables dado que es una sola neurona.

se lleva a cabo de la siguiente manera:

1.-primero te pide la cantidad de entradas y el factor de aprendizaje que podria ser por ejemplo : 0.5

2.- despues se generan los pesos aleatoriamente.

3.- despues se pide que ingrese cada una de las entradas las cuales deben ser 1 o -1(0) y la salida deseada igual 1 o -1(0).

4.- despues se hace una sumatoria de la multiplicacion de cada entrada por cada peso, si el resultado de la sumatoria es mayor o igual a cero la salida correspodiente sera : 1 en caso de que sea menor a cero la salida sera: -1(0) .

5.- por ultimo se verifica que la salida obtenida sea igual a la salida deseada en caso contrario se vuelven a calcular los pesos y se vuleve a probar con las mismas entradas hasta que la salida obtenida sea igual a la salida deseada.

y es de esta forma como este programa puede ser capaz de aprender las compuertas logicas or y and.

Código: Python
  1.     import random
  2.      
  3.     class neurona(object):
  4.       def __init__(self,cantidadEntradas=0,factorAprendizaje=0):
  5.         self.factorAprendizaje=factorAprendizaje
  6.         self.cantidadEntradas=cantidadEntradas
  7.              
  8.       def inicializaPesos(self):
  9.         pesos=[]
  10.         for x in range(self.cantidadEntradas):
  11.           pesos.append(random.uniform(0,1))
  12.         pesos.append(random.uniform(0,1))
  13.         print "Pesos Iniciales:\n",pesos    
  14.         self.obtenerEntradas(pesos)
  15.        
  16.       def obtenerEntradas(self,pesos):
  17.         entradas=[]
  18.         salida=0
  19.        
  20.         while True:
  21.           opcion=raw_input("Desea continuar si o no: ")
  22.           if opcion=="no":
  23.             break
  24.           print "\nXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
  25.           for x in range(self.cantidadEntradas):            
  26.             entradas.append(int(raw_input("Ingrese la entrada: ")))
  27.           entradas.append(-1)
  28.           salidaDeseada=int(raw_input("Ingresa la salida deseada: "))
  29.           sumatoria = self.funcionActivacion(entradas,pesos)
  30.           if sumatoria>=0:
  31.             salida=1
  32.           elif sumatoria<0:
  33.             salida=-1
  34.           if salidaDeseada-salida!=0:
  35.             print "Salida Obtenida: ",salida
  36.             print "Pesos Nuevos:\n"
  37.             for i,x in enumerate(pesos):
  38.               pesos[i]=pesos[i] +  (2.0 * self.factorAprendizaje) * (salidaDeseada * entradas[i])
  39.             print pesos
  40.             self.obtenerEntradas(pesos)
  41.           else:
  42.             print "Salida Obtenida: ",salida
  43.             entradas=[]
  44.          
  45.       def funcionActivacion(self,entradas,pesos):
  46.         sumatoria=0
  47.         for i,entrada in enumerate(entradas):
  48.           sumatoria=sumatoria+(entradas[i]*pesos[i])
  49.         return sumatoria
  50.        
  51.     def main():
  52.       factorAprendizaje=raw_input("Ingresa el factor de aprendizaje: ")
  53.       cantidadEntradas=raw_input("Cuantas seran las entradas: ")
  54.       neurona1=neurona(int(cantidadEntradas),float(factorAprendizaje))
  55.       pesos=neurona1.inicializaPesos()
  56.          
  57.     main()

Autor: Marco Samperio

Coleccion de herramientas de hacking hechas en Python

En la página de Dirk Loss podemos encontrar un gran recopilatorio de herramientas escritas en Python para penetration testers, algunas de ellas sólo enlaces a librerías C existentes, es decir, herramientas que hacen las librerías fácilmente utilizables desde programas de Python.

Red


  • Dirtbags py-pcap: lee ficheros pcap sin libpcap
  • dpkt: rápida y simple creación de paquetes y análisis, con las definiciones básicas de los protocolos TCP/IP 
  • flowgrep: grep a través de payloads de paquetes utilizando expresiones regulares
  • glastopf: honeypot que se basa en un pequeño servidor web que emula cientos de vulnerabilidades.
  • Impacket: modifica y decodifica paquetes de red. Incluye soporte para los protocolos de más alto nivel, tales como NMB y SMB
  • Knock Subdomain Scan:  enumera los subdominios de un dominio de destino a través de una lista de palabras
  • LANs.py: herramienta capaz de falsificar y envenenar la tabla de ARP de un objetivo individual. Es multihilo y asíncrono.
  • libdnet: rutinas de red de bajo nivel, incluyendo la interfaz de búsqueda y transmisión de tramas Ethernet
  • Mallory: proxy man-in-the-middle extensible TCP/UDP, soporta la modificación de protocolos no estandar al vuelo
  • pypcap, Pcapy y pylibpcap: varios enlaces Python para libpcap
  • Pytbull: framework de pruebas de IDS/IPS muy flexible (incluye más de 300 tests)
  • pynids: wrapper de libnids que incluye sniffing, IP defragmentation, reensamblado de streams TCP y detección de escaneos de puertos
  • Scapy: envia, rastrea y analiza y crea paquetes de red. Se puede usar de forma interactiva o como una librería

 

Depuración e ingeniería inversa


  • Androguard: ingeniería inversa y análisis de aplicaciones de Android
  • apk-jet: un wrap de apktool en python para automatizar y hacer más fácil la ingeniería inversa de apks 
  • AsmJit: sencillo wrapper en Python para AsmJit usando SWIG. AsmJit posee clases de generación de código de alto nivel que pueden utilizarse para crear código JIT
  • BeaEnginePython: bindings de BeaEngine en Python de Mario Vilas. 
  • Binwalk: es una herramienta de análisis firmware diseñada para ayudar en el análisis, la extracción y la ingeniería inversa de imágenes del firmware y otros blobs binarios. Es fácil de utilizar, completamente programable y se puede extender fácilmente a través de firmas personalizadas, reglas de extracción y módulos de plugin.
  • bochs-python-instrumentation: Este parche para Bochs proporciona un intérprete de Python en lugar del propio depurador Bochs, proporcionando la funcionalidad del depurador. También permite interactuar con la interfaz de instrumentación bajo demanda, al asociar dinámicamente métodos de Python para manejar eventos de instrumentación.
  • Buggery: wrapper python para DbgEng. 
  • ctypes: módulo de Python que permite crear y manipular tipos de datos de C en Python. Estos luego pueden pasar a funciones C cargadas desde librerías de vínculos dinámicos.
  • Cuckoo: sistema sandbox de análisis de malware automatizado. Tiene un API para personalizar tanto el procesamiento como las etapas de presentación de informes. 
  • Darm: Un ligero y eficiente desensamblador escrito en C para el conjunto de instrucciones ARMv7
  • Deviare: es una API para hooks diseñada para crear productos de usuario final
  • Diabind: Python binding de DIA (Debug Interface Access) SDK
  • Dislib: Librería python para leer ficheros PE+
  • diStorm:  biblioteca de desensamblador para AMD64, bajo licencia BSD
  • IDAPython: plugin de IDA Pro que integra Python, permitiendo ejecutar scripts en IDA Pro
  • Immunity Debugger: GUI programable y debugger en linea de comandos
  • Paimei: framework de ingeniería inversa, incluye PyDBG, PIDA, pGRAPH
  • pefile: permite leer y trabajar con archivos Portable Executable (PE) 
  • pydasm: interfaz en Python para la librería libdasm de desensamblado x86
  • PyDbgEng: wrapper en Python para el motor de depuración de Microsoft Windows 
  • PyEMU: emulador IA-32 completamente programable, útil para análisis de malware
  • python-ptrace:depurador usando ptrace (Linux, BSD y Darwin system call para trazar procesos) escrito en Python
  • mona.py: PyCommand para Immunity Debugger que reemplaza y mejora pvefindaddr
  • uhooker: intercepta llamadas a llamadas a la API dentro de DLLs , así como las direcciones arbitrarias en el archivo ejecutable en la memoria
  • vdb / vtrace: API de depuración de procesos multi-plataforma implementado en python, y vdb es un depurador que lo utiliza

 

Fuzzing


  • antiparser: fuzz testing y API de inyección de fallos
  • Construct: librería para parsear y construir estructuras de datos (binario o texto).  
  • Forensic Fuzzing Tools: genera ficheros fuzzeados, sistemas de ficheros, y sistemas de ficheros con ficheros fuzzeados para probar la robustez de herramientas forenses y sistemas de análisis 
  • Fusil: librería en Python usada para escribir programas de fuzzing 
  • fuzzer.py (feliam): fuzzer sencillo de Felipe Andres Manzano 
  • Fuzzbox: multi-codec media fuzzer
  • Mistress: genera formatos de archivos al vuelo y protocolos con datos malformados, basados en patrones predefinidos
  • Peach Fuzzing Platform: framework de fuzzing extensible para la generación y la mutación basada en fuzzing (la v2 fue escrita en Python)
  • Powerfuzzer: fuzzer web altamente automatizado y totalmente personalizable (protocolo HTTP basado en fuzzer de aplicación)
  • SMUDGE 
  • Sulley: framework de desarrollo fuzzer y pruebas que consiste en varios componentes extensibles
  • TAOF: (el Arte del Fuzzing) incluye ProxyFuzz, un fuzzer man-in -the-middle de red no determinista
  • untidy: fuzzer XML de propósito general
  • Windows IPC Fuzzing Tools: herramientas para fuzzear aplicaciones que usan mecanimos Windows Interprocess Communication
  • WSBang: ejecuta pruebas automáticas contra servicios web SOAP

 

Web


  • FunkLoad: medidor de carga web funcional
  • Ghost.py: cliente webkit escrito en Python 
  • HTTPie: cliente http similar a cURL pero más intuitivo. 
  • mitmproxy: proxy HTTP de interceptación con soporte SSL. Permite inspeccionar y editar tráfico al vuelo. 
  • Requests: librería HTTP sencilla y elegante, hecha para seres humanos
  • Twill: navega por Internet mediante un interface en línea de comandos. Soporta web testing automatizado
  • pathod / pathoc: demonio/cliente para saturar clientes y servidores HTTP
  • ProxMon: procesa logs de proxy y crea informes con los resultados
  • python-spidermonkey: binding para el motor JavaScript de Mozilla SpiderMonkey; permite llamar y evaluar scripts y funciones Javascript
  • Selenium: API para escribir pruebas funcionales usando el WebDriver Selenium para acceso a Firefox, Ie, Chrome, Remote etc. 
  • Splinter: herramienta para testear aplicaciones web usando Python que permite automatizar acciones del navegador como visitar URLs e interactuar con sus objetos.
  • spynner: módulo de navegación web programable para Python con soporte Javascript/AJAX
  • WSMap: encuentra servicios web y descubre ficheros
  • Windmill: herramienta de pruebas creada para automatizar y depurar aplicaciones web

Cracking

  • findmyhash:  script en Python para crackear hashes usando servicios online.


Malware


  • pyew: una herramienta desde la línea de comandos para analizar malware de forma estática.
  • Noriben: script que funciona en conjunción con Procmon de Sysinternals para analizar malware en sandbox.
  • s7-brute-offline.py: herramienta que que puede realizar ataques off-line de fuerza bruta contra controladores lógicos programables (PLCs) Siemens.
  • The Backdoor Factory: un interesante script en Python para "backdoorizar" ejecutables y librerías de Windows (Win32 PE).
  • Tiny SHell: el clásico backdoor de código abierto en Python de Christophe Devine
  • TinySHell bajo SCTP: un backdoor de Unix un poquito más indetectable 
  • Veil: herramienta escrita en Python por Christopher Truncer para crear payloads de Metasploit capaces de evadir la mayoría de los antivirus.
  • virustotal-search.py: script para automatizar desde la línea de comandos el análisis de una muestra de malware a través del conocido servicio de multiAV de Virustotal.

Forense


  • aft: Android forensic toolkit
  • FBStalker y GeoStalker: herramienta OSINT para Facebook y fuentes de geolocalización - Flickr, Instagram, Twitter, Wigle. Los ID de usuario encontrados son utilizados para encontrar cuentas de redes sociales a través de otras redes como Facebook, Youtube, Instagram, Google+, Linkedin y Google Search
  • Grampus: herramienta multiplataforma de extracción de metadatos y footprinting, algo así como una FOCA en python y de código abierto.
  • LibForensics: librería para desarrollar aplicaciones forenses digitales 
  • sqlparse.py: parser para recuperar datos borrados de bases de datos SQLite
  • TrIDLib: identifica los tipos de archivo de sus firmas binarias. Ahora incluye Python binding
  • Volatility: extrae y analiza artefactos digitales de la memoria volátil (RAM) 

 

Análisis de malware


  • Exefilter: filtra formatos de archivo en mensajes de correo electrónico, páginas web o archivos. Detecta muchos formatos de archivo comunes y puede eliminar contenido.
  • OS X Auditor: herramienta gratuita de análisis forense para Mac OS X.
  • phoneyc: implementacion de honeyclient totalmente escrito en python
  • pyew: editor hexadecimal y desensamblador en línea de comandos, principalmente usado para analizar malware
  • pyClamAV:  añade capacidades de detección de virus para tu software Python
  • pyMal: framework para análisis de malware basada en Pefile, Pydbg y Volatility. 
  • jsunpack-n: unpacker de JavaScript genérico: emula la funcionalidad del navegador para detectar exploits dirigidos a explotar vulnerabilidades en navegadores y plugins
  • yara-python: identifica y clasifica muestras de malware

PDF


  • Didier Stevens' PDF tools: analiza, identifica y crea ficheros PDF (incluye PDFiD, pdf-parser, make-pdf y mPDF)
  • Opaf: Open Framework Analysis PDF . Convierte PDF a un árbol XML que puede ser analizado y modificado.
  • Origapy: wrapper de Python para el módulo de Ruby Origami que desinfecta archivos PDF
  • PDFMiner: extrae texto de ficheros PDF 
  • pyPDF: Python PDF toolkit: extrae info, corta, une, cifra, descifra...
  • python-poppler-qt4: une Python con la librería Poppler PDF, incluyendo soporte Qt4

Misc


  • Exomind: para la creación de gráficos y el desarrollo de módulos de inteligencia de código abierto, centrada en servicios de redes sociales, motores de búsqueda y mensajería instantánea
  • Hachoir: permite ver y editar un stream binario campo por campo
  • InlineEgg: toolbox de clases para escribir pequeños programas en Python
  • PyMangle: herramienta de línea de comandos y una biblioteca de Python utilizada para crear listas de palabras para su uso con otras herramientas de pruebas de intrusión
  • RevHosts: enumera los virtual hosts de una dirección IP dada
  • simplejson: JSON encoder/decoder, para por ej. usar Google's AJAX API

 

Otras herramientas y librerías útiles


  • Beautiful Soup: HTML parser optimizado para screen-scraping
  • IPython: shell Python interactivo y mejorado con algunas características para la introspección de objetos, acceso a una consola del sistema y su propio sistema especial de comandos 
  • lxml: librería más rica en características y fácil de usar para trabajar con XML y HTML
  • M2Crypto: wrapper OpenSSL más completo
  • matplotlib: construye gráficos 2D de matrices
  • Mayavi: 3D de visualización de datos científicos y plotting
  • NetworkX: librería gráfica (bordes, nodos)
  • Pandas: librería que proporciona mayor rendimiento y mayor facilidad de uso para analizar estructuras de datos de alto rendimiento y herramientas de análisis de datos
  • Pexpect: controla y automatiza otros programas, similar al sistema Don Libes `Expect
  • PyQt y PySide: Python bindings para el framework Qt y librería GUI
  • pyparsing: módulo de parsing general
  • RTGraph3D: crea gráficos dinámicos en 3D
  • Sikuli, tecnología visual para buscar y automatizar interfaces gráficas de usuario con capturas de pantalla. Programable en Jython
  • Suds:  cliente SOAP ligero para servicios Web
  • Twisted: motor de creación de redes basada en eventos
  • Whoosh: rápido, con muchas características de indexación de texto completo y búsqueda de librería implementado en Python
Fuente: th3-r4v3n

15 librerías para Python super utiles



Python es un lenguaje de programación de alto nivel que podemos usar para realizar todo tipo de tareas en múltiples plataformas. Su filosofía hace énfasis en que el código que escribamos sea lo más legible posible y su sintaxis permite expresar nuestra idea en menos líneas de código que otros lenguajes como Java o C++. Es un lenguaje que está diseñado para ser ejecutado mediante un intérprete, en contraste con otros lenguajes compilados. Es multiparadigma, ya que soporta orientación a objetos, programación imperativa y programación funcional. Es un lenguaje interpretado, usa tipado dinámico y es multiplataforma.

Particularmente, pienso que Python es una opción magnífica para todo aquel que quiera iniciarse en la programación. Al contrario que en otros lenguajes, no llenaremos el código con símbolos, puntos y coma o corchetes, pues la sintaxis es muy limpia y resulta agradable de leer. Pero si hay algo que de verdad caracteriza a este lenguaje de programación, es su capacidad para ser utilizado en múltiples propósitos distintos. Para ello, nos serviremos de diferentes librerías que añadirán funciones adicionales a este lenguaje.

La comunidad de Python crea cosas que son verdaderamente útiles. En este post, he querido recopilar unas cuantas librerías interesantes que me han ido llamando la atención durante estos días. Sentiros libres de completar la lista con vuestros aportes en la sección de comentarios, estoy seguro de que entre todos crearemos una buena lista.

Librerías que no te puedes perder

librerias

En la siguiente lista encontraréis librerías para realizar propósitos de todo tipo. La idea es enlazar las librerías a la página oficial para que podáis encontrarlas fácilmente y proporcionar una breve descripción.



- Colorama: me gustaría empezar la lista con una librería que deberíamos tener siempre a mano. Su función es la de mostrar el texto con diferentes fondos y colores de una forma muy sencilla y sin quebraderos de cabeza. Muy recomendada si queréis hacer un script que sea visualmente atractivo.

- Kivy: cuando nos gusta un lenguaje de programación queremos usarlo en todas partes. ¿Y si os dijera que podemos crear apps para Android con Kivy? De hecho, este proyecto pone a nuestra disposición en Google Play ejemplos de apps creadas con Python y Kivy, e incluso el famoso juego 2048. Es una librería multiplataforma, también podremos crear aplicaciones multitouch en Windows, Mac OS X y Linux.
 
- PyWeather: si no estás contento con el formato en que muchos programas te muestran la información del tiempo, de invito a que pruebes esta librería. Nos da la posibilidad de recoger los datos de varias fuentes meteorológicas y mostrarlo a nuestra manera. Aquí os dejo un ejemplo.

- PyQt: es un binding de la biblioteca gráfica Qt para el lenguaje de programación Python, nos permite crear interfaces gráficas multiplataforma.
 
- PyGTK: esta librería nos permite crear programas de interfaz gráfica multiplataforma utilizando para ello GTK+.

- Para la programación de videojuegos: en este caso podríamos mencionar al conocido Pygame o también a Pyglet. Si combinamos estos con la librería Kivy mencionada anteriormente, seremos capaces de hacer juegos para Android. Nada mal, ¿verdad?

- Para las ciencias: uno de los campos en el que más se utiliza a Python es en estadísticas y para realizar estudios científicos. Aquí podemos mencionar a SciPy, un ecosistema con varios componentes enfocados en la matemática, ingeniería y las ciencias (IPython por ejemplo, una consola Python con esteroides). Si hablamos de bioinfórmatica sería obligatorio mencionar a BioPython. Para estadísticas podríamos combinar Python con el lenguaje de progrmación R, mediante RPy.

- Otras menciones de interés: hay tantas cosas diferentes que se pueden hacer con Python que es difícil seleccionar solo unas pocas librerías. PRAW crea un bot para Reddit, PyEphem localiza planetas y satélites basados en nuestra posición en la tierra y en la hora, NLTK crea programas en Python que interpreten el lenguaje humano.
 
 

Introducción a Python



Hola Gente! Cómo les va? En esta ocasión traigo algo de material que tenía guardado. No es más que una pequeña introducción a Python pero prefiero compartirlo antes de que se pierda. Al final del post pueden encontrar un link con el material en pdf.

Comencemos!



Introducción


Voy a comenzar de una forma que no se acostumbra mucho hoy en día: definiendo.

Probablemente, muchos sepan que estamos a punto de adentrarnos en uno de los más maravillosos lenguajes de programación que existen actualmente. La pregunta es: ¿qué hace a este lenguaje tan especial? La respuesta es muy sencilla. Aún más de lo que podría parecer en un principio. Sin embargo, muchas de sus características y ventajas recién llegan a ser comprendidas luego de un tiempo. Es decir, nos veremos involucrados en un proceso de pythonización que código tras código nos irá respondiendo aquella pregunta tan importante que todos nos formulamos alguna vez al escuchar acerca de este misterioso ofidio de la programación.

Muy bien. Basta de vueltas y vayamos al grano. Entonces, ¿Qué es Python? Es un lenguaje de programación interpretado de alto nivel creado por Guido Van Rossum a fines de los años ochenta (dicen las malas lenguas que todo comenzó como un hobbie al buscar algo que lo mantenga ocupado durante las semanas de navidad). Entre sus características, podemos nombrar las siguientes:

    - Simple: Es la primera característica que debemos nombrar al hablar de este lenguaje. Python fue diseñado con esta filosofía: legibilidad y transparencia. A eso nos referimos cuando hablamos de “pythónico”. Ya veremos más adelante qué es y  cómo acceder al “Zen de Python”.

    - Interpretado: Todo lo que nosotros escribamos será ejecutado por medio de un intérprete, en contraste con los lenguajes compilados (C, C++, C#, Visual Basic, Delphi, etcétera) que son ejecutados por medio de un compilador (a leer!).

    - Multiparadigma: No tenemos que programar así o asá, sino que tenemos varios estilos para elegir (programación orientada a objetos, programación imperativa y, en menor medida, programación funcional).

    - Multiplataforma: Podemos ejecutar nuestros scripts en cualquier plataforma (GNU/Linux, Microsoft Windows, Mac OSX, etcétera) siempre y cuando tengamos nuestro intérprete instalado y configurado.

    - Interactivo: Podemos ejecutar sentencias desde la línea de comandos y ver qué nos responde el intérprete (nos ayuda mucho para comprender mejor el lenguaje y, principalmente, al momento de programar, permitiéndonos probar segmentos específicos de nuestro código, en busca de errores).

Existen muchas otras características como tipado dinámico, resolución dinámica de nombres, conteo de referencias, facilidad de extensión y demás. No es necesario que las veamos ahora, razón por la cual las dejo para que investiguen por su propia cuenta.



Instalando Python


Lo primero que debemos mencionar es la versión de python que vamos a utilizar a lo largo del taller. Actualmente existen 2 versiones principales: 2.7.8 y 3.4.1. Nosotros vamos a utilizar la primera (Python 2.7).

1). GNU/Linux. Generalmente ya viene instalado por defecto. En caso contrario, su instalación se puede realizar simplemente desde la consola. Para ello, escribimos:

Código: Bash
  1. wget https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz -O - | tar -x

O si tenemos curl:

Código: Bash
  1. curl https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz | tar -x

Con esto conseguimos descargar y descomprimir el código fuente. A continuación, procedemos a configurar e instalar python:

Código: Bash
  1. cd Python-2.7.8
  2. ./configure
  3. make
  4. sudo make install

En el caso anterior, debemos ejecutar los comandos de manera secuencial y resolver los errores que eventualmente nos puedan surgir. Una vez finalizado, podremos comprobar que la instalación ha sido exitosa simplemente escribiendo lo siguiente:

Código: Bash
  1. python

Lo cual nos abrirá la consola interactiva de python de la cual estuvimos hablando al principio del taller:



2). Windows. Aquí el asunto es un poco más simple. Descargamos el archivo de instalación desde alguno de los siguientes enlaces, según corresponda: 32 bits / 64 bits y con un doble click sobre el mismo comenzamos la instalación. Como siempre, aceptar, aceptar y aceptar hasta finalizar el proceso. Pero cuidado! Para simplificar aún más las cosas deberemos prestar atención. En la pantalla titulada “Customize Python 2.7.8” deberemos marcar la opción “Add python.exe to Path”. Con ello añadimos el archivo python.exe al path de Windows y nos ahorramos unos pequeños problemitas:



(La imagen muestra la instalación de la versión 3.3.2 pero nos sirve igual)

Para finalizar, abrimos el Procesador de comandos de Windows (cmd.exe) y, al igual que en Linux, escribimos:

Código: DOS
  1. python

Nuevamente, si todo anduvo bien, estaremos iniciando una charla con nuestro querido amigo, el intérprete.



Listo! Ya tenemos preparado nuestro entorno de desarrollo en ambos sistemas operativos. Sólo nos queda hacer un programa y ver qué sucede con todo esto.
A descansar 5 minutos que una vez que arranquen a programar no van a poder detenerse


Mi primer programa en Python

Si esta no es tu primera experiencia con un lenguaje de programación, seguro ya te irás imaginando qué tipo de aplicación estamos a punto de “desarrollar”. Exacto, qué otra cosa podía ser más que el clásico de los clásicos: el tan famoso “Hola mundo”.

Para aquellos que no entienden nada de lo que estoy hablando, les explico de forma muy concisa en que consiste este loco rito que acabamos de mencionar. Simplemente, lo que hacemos es crear una sencillísima aplicación que no hace más que imprimir en pantalla el mensaje “Hola mundo!”.

Pero… si es tan simple y, por lo visto, tan poco útil, ¿por qué tanta importancia? Simple. Lo que realmente nos importa de todo esto es realmente el código. En él vamos a poder ver muchas características del lenguaje que estemos utilizando. En nuestro caso, por ejemplo, ya veremos que el código se puede escribir de varias formas, lo cual nos permite constatar la capacidad multiparadigmática de python que mencionamos al principio.

Por otro lado, un “Hola mundo” nos permite rápidamente comprobar que tenemos todo nuestro entorno de desarrollo perfectamente configurado y funcionando.

Finalmente este programa es considerado fundamental desde el punto de vista didáctico, ya que ilustra rápidamente al principiante la sintaxis más básica del lenguaje de programación que está a punto de aprender.

Como dije anteriormente, existen varias formas de hacer nuestro “Hola Mundo” en python. Sin embargo, por ahora haremos lo más simple. A medida que vayamos conociendo más el lenguaje, veremos cuáles son esas otras alternativas que dejamos escapar en este momento.

Lo primero que vamos a hacer es abrir nuestro editor de texto plano favorito (en mi caso, sublime text). Una vez allí, escribimos el siguiente código:


Muy bien. Ahora sólo queda guardar nuestro archivo con el nombre “holaMundo.py” y listo.


Por último, probaremos ejecutarlo para ver si funciona. Para ello, abrimos una consola de comandos, nos dirigimos al directorio donde se encuentre nuestro script y escribimos lo siguiente: “python holaMundo.py”. Si el resultado fue un “Hola Mundo!” en la siguiente línea de la terminal, entonces, felicitaciones!! Acabas de crear tu primer programa 100% funcional en python!!



Vayamos ahora a las entrañas de este misterioso código y veamos qué significan esas palabritas, hasta ahora, sin sentido.

Lo primero que vemos es la palabra clave “print”. Si traducimos esta palabra inglesa al español, entonces vemos que su significado no es más ni menos que “imprimir”.


Código: Text
  1. print = imprimir

Con esta declaración lo que logramos es imprimir en pantalla la expresión que sigue a continuación.

En nuestro caso, la expresión que le continúa es “Hola Mundo!” con las comillas incluidas (ya veremos más adelante que significan esas comillas; por ahora quedémonos con la idea de que las comillas le dicen a print cuál es el mensaje que queremos mostrar al usuario).

Entonces, lo que nuestro pequeño código significa es simplemente: imprimir en pantalla el mensaje “Hola Mundo!”.

No era tan difícil, ¿no? A continuación, profundizaremos un poquito más para ver cómo hacemos de éste un programa algo más flexible e interactivo.


Variables

Vamos a comenzar ahora con un tema que nos abrirá muchas posibilidades a la hora de programar. Es que no hay mucho que podamos hacer sin ellas, las variables. Para los que no saben a qué me refiero, voy a tratar de explicarlo sencillamente.

Aclaración: Lo que estamos por ver no es más que una aproximación o introducción a este extenso tema. Existen muchos puntos que dejaremos fuera por el momento. Más adelante, una vez que nos adentremos en el mundo de la programación orientada a objetos (POO), estudiaremos a fondo cada uno de los tópicos que hoy trataremos.

1). Qué es una variable. Las variables son como cajas que nos permiten almacenar información en su interior. En ellas podemos guardar lo que sea: números, textos, listas, diccionarios, objetos, etcétera (ya veremos qué son concretamente estos elementos).

Pero, obviamente, necesitamos rotular estas cajas para poder identificarlas fácilmente y no confundirlas. Es decir, las variables tienen un nombre que las distinguen entre sí.

Conclusión: una variable...
    - es un espacio de memoria (la caja)
    - nos sirve para almacenar un valor (un tipo de dato)
    - tiene un nombre o etiqueta (identificador)

2.) Cómo crear una variable. En ciertos lenguajes primero debemos indicar el nombre de la caja y el tipo de información que va a almacenar (lo cual se denomina declaración) y, a continuación, indicamos cuál va a ser el contenido de la misma (esto es la definición). Esto no es tan así, ya que podemos declarar y definirlas al mismo tiempo, pero no viene al caso.

En python las cosas son un poquito más automáticas. No hace falta declarar las variables antes de definirlas. Simplemente les asignamos un valor y listo. El intérprete se encarga de identificar el tipo de dato almacenado. Esta es una de las características de python nombradas al principio del taller y se denomina tipado dinámico.

Para crear una variable debemos escribir lo siguiente:


Código: Python
  1. miVariable = valor

Como ven, es muy similar a matemáticas. A la izquierda el nombre de la variable y a la derecha el valor (tipo de dato) a asignar. El signo igual que estamos utilizando se denomina operador de asignación (ya veremos más adelante que existen unos cuantos operadores más).

Existe otra forma de asignación, un poco más compleja, denominada asignación múltiple. No la vamos a explicar todavía pero te invito a investigar por tu cuenta y experimentar un poco.

3). Tipos de datos. Si bien no es necesario indicárselo al intérprete, debemos conocer los tipos de datos soportados por python, de lo contrario, no llegaremos muy lejos.

Si bien existen varios tipos de datos, no hace falta nombrarlos a todos en este momento.

A continuación, nombraremos los más importantes para, luego, profundizar en cada uno de ellos:



Existen otros tipos de datos que iremos viendo en los próximos talleres. Por ahora, con esto será más que suficiente.

Muy bien, comencemos:

    A. Datos tipo str. Estos son valores de tipo alfanuméricos, es decir, son cadenas de números, letras y muchos otros símbolos  (str es una abreviatura de string que, traducido al español, significa cadena) delimitadas por comillas dobles (“”) o simples (‘’).

Si hacemos memoria, veremos que este es el tipo de dato utilizado en nuestro primer programa (“Hola Mundo!”, se acuerdan?).

Los datos tipo alfanuméricos pueden ocupar una o más líneas pero deberemos conocer algunos detalles para evitar cometer errores: si la información se encuentra delimitada sólo por una comilla entonces deberemos ocupar sólo una línea.



Para poder ocupar varias líneas debemos hacerlo con 3 comillas, dobles o simples:


Más adelante veremos que no es necesario utilizar tres comillas para ocupar varias líneas. Como adelanto, les digo que vayan investigando acerca de los códigos de escape (el código de escape “\n” nos permite ocupar varias líneas, a pesar de utilizar sólo una comilla).

Muy bien, antes de terminar con los datos tipo str, me gustaría hacer una pequeña pero importante aclaración: ¡Cuidado con los números!

Un número delimitado por comillas será considerado un valor de tipo str. Para que nuestro número sea considerado como tal deberemos escribirlo sin comillas.



    B. Datos tipo int. A este grupo pertenecen aquellos datos numéricos de tipo entero, incluyendo al cero y a los números negativos (int es la abreviatura de integer que, traducido al español, significa entero).

El espectro de números no es infinito. Ya veremos más adelante cómo determinar ese límite y a quién pertenece el espectro de números que sigue.

Un ejemplo de este tipo de dato es el que vimos en la última imagen (el uno que almacenamos en la variable llamada “intVar”).

    C. Datos tipo float. La palabra float hace referencia a los floating point numbers, es decir, a los números de punto o coma flotante (¿¡los qué!?). Wikipedia les puede dar una buena explicación pero si no quieren complicarse, entonces quédense con esto: si uno agarra una calculadora y escribe cinco dividido dos el resultado tiene dos representaciones: como número racional (es decir, dos quintos: 2/5) o como número de coma flotante (es decir, dos coma cinco: 2,5).

Conclusión, el número de coma flotante es, ni más ni menos, que una representación de un número racional.



Es importante aclarar que python interpretará al número con coma como un dato de tipo float, incluso a pesar de que sea un número entero (1.0 no es lo mismo que 1, ¿se entiende?).



    D. Datos tipo tuple. Se denomina tupla (traducción al español de tuple) a una secuencia ordenada y limitada de objetos. ¿Qué significa esto? Para entenderlo, veamos un poco los orígenes de este término.

Todo comienza cuando unos matemáticos que no tenían otra cosa que hacer aplicaron el método inductivo sobre cierto conjunto de palabras. Dichas palabras eran: dupla, tripla, cuádrupla, quíntupla, etcétera.

Los tipos se preguntaban qué nombre genérico podían darle a este conjunto. Pensaron, aportaron ideas, las desecharon y volvieron a pensar. Así, hasta que uno de ellos dijo: Si hablamos de 5 objetos, se llama quíntupla; si son 6, séxtupla; 7, séptupla. Si generalizamos, podemos llamarlos 5-tupla, 6-tupla y 7-tupla, respectivamente. Si generalizamos más, podemos decir n-tupla, donde n es el número de objetos que contiene la tupla. Y así es como surgió esta interesante denominación.

Bueno, sí. Era innecesaria la historia jeje. Pero al menos sacamos 2 cosas de ella (o 3, qué se yo). Primero, las tuplas contienen una cantidad limitada de objetos (n nos dice que la tupla es finita). Segundo,  los objetos están ordenados de una forma determinada (eso no lo dice la historia pero no importa!). Tercero, los matemáticos se la pasan estudiando cosas sin sentido que, de una forma u otra (ni sé cómo), llegan a tener mucha importancia en nuestras vidas (¿?).

Muy bien. Por último vamos a decir algo muy importante. Las tuplas son inmutables. Esto significa que una vez creada la tupla, es imposible modificarla. ¿Clarito?

Para crear una tupla no hace falta mucho: sólo dos paréntesis (uno de apertura y otro de cierre) y comas (,) para separar los objetos entre sí.

En cuanto al contenido, puede ser cualquier cosa (menos plata! eso no lo pueden hacer, no se dejen engañar). Pero, ¿entonces puedo guardar una tupla dentro de otra tupla? Exactamente! Dentro de ellas puedes guardar cualquiera de los tipos de datos que estamos viendo y mucho más. Es hora de hacer volar tu imaginación y diseñar posibles programas para codear más adelante, a la par del próximo taller.



Como ven en la imagen, primero creamos tres variables que contienen los primeros tres tipos de datos que vimos. Luego, creamos 3 variables más: las primeras dos (miTupla y otraTupla) son tuplas que contienen a las primeras variables. La última (tuplaDeTuplas) es una tupla que contiene a las otras dos tuplas.

Si prestan atención, verán que miTupla y otraTupla presentan el mismo contenido. Sin embargo, no hay que caer en el error de afirmar que son iguales. Como dijimos al principio, el orden de los objetos es importante. Tanto que estas dos tuplas serían iguales de no ser por esta característica.

    E. Datos tipo list. Las listas (no voy a aclarar que lista es la traducción al español de list :P) son muy parecidas a nuestras queridas tuplas. Difieren de ellas en los siguientes aspectos:

        a.   No surgen del ocio de los matemáticos.

        b.   Son mutables (sí, podemos modificar su contenido una vez creada la lista).

        c.   El contenido es delimitado por corchetes (y no por paréntesis).

        d.   Muchas otras cosas que dejaremos para más adelante (las veremos cuando comencemos con la POO).

De lo antedicho, y si aplicamos el famoso método hipotético-deductivo, podemos obtener más información de las listas:

        a.   Son una secuencia ordenada y limitada de datos.

        b.   Pueden contener cualquier tipo de dato.

        c.   Los objetos se separan unos de otros por comas.

Bueno, basta de cháchara y a la acción:




    F. Datos tipo dict. Los diccionarios son, al igual que las tuplas y las listas, un conjunto limitado de datos. Pero hay 2 términos que no estamos incluyendo en esta definición: ordenado y secuencial. Es que, de hecho, si hay algo que no le interesa al diccionario de python es preocuparse por un orden y una secuencia. Pero, ¿por qué? Es que los diccionarios no son más que un conjunto no ordenado de pares clave: valor.

Para entenderlo, hagamos una analogía con un diccionario de idiomas. Si quisiéramos saber qué significa una palabra determinada (por ejemplo, python), debemos buscar dicha palabra (clave) para luego ver su significado (valor).

Así es cómo hacen los diccionarios de python para organizar los datos que almacenamos en ellos.

Al igual que con las tuplas y las listas, los valores pueden ser cualquier tipo de dato. Las claves, en cambio, sólo pueden ser objetos inmutables (incluyendo a las tuplas, siempre y cuando no contengan objetos mutables).

Por último, vamos a ver cómo hacer un diccionario (al igual que con los anteriores, dejamos afuera mucha información; ya veremos todo con POO):

    - Los objetos deben estar delimitados por corchetes ({}) y separados por comas (,).

    - Las claves y los valores se asocian por medio de dos puntos ( : ); el objeto de la izquierda es la clave y el de la derecha, el valor.



En la imagen anterior podemos ver que miDic y otroDic presentan el mismo contenido pero en diferente orden. A diferencia de lo que sucedió en el caso de las listas y las tuplas, estos dos diccionarios sí son iguales. Recuerden: como hemos dicho al principio, al diccionario no le interesa el orden de los objetos.

    G. Datos tipo bool. Los datos booleanos son aquellos que pueden representar valores de lógica binaria, es decir, 2 valores (verdadero o uno y falso o cero).

En python, estos datos están representados de muchas formas pero principalmente con 2 palabras clave: true y false (en sí, ambas son simples variables que almacenan los valores booleanos 1 y 0, respectivamente).

En términos generales, podemos decir que todos los datos son verdaderos, a excepción del cero (0 y 0.0), los datos vacíos (“”, (), [] y {}) y el NoneType.

Los datos booleanos son importantísimos en informática y, por ende, para nosotros: los programadores. Ya veremos más adelante cómo utilizarlos.

    H. Datos tipo NoneType. Este tipo de dato denota la falta de valor (none significa, traducido al español, ninguno) pero, en realidad, esto no es así. De hecho, los datos NoneType presentan y sólo pueden presentar un único valor: None.

Es elemental que comprendan esta diferencia: los datos NoneType no carecen de valor, sino que sí lo tienen, y sólo puede ser uno.

A partir de esto, uno se preguntará, ¿qué utilidad podemos darle a un dato que no se puede modificar y que no nos aporta ningún tipo de información? Fácil. En python, no podemos iniciar una variable sin asignarle un valor. Tampoco podemos, en las listas, asignar un valor a un offset que no ha sido creado aún. Por último, lo mejor: ninguno de estos ejemplos es cierto debido a que None nos permite hacerlo.

Veamos cómo:



Como podemos ver, la variable varVacia será de tipo NoneType. Gracias a None podemos iniciar la variable “sin tener que definir su tipo” (lo pongo entre comillas porque, a pesar de su nombre, None es algo: no es realmente nada, sino que es un objeto).

En cuanto a la variable miLista, el resultado será una lista con cuatro offsets ocupados por objetos None. Esto es casi lo mismo que decir que son 4 lugares vacíos, listos y a la espera de ser ocupados.


Mejorando nuestro “Hola Mundo!”

Cada vez que nos encontramos frente a una computadora, cualquiera que sea, podemos ver que cuenta una característica o cualidad fundamental: la capacidad de interactuar. Es que, de hecho, serían muy poco útiles si no contaran con dicho atributo. Si queremos que nuestros programas sean útiles y flexibles, debemos darles la capacidad de interactuar con el usuario.

Llamamos input a la información que el usuario suministra a la máquina y output a la información que la computadora transmite al usuario.

Ya vimos un ejemplo de output: la declaración print. Es decir, ya sabemos cómo hacer que la computadora muestre información por medio del monitor. Ahora sólo nos resta ver cómo podemos hacer para pasarle información a nuestros programas.

En python 2.7 existen 2 declaraciones para introducir información por medio del teclado: input y raw_input, para introducir números (int) y texto (str), respectivamente.

Veamos un ejemplo para entenderlo rápidamente.



Como vemos en la imagen, input nos sirve para ingresar datos de tipo int, mientras que raw_input, para ingresar datos de tipo str. De aquí surgen 2 cuestiones. Primero, si quisiéramos utiliza input para ingresar letras, se generaría un error. Por el contrario, el hecho de ingresar números al utilizar raw_input no genera ningún tipo de error pero debemos tener en cuenta que el dato ingresado no será de tipo int sino str (será el número con comillas).

Muy bien, ahora que ya sabemos cómo pasarle datos a nuestro programa y hacer que éste nos imprima texto en pantalla, es tu turno de mejorar nuestro primer programa, de forma tal que nos permita interactuar con el usuario e imprimir la información suministrada por el mismo.

La tarea es hacer un programa que pida el nombre y la edad al usuario para luego imprimir el siguiente texto:


“Hola (nombre)!! Tienes (edad) años”

Hay algunas cositas que van a andar mal pero es, simplemente, porque no lo hemos visto aún. No se preocupen. Tranquilos que ya vamos a llegar.

Por último, si les funciona el programa anterior, les dejo un último desafío: creen una variable con la edad del programa y e impriman la diferencia de edad (del programa y del usuario) en pantalla. Complicadito jeje.

Ahora sí me despido. La solución en el próximo número, con muchísimo más python y ejercitación.

Saludos!





P.D.: El tutorial que acabo de presentar iba a formar parte de los talleres oficiales de python pero, por error, escribí acerca de temas que ya habían sido tratados en las primeras dos entregas. Con esto quiero decir 2 cosas: primero, esta guía no pertenece a los talleres de underc0de y, segundo, todavía tengo pendiente la creación de una entrega oficial que se hará pública en los próximos días. En ella trataremos nuevos temas que nos permitirán comenzar con lo mejor del taller: la creación de herramientas orientadas al hacking.

Autor: WhiZ