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 y luego procedí a mejorar/probar mis habilidades para resolver problemas. Hice esto haciendo preguntas de que puedes encontrar (entre otros problemas del concurso) en . Otros sitios para mejorar sus habilidades de resolución de problemas algorítmicos incluyen y (aunque esto es principalmente para la preparación de entrevistas). CS Circles CCC DMOJ HackerRank LeetCode Mientras hacía esto, ¡estaba codificando con el editor IDLE predeterminado! Hice esto durante 3 meses y luego descubrí , 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 . PyCharm 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. 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 tus atajos de teclado 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 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. remezclar 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. print( , , , sep= , end= ) / / --------- >>> # The default parameters for print are sep=' ', and end='\n' >>> '4' '21' 2020 '/' '\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( ) print( ) 'Enter your name: ' f'Hello !' {name} # modern way of string formatting # if input='reader', output: Hello reader! 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. Para bucles 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. i range( ): print(i) i += # range(start=0, stop, step=1) # range(5) == range(0, 5) == range(0, 5, 1) for in 5 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 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. yo some_letters = [ , , , , ] letter some_letters: 'a' 'b' 'c' 'd' 'e' for in # 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. i, letter enumerate(some_letters, start= ): print( ) for in 0 f'item at index is ' {i} {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 que lo enseña a la antigua y no al enfoque moderno. esto f = open( ) f.close() open( ) f: print(f.read()) f.read() f.seek( ) f.read() open( , ) f: f.write( ) f.writelines([ , ]) # make sure test.txt exists with text in it # OLD 'test.txt' # note default is mode='r' # do something with f here with 'test.txt' as # NEW; no close() needed # f.read() moves the "cursor" to the end of the file assert not 0 assert # f.read() returns a string now (unless test.txt is empty) with 'test.txt' 'w' as # f.read() ERROR do not do this 'this is a test\n' # note there is no end parameter '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 : RuntimeWarning( ) RuntimeWarning e: : Exception( ) Exception: contextlib suppress suppress(exception): exception( ) print( ) ignore_error(RuntimeError) print( ) # handling the error try raise 'Something could go wrong' except as # as e is optional # handle the exception here # ignoring the error # old try raise 'BOO' except pass # new from import : 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 raise 'BOO' 'not printed' '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 = { : } # How to get value dict my_dict[ ] # raises KeyError not dictionary my_dict.get( , DEFAULT_VALUE) my_dict: val = my_dict[ ] val = my_dict.get( , None) val is not None: pass suppress(KeyError): val = my_dict[ ] # iterations k my_dict: pass # or k my_dict.keys() v my_dict.values(): pass k, v my_dict.items(): # since items() generates the items the iteration happens, # my_dict cannot be modified loop. # For modification use tuple(my_dict.items()) pass # remove key dict del my_dict[ ] # can raise KeyError # you want to use the value, use .pop() and define a # value to avoid KeyErrorsmy_dict.pop( , DEFAULT_VALUE) # set empty_set = set() # {} would initialize an empty dict my_set = { , , } set: pass # there are many set methods, go check them out yourself # some include: union, intersect, difference # you can use + and - well 'key' 'value' from 'a' if 'a' in 'a' if 'key' in 'key' 'key' if with 'key' for in for in for in for in as in this from 'key' if default 'key' 1 2 3 if 1 in as La estructura de datos que utiliza es muy importante para escribir un buen código. Uso de la estructura de datos (eficiencia) 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) sample_args = { : } args = [ , , ] complex_func( , , , test= ) complex_func(*args, **sample_args) normal_func(*args, **sample_args) # 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_param' 3 0 1 2 1 2 3 'true' # how you'd call it # also works on normal functions 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. integers = [int(x) x input.split()] no_negatives = [x x integers x > ] positives = [x x > -x x integers] back_to_str = .join((str(x) x integers)) print(integers) print( , integers ) # example: input is space separated integers for in # split(sep=' ', maxsplit=-1), -1 means no limit for in if 0 # only if if 0 else for in # if and else ' ' for in # items in the list to join need to be of type str # this next case demonstrates the ternary operator _ if _ else _ 'list is' 'not empty' if else 'empty' También puede usar listas de comprensión para crear diccionarios y conjuntos set_example = {x x range( )} dict_example = { : x x range( )} generator_example = (x x range( )) # use sparingly for in 3 x for in 3 for in 3 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 = b = a a = print(a == b) a = [ , , ] b = a c = [ , , ] a[ ] = print(a == b == c) print(a b) print(a c) 5 6 # false # vs. 1 2 3 1 2 4 2 4 # true is # true; same refrence is # false Esto es especialmente importante cuando se trata de iterables anidados con la forma en que crea iterables anidados y también los . Pruebe estos ejemplos usted mismo. copia lols = [[ ] i range( )] lols[ ][ ] = print(lols) a = [[ ]] lols = a * lols[ ][ ] = print(lols) 0 for in 3 # [0] is created 3 times 0 0 5 # [[5], [0], [0]] # vs. 0 3 # same as lols = [[0] * 3] 0 0 5 # [[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 , podemos usar el módulo de copia. profunda new_copy = lols.copy() reversed_list = lols[:: ] new_copy[ ][ ] = lols == new_copy lols new_copy copy deepcopy new_copy = deepcopy(list_of_lists) new_copy = list_of_lists new_copy[ ][ ] = lols != new_copy lols new_copy # I prefer this over using [:] -1 # I rarely use this^ as reversed() and .reverse() exist 0 0 6 # lols == [[6], [6], [6]] assert and not is from import 0 0 4 # [[4], [4], [4]] because 3x of the same list assert and is not 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. cache = {} x cache: print( ) cache[x] = func(x) : print( ) cache[x] _helper x * x i range( ): square(i), square(i) : def memo (func) # remove print statements in a practical setting : def _helper (x) # constrained to one param (in this case) # you could have multiple params (x, y, ...) and then # cache using tuple keys if not in 'not in cache' else 'in cache' return return @memo # square = memo(square) <-- what it means : def square (x) return for in 3 # 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. [ , , , ].sort(key= string: string.upper()) [( , ), ( , )].sort(key= pair: pair[ ]) sorted([( , ), ( , )], key= pair: pair[ ]) max([( , ), ( , )], key= pair: pair[ ]) 'aa' 'Bb' 'Cc' 'dD' lambda 'a' 1 'b' 0 lambda 1 'a' 1 'b' 0 lambda 1 'a' 1 'b' 0 lambda 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 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() # existing files only os.rmdir() os.getenv( ) # gets an environmental variable # use the shutil directories sub directoriese import for 'key' module for with Variables ambientales Especifique los secretos del proyecto en un expediente .env KEY=VALUE open( ) f: line f.read().splitlines(): k, v = line.split( , ) os.environ[k] = v # in .env # in *.py with '.env' as for in '=' 1 globo Se utiliza para obtener una lista de archivos/carpetas glob glob print(glob( )) from import '*.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 . Simplemente siga las instrucciones en la esencia. aquí 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 , así que busque eso por su cuenta. __slots__ 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 ll have to get a Spotify API key See https: make a program that lets users search tracks using the Spotify API (you a list tracks) See https: You just need to spit out a list tracks To make harder, you will sort the tracks by popularity (you a t have to) - Let your soundboard include support different - Specify a design/package guide other users to create use their sounds on your soundboard : your pack PACKS_DIR/pack_name/sound_name/sound .mp3/ogg # pygame, playsound Make your own game using pygame (OOP) Turn one these projects into an executable [Okay but Tedious] - use sys.exit() instead quit() pyinstaller, or cx_freeze Make your own discord bot [variable difficulty] ( ) Email me or comment bigger programming (not specifically Python) project ideas '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' //developer.spotify.com/documentation/web-api/reference/search/search/ and for return of //elijahlopez.herokuapp.com/search-album-art/ for a demo but with album art of this '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 ' ' 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' for "packs" for default default of of async for Comenta si tienes alguna pregunta. Gracias por leer y buena suerte en su viaje de aprendizaje.