Pregunta Asesoramiento para el programador C # escribiendo Python [cerrado]


Principalmente he estado haciendo desarrollo de C # en los últimos años, pero recientemente comencé a hacer un poco de Python (no de Iron Python). Pero no estoy seguro de si he dado el salto mental a Python ... Siento que estoy tratando de hacer las cosas como lo haría en C #.

¿Algún consejo sobre cómo puedo aprovechar plenamente Python?

¿O algún consejo, trucos, cosas de las que aprender, cosas de las que tener cuidado?


73
2018-03-25 20:18


origen


Respuestas:


Primero, verificar tgray y Lundström Consejo.

Entonces, algunas cosas que tal vez quiera saber:

  • Python se tipea dinámicamente, por lo que a diferencia de C #, no se comprobar el tipo, pero el comportamiento. Es posible que desee google sobre pato mecanografía. Implica que no tienes que lidiar con el boxeo y unboxing.

  • Python está completamente orientado a objetos, pero la sintaxis no hacer cumplir este paradigma. Puedes escribir Python sin usar la palabra "clase".

  • La biblioteca de GUI presentada con Python no se puede comparar con C # 's. Comprobar PyQt, GTK o wxPython bibliotecas.

  • Python tiene muchos conceptos con los que quizás no estés familiarizado: lista de comprensiones, generadores ("yield" existe en C #, pero no se usa mucho), decoradores, metaclases, etc. No lo hagas tener miedo; puedes programar en Python sin ellos. Ellos son solo herramientas inteligentes, no obligatorias.

  • Al igual que en C #, la biblioteca estándar de Python es enorme. Siempre míralo cuando encuentres algún problema. Es más es probable que alguien ya lo haya resuelto.

  • Python utiliza etiquetas de enlace y variable TARDÍAS. Está demasiado lejos temprano para alguien que comienza con el idioma que preocuparse al respecto, pero recuerde que un día se encontrará con un comportamiento con variables que PARECE ilógica, y usted tiene que verificar eso. Por el momento:

Solo recuerde nunca hacer lo siguiente:

def myfunc(my_list=[]) :
   # bla

En lugar:

def myfunc(my_list=()) :
   my_list = list(my_list)

Y estarás bien. Hay una buena razón para eso, pero ese no es el punto :-)

  • Python es multiplataforma, disfruta escribiendo en Mac, y ejecutar en Linux, si lo desea.

  • Python no cuenta con un IDE complejo (tienes OCIOSO :-)). Si eres un adicto a Visual Studio, revisa Claro. Esto es no tan avanzado como Visual Studio, pero sigue siendo un buen RAD.

  • Si quieres desarrollar alguna aplicación web en Python, recuerda que Python no es .NET. Debes agregar una web marco de trabajo si quieres comparar. me gusta Django.

  • Python no necesita un gran IDE para trabajar. SciTE, Notepad ++, OCIOSO, Kate, gedit... Los editores ligeros son realmente suficientes.

  • Python impone sangría usando espacios y salto de línea, no puedes cambiar eso Debes evitar usar pestañas para sangrado y elegir espacios en su lugar. El equivalente de pulseras vacías {} es la palabra clave "pase".

  • Python no aplica las variables privadas. Puedes definir un var privado usando "__" (dos guiones bajos) al comienzo de el nombre de la variable, pero todavía es pasable en algún complicado formas. Python usualmente asume que los programadores son adultos crecidos que saben lo que hacen y se comunican

  • Python usa iteración. Mucho. Mucho. Y entonces el Módulo itertools es tu mejor amigo.

  • Python no tiene delegados integrados. El módulo delegado es no es lo que piensas. Para la programación basada en eventos, use un GUI lib (o codifique el patrón usted mismo, no es eso difícil).

  • Python tiene un intérprete: puedes probar casi cualquier cosa, vivir. Siempre debe estar ejecutándose al lado de su texto editor. El intérprete básico de Python no es mucho, prueba IPython para algo sabroso

  • Python es autodocumentado: use documentos en su propio código y consultar a los demás usando "help ()" en el intérprete de python

Conceptos básicos del módulo:

  • sys: manipular las características del sistema
  • os: establecer credenciales, manipular rutas de archivos, renombrar, recorridos de archivos recursivos, etc.
  • shutil: procesamiento de archivos por lotes (como eliminación recursiva)
  • re: regexp
  • urllib y urllib2: secuencias de comandos HTTP como descargar, publicar / obtener resúmenes, etc.
  • fecha y hora: manipular fecha, hora Y DURACIÓN
  • hilo: lo adivinas
  • zlib: compresión
  • pickle: serialización
  • xml: análisis / escritura de XML con SAX o DOM

Hay cientos de módulos. Disfrutar.

Algunas formas típicas de hacer cosas en Python:

Bucles:

Los codificadores Python usan masivamente el equivalente del foreach DO# loop, y lo prefieres a cualquier otro:

Iteraciones básicas:

for item in collection:
    print str(item)

"colección" puede ser una cadena, una lista, una tupla ... Cualquiera iterable: cualquier objeto que define el método .next (). Existen una gran cantidad de iterables en Python. E.g: una expresión idiomática típica de Python para leer archivos:

