2010-07-28 4 views
9

¿Puedo hacer algo como esto en Python?Python: ¿hay un bucle de tipo C disponible?

for (i = 0; i < 10; i++): 
    if someCondition: 
    i+=1 
    print i 

tengo que ser capaz de pasar por alto algunos valores basados ​​en una condición

EDIT: Todas las soluciones hasta ahora sugieren la poda de la gama inicial de una forma u otra, en base a una condición ya conocida. Esto no es útil para mí, así que déjame explicarte lo que quiero hacer.

Quiero manualmente (es decir, sin getopt) analizar algunos argumentos de línea de cmd, donde cada 'palabra clave' tiene un cierto número de parámetros, algo como esto:

for i in range(0,len(argv)): 
    arg = argv[i] 
    if arg == '--flag1': 
     opt1 = argv[i+1] 
     i+=1 
     continue 
    if arg == '--anotherFlag': 
     optX = argv[i+1] 
     optY = argv[i+2] 
     optZ = argv[i+3] 
     i+=3 
     continue 

    ... 
+2

¿Qué es lo que en realidad estás tratando de hacer? – SilentGhost

+0

pregunta actualizada con más información ... –

+1

Siempre hay 'while' para ti. – Constantin

Respuesta

6

Hay dos cosas que podría hacer para resolver su problema:

  • requieren argumentos separados por comas que se agruparán en el siguiente valor de opción, puede usar getopt o cualquier otro módulo.
  • o hacer más frágil propio procesamiento:

    sys.argv.pop() 
    cmd = {} 
    while sys.argv: 
        arg = sys.argv.pop(0) 
        if arg == '--arg1': 
         cmd[arg] = sys.argv.pop(0), sys.argv.pop(0) 
        elif: 
         pass 
    print(cmd) 
    
+0

La idea de usar argv como una pila es ideal para mis necesidades, y elimina el acceso basado en el índice a la lista. –

17

Sí, esta es la forma en que lo haría que

>>> for i in xrange(0, 10): 
...  if i == 4: 
...   continue 
...  print i, 
... 
0 1 2 3 5 6 7 8 9 

EDITAR
sobre la base de la actualización a su pregunta original ... yo sugeriría que echar un vistazo a optparse

+0

Quieres decir que sí :) –

+0

La impresión debe ser "0 1 2 3 5 6 7 8 9" – che

+0

@che: Sí, ya ha arreglado eso ... a veces tengo dedos gordos por la mañana. – sberry

2

Debe usar continue para omitir un valor, tanto en C como en Python.

for i in range(10): 
    if someCondition: 
    continue 
    print(i) 
+0

Sin embargo, un salto no saltará el valor ... saldrá del bucle for. ¿No querrías un 'continuar'? – sberry

+0

@sberry: Sí ... ¿Qué estaba pensando: p – kennytm

5

manera Extraño:

for x in (x for x in xrange(10) if someCondition): 
    print str(x) 
2

Es probable que no necesita realmente los índices, es probable que tenga los elementos reales. Una mejor solución sería probablemente como esto:

sequence = 'whatever' 
for item in sequence: 
    if some_condition: 
     continue 
    do_stuff_with(item) 
+0

Quería usar un iterador sobre un bucle for en cualquier momento del día, sin embargo, no puedo pensar en una forma de utilizar la iteración en mi situación - ver la pregunta actualizada –

-1
for i in xrange(0, 10): 
    if i % 3 == 0 
     continue 
    print i 

Will únicos valores que no son divisibles por 3.

-1

Si necesita iterar sobre algo, y necesitan un índice, utilice enumerate()

for i, arg in enumerate(argv): 
    ... 

el que hace lo mismo que el cuestionario

for i in range(0,len(argv)): 
    arg = argv[i] 
-1

Su problema parece ser que no debe buclear los parámetros sin procesar sino los parámetros analizados. Le sugiero que considere cambiar su decisión de no usar el módulo estándar (como los demás).

1

En primer lugar, podría dar vuelta a la lista argv en un generador:

def g(my_list): 
    for item in my_list: 
     yield item 

A continuación, puede pasar por los elementos, invocando el generador según sea necesario:

my_gen = g(sys.argv[1:]): 
while True: 
    try: 
     arg = my_gen.next() 
     if arg == "--flag1": 
     optX = my_gen.next() 
     opyY = my_gen.next() 
     --do something 
     elif arg == "--flag2": 
     optX = my_gen.next() 
     optY = my_gen.next() 
     optZ = my_gen.next() 
     --do something else 
     ... 
    except StopIteration: 
     break 
+0

¿cómo es eso diferente de iterar sobre una lista? simplemente más problemas. – SilentGhost

+0

La idea es buena, pero ¿por qué convertir 'sys.argv [1:]' a una instancia de generador en lugar de a un iterador? P.ej. 'my_gen = iter (sys.argv [1:])' obtendrá los mismos resultados que tu función 'g'. –

+0

Además, en lugar de usar 'while' con' try: excepto StopIteration: 'a for loop logrará lo mismo. Simplemente: 'para arg en my_gen'. Todavía puede usar 'my_gen.next()' en el ciclo. –

5
for (i = 0; i < 10; i++) 
    if someCondition: 
     i+=1 
print i 

en Python sería escrito como

i = 0 
while i < 10 
    if someCondition 
     i += 1 
    print i 
    i += 1 

the re you go, así es como escribir un ciclo de c en python.

+0

Si 'somecondition' es verdadero, incrementa' i' dos veces ... –

+3

@Cristi sí, pero eso estaba en el código de ejemplo original en la pregunta, así que pensé que eso era lo que quería. – Netzsooc

Cuestiones relacionadas