paint-brush
Actualización intermedia de Python: tutorial, ideas de proyectos y consejospor@elijahlopezz
20,101 lecturas
20,101 lecturas

Actualización intermedia de Python: tutorial, ideas de proyectos y consejos

por Elijah15m2020/05/12
Read on Terminal Reader
Read this story w/o Javascript

Demasiado Largo; Para Leer

Este artículo es para enseñar a los principiantes y desarrolladores de Python algunos conceptos clave utilizados en Python que no se enseñan desde el principio. Estos son algunos conceptos que no aprendí en un día sino en un par de años ya que soy autodidacta. Traté de convertir esto en un video, pero el video terminó teniendo una duración de 1:45 y más de una hora; Yo mismo necesitaría mucha motivación para ver un "tutorial" tan largo, y prefiero los artículos para obtener mi información en lugar de los videos.

Companies Mentioned

Mention Thumbnail
Mention Thumbnail
featured image - Actualización intermedia de Python: tutorial, ideas de proyectos y consejos
Elijah HackerNoon profile picture

Este artículo es para enseñar a los principiantes y desarrolladores de Python algunos conceptos clave utilizados en Python que no se enseñan desde el principio.

Última actualización: 17 de mayo de 2020

Si puede crear un solucionador de raíces cuadráticas, podrá comprender este artículo. Estos son algunos conceptos que no aprendí en un día sino en un par de años ya que soy autodidacta.

Traté de convertir esto en un video, pero el video terminó siendo 1:45
horas de duración; Yo mismo necesitaría mucha motivación para ver una
"tutorial" tan largo, y prefiero artículos para obtener mi información
ya que puedo seleccionar detalles relevantes en lugar de tratar de saltar
secciones de un video.

Cómo empezó todo

Aprendí los conceptos básicos de Python a través de CS Circles y luego procedí a mejorar/probar mis habilidades para resolver problemas. Hice esto haciendo preguntas de CCC que puedes encontrar (entre otros problemas del concurso) en DMOJ . Otros sitios para mejorar sus habilidades de resolución de problemas algorítmicos incluyen HackerRank y LeetCode (aunque esto es principalmente para la preparación de entrevistas).

Mientras hacía esto, ¡estaba codificando con el editor IDLE predeterminado! Hice esto durante 3 meses y luego descubrí PyCharm , que
tiene una ligera curva de aprendizaje pero es mucho mejor en términos de características
y en la mejora de la productividad. Hoy en día, uso tanto PyCharm como Visual Studio Code .

Personalmente, tengo una carpeta completa dedicada a fragmentos de código que podría
usar en el futuro, por lo que le sugiero que también lo haga y tal vez incluso agregue algunos
de los fragmentos de código de este artículo para que pueda leer su
propios ejemplos en lugar de buscarlos en Google o volver a este artículo.

Consejos generales

Estos son algunos consejos que no están ligados a la programación sino a la vida y la productividad en general.

Conoce tus atajos de teclado
Conozca los específicos del programa (navegador, explorador, IDE de elección, etc.) y también los específicos del sistema operativo (por ejemplo, Win + R para ejecutar).

Conoce la línea de comando

En lugar de hacer un cálculo a mano o abrir un IDE para crear y ejecutar un script, puede ejecutar el código de Python desde la línea de comandos.
Aparte de las funciones por lotes comunes (por ejemplo, ls, cd), saber cómo usar
Python desde la línea de comandos te ahorrará mucho tiempo

Ejemplo de línea de comandos de Python

saber como googlear

Google (o el motor de búsqueda de su elección) es mi mejor amigo y también debería ser el suyo. Me ha ahorrado mucho tiempo y también podría ahorrarte un
mucho tiempo. No puede hacer eso si no lo usa o no sabe cómo
úsalo Cuando busca algo en Google, su consulta debe ser lo suficientemente general para que pueda encontrar respuestas, pero también lo suficientemente específica para que esas
las respuestas son relevantes.

Estrategia de desglose de problemas

Esto va de la mano con Google. Supongamos que tiene un problema/proyecto. Necesitas dividirlo en partes más pequeñas. Luego, debe analizar cada una de estas partes y ver si son lo suficientemente pequeñas como para completar cada una de ellas. De lo contrario, te falta algo de conocimiento que deberías buscar en Google o la parte es demasiado grande y debe desglosarse nuevamente. Sigues haciendo este procedimiento recursivo hasta que tu proyecto ha sido
dividir en partes solucionables para que pueda completarlas y luego tejer
juntos un proyecto. Cuando busco y encuentro respuestas a través de Google,
no espere que sean 100% lo que necesito. Normalmente necesito remezclar
en lo que quiero y eso es lo que también debes esperar: el desnudo
solución mínima que te lleve al menos un paso adelante.