for line in open("/path/to/file") :
    print line

Un atajo al bucle for se llama "lista de comprensión". Es una forma de crear un nuevo iterable en una línea:

Crear una lista filtrada con comprensión de lista:

my_list = [item for item in collection if condition]

Crear una nueva lista con una lista de comprensión:

my_list = [int(item) * 3 for item in collection]

Creando un nuevo generador con una lista de comprensión:

my_list = (int(item) * 3 for item in collection)

Lo mismo que arriba, pero los valores se generarán sobre la marcha en la primera iteración, luego se pierde. Más información al respecto aquí.

Ordinary for loop

Si desea expresar un bucle for usual, puede usar función xrange () for (int i = 0; i < 5; i++) se convierte en:

for i in xrange(0,5) :

hacer mientras equivalente

No hay "Do While" en Python. Nunca me lo perdí, pero si tienes que usar esta lógica, haz lo siguiente:

while True : # Yes, this is an infinite loop. Crazy, hu?

  # Do your stuff

  if condition :
      break

Desempacando

Intercambio de variables:

a, b = b, a

Múltiples asignaciones:

Lo anterior es solo el resultado de lo que llamamos "desembalaje" (aquí aplicado a una tupla). Una forma simple de explicarlo es que tu puede asignar cada valor de cualquier secuencia directamente a un igual numerar las variables, en una fila:

animal1, animal2, animal3, animal4 = ["cow", "dog", "bird", "fish"]

Esto tiene muchas implicaciones. Mientras itera en un matriz multidimensional, normalmente obtiene cada secuencia secundaria uno a uno, luego utilícelos, por ejemplo:

agenda = [("steve", "jobs"), ("linus", "torvald"), ("bill", "gates"),("jon", "skeet")]
for person in agenda:
    print person[0], person[1]

Pero con el desembalaje, puede asignar los valores directamente a variables también:

agenda = [("steve", "jobs"), ("linus", "torvald"), ("bill", "gates"),("jon", "skeet")]
for name, lastname in agenda:
    print name, lastname

Y es por eso que si quieres obtener un índice mientras iteras, Los codificadores de Python utilizan los siguientes modismos (enumerate () es un función estándar):

for index, value in enumerate(sequence) :
    print index, value

Desempaquetado en llamadas de funciones

Este es un uso avanzado, y puede omitirlo si le molesta.

Puede descomprimir valores usando el signo "*" para usar una secuencia directamente en una llamada de función. P.ej:

>>> foo(var1, var1, var3) :
    print var1, var2
    print var3
>>> seq = (3.14, 42, "yeah")
>>> foo(*seq)
3.14 42
yeah

Hay incluso más que eso. Puede descomprimir un diccionario como variables nombradas, y escribir prototipos de funciones con *, ** para aceptar una cantidad arbitraria de argumentos Pero no usado lo suficiente como para merecer que esta publicación sea aún más larga :-).

Formato de cadena:

print "This is a %s on %s about %s" % ("post", "stackoverflow", "python")
print "This is a %(subject)s on %(place)s about %(about)s" % {"subject" : "post", "place" : "stackoverflow", "about" : "python"}

Cortando un iterable:

Puede obtener cualquier parte de un iterable usando una sintaxis muy concisa:

print "blebla"[2:4] # Print "eb"
last = string[:-1] # Getting last element
even = (0,1,2,3,4,5,6,7,8,9)[::2] # Getting evens only (third argument is a step)
reversed = string[::-1] # Reversing a string

Controles lógicos:

Puede verificar la forma en que lo hace en C #, pero hay "Pythonic" maneras (más cortas, más claras :-)):

if 1 in (1, 2, 3, 4) : # Check en element is in a sequence

if var : # check is var is true. Var == false if it's False, 0, (), [], {} or None

if not var : # Contrary of above

if thing is var: # Check if "thing" and "var" label the same content.

if thing is None : # We use that one because None means nothing in Python (almost null)

Combo (imprima en una línea todas las palabras que contengan una "o" en mayúsculas):

sentence = "It's a good day to write some code"
print " ".join([word.upper() for word in sentence.split() if "o" in word])

Salida: "BUENO PARA ALGUN CÓDIGO"

Es más fácil pedir perdón que permiso

Los codificadores de Python generalmente no verifican si algo es posible. Son un poco como Chuck Norris. Ellos lo hacen. Entonces atrapa la excepción. Por lo general, no verifica si existe un archivo, intenta abrirlo y retroceder si falla:

try :
    f = open(file)
except IOerror :
    print "no file here !"

Por supuesto, Chuck Norris nunca usa excepciones ya que nunca falla.

La cláusula else

"Else" es un mundo de muchos usos en Python. Usted encontrará "else" después de "if", pero después de "except" y "for" también.

for stuff in bunch :
    # Do things
else :
    # This always happens unless you hit "break" in the loop

