2010-07-28 4 views
9

Puis-je faire quelque chose comme ça en Python?Python: existe-t-il une boucle de type C disponible?

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

Je dois être en mesure de sauter certaines valeurs basées sur une condition

EDIT: Toutes les solutions suggèrent jusqu'à la taille la gamme initiale d'une manière ou d'une autre, sur la base d'une condition connue déjà. Ce n'est pas utile pour moi, alors laissez-moi vous expliquer ce que je veux faire.

Je veux manuellement (pas de getopt) analyser certains args ligne cmd, où chaque « mot-clé » a un certain nombre de paramètres, quelque chose comme ceci:

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'est-ce que vous essayez réellement de faire? – SilentGhost

+0

question mise à jour avec plus d'info ... –

+1

Il est toujours 'while 'pour vous. – Constantin

Répondre

6

Il y a deux choses que vous pouvez faire pour résoudre votre problème:

  • nécessitent des arguments séparés par des virgules qui vont être groupés dans la valeur d'option suivante, vous pouvez utiliser getopt, ou tout autre module alors.
  • ou faire propre traitement plus fragile:

    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

L'idée d'utiliser argv en tant que pile convient parfaitement à mes besoins et supprime l'accès indexé à la liste. –

17

Oui, voilà comment je ferais il

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

EDIT
sur la base de la mise à jour à votre question initiale ... Je vous suggère de jeter un oeil à optparse

+0

Vous voulez dire oui :) –

+0

L'impression devrait être "0 1 2 3 5 6 7 8 9" – che

+0

@che: Oui, déjà fixé que ... eu de gros doigts le matin parfois. – sberry

2

Vous devez utiliser continue pour ignorer une valeur dans C et Python.

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

Une pause n'échappera pas à la valeur ... elle va sortir de la boucle for. Ne voudriez-vous pas un «continuer»? – sberry

+0

@sberry: Oui ... Que pensais-je: p – kennytm

5

façon étrange:

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

Vous n'avez probablement pas besoin réellement les indices, vous avez probablement besoin des éléments réels. Une meilleure solution serait probablement comme ceci:

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

J'utiliserais un itérateur sur une boucle for à n'importe quel moment de la journée, mais je ne peux pas trouver un moyen d'utiliser l'itération dans ma situation - voir la question mise à jour –

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

Est-ce que les valeurs qui ne sont pas divisibles par 3.

-1

Si vous devez itérer sur quelque chose, et besoin d'un index, utilisez enumerate()

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

qui fait la même chose que le questionneur

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

Votre problème semble être que vous ne devez pas boucler les paramètres bruts mais les paramètres analysés. Je vous suggère de considérer de changer votre décision de ne pas utiliser le module standard (comme les autres).

1

Vous pouvez d'abord activer la liste argv dans un générateur:

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

Vous pouvez ensuite passer les éléments, invoquant le générateur au besoin:

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

comment est-ce différent que d'itérer sur une liste? juste plus de tracas. – SilentGhost

+0

L'idée est bonne, mais pourquoi convertir 'sys.argv [1:]' en une instance de générateur plutôt qu'un itérateur? Par exemple. 'my_gen = iter (sys.argv [1:])' vous obtiendra les mêmes résultats que votre fonction 'g'. –

+0

En outre, au lieu d'utiliser 'while' avec' try: except StopIteration: 'une boucle for accomplira la même chose. Simplement: 'pour arg dans my_gen'. Vous pouvez toujours utiliser 'my_gen.next()' dans la boucle. –

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

En python serait écrit comme

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

le re allez, c'est comment écrire un c pour la boucle en python.

+0

Si 'somecondition' est vrai, vous incrémentez' i' deux fois ... –

+3

@Cristi oui mais c'était dans le code d'exemple original dans la question, donc j'ai pensé que c'était ce qu'il voulait. – Netzsooc