Con estos consejos indicados, puede hacer un par de cosas diferentes a continuación. Tú
puede hojear el resto del documento y tomar notas en los fragmentos de código
Incluyo (lo que yo haría personalmente), lee solo los encabezados, salta a
la sección de ideas de proyectos, o deja de leer por completo ya que mis consejos son tan
útil.

Refresco

En CS Circles, traen sobre la función de impresión y algunos de sus
parámetros opcionales pero es fácil olvidarse de ellos así que aquí está
otra vez.

 >>> # The default parameters for print are sep=' ', and end='\n' >>> print( '4' , '21' , 2020 , sep= '/' , end= '\n---------\n' ) 4 / 21 / 2020 ---------

Empecemos

Función de entrada y formato de cadena

La función de entrada tiene un parámetro opcional para que también pueda actuar como un
indicador y si está utilizando Python 3.6+, puede utilizar f-strings.

 name = input( 'Enter your name: ' ) print( f'Hello {name} !' ) # modern way of string formatting # if input='reader', output: Hello reader!

Para bucles

Quiero dejarles claro que un bucle for, no es un bucle while como lo es
en otros idiomas. En Python, un bucle for es una iteración sobre un objeto iterable.

La función de rango tiene tres parámetros, dos de ellos opcionales. No escriba el uso de la función de rango con un valor de inicio explícito de 0 porque 0 es el valor de inicio predeterminado (a menos, por supuesto, que esté modificando el valor de paso predeterminado de 1).

En este ejemplo, le mostraré exactamente lo que quiero decir con "no es un ciclo while" y cómo un ciclo for (específicamente un rango) no se suma al valor temporal.

 # range(start=0, stop, step=1) # range(5) == range(0, 5) == range(0, 5, 1) for i in range( 5 ): print(i) i += 2 # Guess the output. HINT: i += 2does nothing

Si ejecuta este código, notará que la salida aumenta en 1
cada vez, incluso si sumamos 2 a i en cada bucle. esto es porque yo soy
establecido en el siguiente valor en el rango y en realidad no está siendo incrementado por
uno cada vez. Esto significa que en realidad podemos iterar sobre todo tipo de
objetos iterables, como listas, sin tener que usar rango e indexación.

 some_letters = [ 'a' , 'b' , 'c' , 'd' , 'e' ] for letter in some_letters: # do something pass

Aquí introduje la palabra clave pass, esto es para evitar errores en bloques vacíos.

Si desea realizar un seguimiento del índice y del elemento, aún
no tiene que usar el rango, puede usar la función integrada enumerar.

 for i, letter in enumerate(some_letters, start= 0 ): print( f'item at index {i} is {letter} ' )

Puede pensar en enumerar como convertir un iterable en un iterable de pares (índice, elemento de iterable en el índice).

También puede usar la siguiente función para recuperar el siguiente valor en un
iterable (si no hay un elemento siguiente, se generará un error).

E/S de archivos

Incluyo esto porque si busca "cómo leer archivos en python" en Google, se le da esto que lo enseña a la antigua y no al enfoque moderno.

 # make sure test.txt exists with text in it # OLD f = open( 'test.txt' ) # note default is mode='r' # do something with f here f.close() with open( 'test.txt' ) as f: # NEW; no close() needed print(f.read()) # f.read() moves the "cursor" to the end of the file assert not f.read() f.seek( 0 ) assert f.read() # f.read() returns a string now (unless test.txt is empty) with open( 'test.txt' , 'w' ) as f: # f.read() ERROR do not do this f.write( 'this is a test\n' ) # note there is no end parameter f.writelines([ 'line1\n' , 'line2\n' ]) # note no auto newline# other modes: a for append, rb for reading-bytes, wb for writing bytes, and r+/w+ for both reading and writing at the same time

Si tiene curiosidad por qué r+/w+ no es el valor predeterminado, piense en cómo un archivo
no se puede abrir para escribir si está siendo "escrito" por
otro programa Si solo necesita leer un archivo, al estar abierto en
otro programa significa que no interferirá con el otro
programa.