Esto también funciona para el ciclo "while", incluso si no usamos esto lazo tanto.

   try :
      # A crazy stuff
   except ToCrazyError :
      # This happens if the crazy stuff raises a ToCrazyError Exception
   else :
      # This will happen if there is no error so you can put only one line after the "try" clause
   finally :
      # The same as in C#

Si tiene curiosidad, aquí hay un grupo de avanzado rápido y sucio (pero agradable) Fragmentos de Python.


151
2018-03-25 20:41



  • Abstenerse de usar clases. Usa diccionarios, conjuntos, listas y tuplas.
  • Setters y getters están prohibidos.
  • No tenga manejadores de excepciones a menos que realmente lo necesite, deje que se cuelgue con estilo.
  • Pylint puede ser tu amigo para un estilo de codificación más pitón.
  • Cuando esté listo, consulte la lista de comprensiones, generadores y funciones lambda.

16
2018-03-25 20:38



Si no eres nuevo en la programación, te recomendaría el libro "Sumérgete en Python" por Mark Pilgrim. Explica Python de una manera que hace que sea fácil entender cómo se pueden aplicar las técnicas y modismos de Python para crear aplicaciones prácticas.


13
2018-03-25 20:38



Comience leyendo El Zen de Python

Puedes leerlo en el enlace de arriba, o simplemente escribir import this en el prompt de Python. =)

Aproveche las funciones de Python no ofrecidas * por C #

Como escribir patos, metaclases, comprensión de listas, etc. *

Escribe programas simples solo para probar estas características. Te acostumbrarás (si no eres adicto) a ellos en poco tiempo.

Mira el Biblioteca estándar de Python

Entonces no reinventas la rueda. No trates de leer todo, incluso una mirada rápida al TOC podría ahorrarte mucho tiempo.


* Sé que C # ya tiene algunas de estas características, pero por lo que puedo ver, son bastante nuevas o no muy utilizadas por los desarrolladores de C #. Por favor corrígeme si estoy equivocado.


6
2018-03-25 20:39



En caso de que no lo haya escuchado aún, Sumérgete en Python es un gran lugar para comenzar para cualquiera que aprenda Python. También tiene un montón de consejos y trucos.


5
2018-03-25 20:23



Si usted es alguien que está aprendiendo mejor un nuevo idioma tomando pequeños pasos incrementales, entonces le recomendaría usar IronPython. De lo contrario, use regularmente CPython y no hagas más codificaciones de C # hasta que sientas que tienes una comprensión de Python.


3
2018-03-25 20:26



Sugeriría obtener un buen editor para que no te muerda el espacio en blanco. Para simplificar, solo uso los paquetes de ActivePython Enlazar, que incluyen un editor y todas las bibliotecas de win32api. Son muy divertidos si has estado usando C #. El win32api en Python puede ser un poco más simple. No es necesario que haga todo el asunto DDLImport. Descargue ActivePython (que viene con CPython), ábralo y comience a ingresar algunas cosas en la consola. Lo recogerás bastante fácil después de usar C #. Para algunos detalles interesantes de Python, prueba Código ActiveState, que tiene todo tipo de recetas, que pueden permitirle ver muy simplemente diferentes cosas que puede hacer con Python.


2
2018-03-26 18:53



También estoy en tu lugar, aún usando C # para la mayor parte de mi trabajo, pero usando Python cada vez más para otros proyectos.

@ e-satis probablemente conoce Python al revés y todos sus consejos son de primera categoría. Desde mi punto de vista, lo que más me diferenció fue lo siguiente:

Vuelve a funcional. no necesariamente el código de espagueti, pero aprender que no todo tiene que estar en un objeto, ni debería serlo.

El interprete. Es como la ventana inmediata excepto 10 ^ 10 mejor. Debido a la forma en que funciona Python, no necesitas todo el equipaje y la mierda C # te hace ingresar antes de que puedas ejecutar las cosas; puedes simplemente golpear algunas líneas y ver cómo funcionan las cosas.

Normalmente tengo una instancia IDLE en la que simplemente lanzo fragmentos mientras estoy averiguando cómo funcionan los diversos bits en el idioma mientras estoy editando mis archivos ... p. ocupado en cómo hacer una llamada al mapa en una lista, pero no estoy al 100% en el lambda que debería usar ... pinchar algunas líneas en IDLE, ver cómo funciona y qué hace.

Y finalmente, amando la verbosidad de Python, y no me refiero a eso en el largo sentido de la verbosidad, sino como lo señaló e-satis, usando verbos como "in", "is", "for", etc.

Si hiciste un montón de trabajo de reflexión en C #, tendrás ganas de llorar cuando veas lo simple que es lo mismo en Python.

Suerte con ello.


2
2018-03-25 21:02



Si tienes experiencia en programación y no tienes ganas de gastar dinero, te recomendaría Cómo pensar como un informático en Python.


1
2018-03-26 14:31



Y luego, algo de lo que puede beneficiarse:

IPython shell: finalización automática en el shell. Realiza operaciones por lotes, agrega un montón de características, registro y demás. >>> Juega con el caparazón - ¡siempre!

Instalación fácil / pepita: Es una forma sencilla y fácil de instalar una aplicación de Python de terceros.


0