Manejo de errores

 # handling the error try : raise RuntimeWarning( 'Something could go wrong' ) except RuntimeWarning as e: # as e is optional # handle the exception here # ignoring the error # old try : raise Exception( 'BOO' ) except Exception: pass # new from contextlib import suppress def ignore_error (exception: Exception) : """ Use three quotes for docstrings or long strings """ # : for type hinting (in a dynamic typed language!) and # yes you can pass exceptions and functions as parameters with suppress(exception): raise exception( 'BOO' ) print( 'not printed' ) ignore_error(RuntimeError) print( 'this gets printed' )

En este punto, si está siguiendo PyCharm, habrá visto algunas líneas onduladas, especialmente en "Excepción" en el código anterior.
Estas líneas onduladas lo ayudan a evitar errores de sintaxis, siga el estilo
pautas, y llamar la atención sobre el código que podría estar haciendo algo
no querías que estuviera haciendo.

Más tipos de datos

Entonces, ¿qué son estos iterables que sigo mencionando? Sí, una lista es iterable y también lo son las tuplas (que ya debería conocer).

También hay diccionarios, conjuntos y generadores (no discutidos aquí).
Los diccionarios son como tablas hash en otros idiomas, porque
"hash" la clave para almacenar información.

 empty_dict = {} # or dict() my_dict = { 'key' : 'value' } # How to get value from dict my_dict[ 'a' ] # raises KeyError if 'a' not in dictionary my_dict.get( 'a' , DEFAULT_VALUE) if 'key' in my_dict: val = my_dict[ 'key' ] val = my_dict.get( 'key' , None) if val is not None: pass with suppress(KeyError): val = my_dict[ 'key' ] # iterations for k in my_dict: pass # or for k in my_dict.keys() for v in my_dict.values(): pass for k, v in my_dict.items(): # since items() generates the items as the iteration happens, # my_dict cannot be modified in this loop. # For modification use tuple(my_dict.items()) pass # remove key from dict del my_dict[ 'key' ] # can raise KeyError # if you want to use the value, use .pop() and define a default # value to avoid KeyErrorsmy_dict.pop( 'key' , DEFAULT_VALUE) # set empty_set = set() # {} would initialize an empty dict my_set = { 1 , 2 , 3 } if 1 in set: pass # there are many set methods, go check them out yourself # some include: union, intersect, difference # you can use + and - as well

Uso de la estructura de datos (eficiencia)

La estructura de datos que utiliza es muy importante para escribir un buen código.

use diccionarios si el orden no importa + cada clave tiene información (valor) asociada con ella use conjuntos si el orden no importa + ningún valor por clave (por ejemplo, llevar un registro de lo que ha 'usado' per se) use tuplas si necesita datos ordenados pero no es necesario modificar los datos (por ejemplo, coordenadas) use listas si necesita orden y mutabilidad (más flexible)

No puede usar conjuntos, diccionarios o conjuntos si necesita realizar un seguimiento de
duplicados Eso es porque los conjuntos y los diccionarios codifican las claves para que
es súper rápido (O (1)) para verificar si una clave está en un diccionario. Esto hace
significa que no puede usar listas, conjuntos y generadores como claves (pero definitivamente puede usar tuplas siempre que las listas no estén anidadas).

Los diccionarios también son como objetos JSON, por lo que puede usar el módulo json para exportarlos a un archivo JSON. Tenga en cuenta que si usa conjuntos como valores, se convierten en listas en un archivo json exportado.

Funciones misceláneas

A veces verá funciones como

 func(*args, **kwargs)

 # args = a list of arguments # kwargs = keyword arguments # (in the function it'll be a dictionary) # *args: list in the function **kwargs: dict in the function def complex_func (*args, **kwargs) : pass def normal_func (a, b, c, sample_param= 5 ) : pass sample_args = { 'sample_param' : 3 } args = [ 0 , 1 , 2 ] complex_func( 1 , 2 , 3 , test= 'true' ) # how you'd call it complex_func(*args, **sample_args) # also works on normal functions normal_func(*args, **sample_args)

Comprensión de lista y ternario

Una de las partes más hermosas de Python es la comprensión de listas; one liners para crear listas.

 # example: input is space separated integers integers = [int(x) for x in input.split()] # split(sep=' ', maxsplit=-1), -1 means no limit no_negatives = [x for x in integers if x > 0 ] # only if positives = [x if x > 0 else -x for x in integers] # if and else back_to_str = ' ' .join((str(x) for x in integers)) # items in the list to join need to be of type str print(integers) # this next case demonstrates the ternary operator _ if _ else _ print( 'list is' , 'not empty' if integers else 'empty' )

También puede usar listas de comprensión para crear diccionarios y conjuntos

 set_example = {x for x in range( 3 )} dict_example = { x : x for x in range( 3 )} generator_example = (x for x in range( 3 )) # use sparingly

El tercer ejemplo es un generador. Hay algunos casos de uso para ello, así que investigue antes de usarlos, ya que son un tema avanzado que no se incluye en este artículo.

Iterables vs Primitivas

Hay una distinción muy importante entre variables primitivas y variables iterables. Por ejemplo.

 a = 5 b = a a = 6 print(a == b) # false # vs. a = [ 1 , 2 , 3 ] b = a c = [ 1 , 2 , 4 ] a[ 2 ] = 4 print(a == b == c) # true print(a is b) # true; same refrence print(a is c) # false

Esto es especialmente importante cuando se trata de iterables anidados con la forma en que crea iterables anidados y también los copia . Pruebe estos ejemplos usted mismo.

 lols = [[ 0 ] for i in range( 3 )] # [0] is created 3 times lols[ 0 ][ 0 ] = 5 print(lols) # [[5], [0], [0]] # vs. a = [[ 0 ]] lols = a * 3 # same as lols = [[0] * 3] lols[ 0 ][ 0 ] = 5 print(lols) # [[5], [5], [5]]

Copiando iterables

Para hacer una copia superficial, use .copy(). PERO, tenga en cuenta que para cualquier iterable anidado, solo se copia la referencia, no la lista anidada real. Por eso se llama copia superficial. Para hacer una copia profunda , podemos usar el módulo de copia.

 new_copy = lols.copy() # I prefer this over using [:] reversed_list = lols[:: -1 ] # I rarely use this^ as reversed() and .reverse() exist new_copy[ 0 ][ 0 ] = 6 # lols == [[6], [6], [6]] assert lols == new_copy and not lols is new_copy from copy import deepcopy new_copy = deepcopy(list_of_lists) new_copy = list_of_lists new_copy[ 0 ][ 0 ] = 4 # [[4], [4], [4]] because 3x of the same list assert lols != new_copy and lols is not new_copy

Memoización

La memorización es el almacenamiento en caché de los resultados de retorno de funciones para acelerar los cálculos repetitivos. Un ejemplo sería la implementación recursiva de la secuencia de Fibonacci.

 def memo (func) : # remove print statements in a practical setting cache = {} def _helper (x) : # constrained to one param (in this case) # you could have multiple params (x, y, ...) and then # cache using tuple keys if x not in cache: print( 'not in cache' ) cache[x] = func(x) else : print( 'in cache' ) return cache[x] return _helper @memo # square = memo(square) <-- what it means def square (x) : return x * x for i in range( 3 ): square(i), square(i) # second one uses cached result

Un ejercicio es hacer una función de suma (a, b) que use memorización.

lambdas

Usualmente se usa en lugar de un parámetro de función si el cálculo es breve. Por ejemplo, clasificar.

 [ 'aa' , 'Bb' , 'Cc' , 'dD' ].sort(key= lambda string: string.upper()) [( 'a' , 1 ), ( 'b' , 0 )].sort(key= lambda pair: pair[ 1 ]) sorted([( 'a' , 1 ), ( 'b' , 0 )], key= lambda pair: pair[ 1 ]) max([( 'a' , 1 ), ( 'b' , 0 )], key= lambda pair: pair[ 1 ]) # and min

Módulos

Los módulos juegan un papel importante en los proyectos que harás. Algunos integrados son os, shutil, copy, glob y threading.

sistema operativo

 import os os.mkdir() # to make a NEW dir os.chdir() # choose a current working dir os.getcwd() # get current working dir os.path.exists() os.rename() os.remove() # for existing files only os.rmdir() os.getenv( 'key' ) # gets an environmental variable # use the shutil module for directories with sub directoriese

Variables ambientales

Especifique los secretos del proyecto en un

 .env
expediente

 # in .env KEY=VALUE # in *.py with open( '.env' ) as f: for line in f.read().splitlines(): k, v = line.split( '=' , 1 ) os.environ[k] = v

globo

Se utiliza para obtener una lista de archivos/carpetas

 from glob import glob print(glob( '*.py' )) # get all .py files in cwd, * is a wildcard # exercise: find out how to get all .py files in cwd + its subdirs

enhebrar

Ya he escrito algunos ejemplos de subprocesos para que los veas aquí . Simplemente siga las instrucciones en la esencia.


Módulos de terceros

Debe usar `pip install module_name` para instalar módulos.

Algunos módulos que son comunes son solicitudes, beautifulsoup4, PIL y matraz. Si está trabajando en un gran proyecto, probablemente terminará usando módulos de terceros.

Temas avanzados (aprendizaje futuro de Python)

Clases

No cubrí las clases porque se trata más de OOP que de la programación de Python y los casos de uso de las clases son muy pequeños. Una cosa que debe saber cuando está aprendiendo clases es la propiedad __slots__ , así que busque eso por su cuenta.

Generadores

Nuevamente, este es un tema avanzado y aprender sobre él ahora solo generará confusión, es mejor aprenderlo por su cuenta o en un entorno práctico.

Decoradores

Cubrí solo los conceptos básicos de los decoradores. Hay decoradores utilizados por muchas otras bibliotecas de terceros y diferentes casos de uso (por ejemplo, funciones de temporización), por lo que le sugiero que también haga su propia investigación sobre ellos.

flujo de trabajo git y git

Esto es muy importante cuando colaboras con otros o trabajas para una empresa. Git es una herramienta de control de versiones que se utiliza para que los errores no te perjudiquen y para permitirte trabajar en varias funciones al mismo tiempo.

otros módulos integrados

Como itertools, subprocesos, multiprocesamiento y más.

Ideas de proyectos

Puede encontrar una lista de ideas de proyectos a continuación:

 PRACTICAL PROJECT IDEAS Your own website/portfolio (no bootstrap, use raw HTML/CSS/JS + flask backend). Use Heroku (free) to host it [Hard] A program that applies a blur to an image you select [Easy] (use tkinter/SG so that you don 't have to hard code the filename every time someone uses the program) A program that sets your desktop wallpaper and cycles through a folder of images, [Okay] change the wallpaper every x (you decide) seconds. Web Scraping & Data Parsing [Hard] Go to https://www.cia.gov/library/publications/the-world-factbook/rankorder/2004rank.html and use inspect elements, Your job is to parse this web page and filter the data so that only the data with the latest "date of information" remains. Output should be order-preserved and in a CSV file (filename is arbitrary) To make it easier (not recommended), you can assume the latest date of info is 2017 EST. To make it even easier (not recommended) just preserve the order and output all of the data in a CSV hint: use requests, bs4, and the csv module Another challenge is to download the data as a txt file and convert that text file to a CSV file using Python hint: you may find ' '.join(iterable) useful Using an API [Okay - Hard] Spotify Reference You' ll have to get a Spotify API key See https: //developer.spotify.com/documentation/web-api/reference/search/search/ and make a program that lets users search for tracks using the Spotify API (you return a list of tracks) See https: //elijahlopez.herokuapp.com/search-album-art/ for a demo but with album art You just need to spit out a list of tracks To make this harder, you will sort the tracks by popularity (you 'll have to search the documentation yourself) To make this even harder, you can add a sort by artists feature and MORE # requests, base64 module, Try to send an email to yourself (your email -> your email) using Python [Easy - Hard] To make this harder, try to also send an attachment module: at least smptlib You can try to make your own key logger [Okay - Hard] At first just append the contents to a .log or .txt file Use the ' a ' open type to append to bottom. HARDER: YOU WILL INCLUDE COPIED AND PASTED ITEMS WITH custom syntax # (eg USER_COPIED("")), (eg USER_PASTED("")) Make your own soundboard with your own sounds [Hard because tedious] You PySimpleGUI for the GUI (I recommend but you don' t have to) - Let your soundboard include support for different "packs" - Specify a design/package guide for other users to create use their sounds on your soundboard default : your default pack PACKS_DIR/pack_name/sound_name/sound .mp3/ogg # pygame, playsound Make your own game using pygame (OOP) Turn one of these projects into an executable [Okay but Tedious] - use sys.exit() instead of quit() pyinstaller, or cx_freeze Make your own discord bot [variable difficulty] ( async ) Email me or comment for bigger programming (not specifically Python) project ideas

Comenta si tienes alguna pregunta.

Gracias por leer y buena suerte en su viaje de aprendizaje.