2014-10-24 7 views
0

Я делаю простой симулятор лотереи. У меня есть два взаимоисключающих флажка командной строки, поэтому либо программа выполняет количество ничьих, которые пользователь указывает, или пока вы не нажмете Джекпот.Условие в цикле FOR в Python

for i in range(args.draws): 
    perform lottery draws here 

Как изменить для цикла таким образом, что если args.draws не дано должно бежать до джекпота удар. Я теперь недобросовестный на args.draws до очень большого числа так почти во всех случаях джекпот хит, а затем разорвать петлю, но есть лучший способ сделать это

Вот весь код. Это не очень. Я просто изучаю Python.

import random 
import argparse 
def oneoutof(occurance, times): 
    if occurance == 0:return 0 
    return float(times)/float(occurance) 

if __name__ == '__main__': 
    LOTTERY_NUMBERS = [i + 1 for i in range(39)] 
    WIN_LIST =[0,0,0,0] 
    six_plus_one = 0 
    parser = argparse.ArgumentParser(description="[Lottery]\n" 
    "Example: python3 lottery.py ") 
    group = parser.add_mutually_exclusive_group() 

    group.add_argument("-s","--seven",action="store_true", 
     help="Stop when you hit 7 right") 
    group.add_argument("-d","--draws",type=int,default=1000000, 
     help="Stop after number of draws") 
    parser.add_argument("-n","--numbers", nargs=7, type = int,choices=range(1, 40), 
     help="Lottery numbers, if not given will be randomly selected") 

    args = parser.parse_args() 



    if args.numbers ==None: 
     print('You did not give lottery numbers so following numbers are randomly selected') 
     picked_numbers = set(random.sample(LOTTERY_NUMBERS, 7)) 

     print(*picked_numbers) 
     print('Number of lottery draws is {:,}'.format(args.draws)) 
    else: 
     picked_numbers = set(args.numbers) 
     print('Number of lottery draws is {:,}'.format(args.draws)) 

    for i in range(args.draws): 
     lotto_numbers = set(random.sample(LOTTERY_NUMBERS, 7)) 
     remaining_nbrs = set(LOTTERY_NUMBERS).difference(lotto_numbers) 
     extra_nmbs = set(random.sample(remaining_nbrs, 3)) 


     correct_numbers = lotto_numbers&picked_numbers 
     correct_extranmbs = extra_nmbs&picked_numbers 

     if len(correct_numbers) > 3 and not (len(correct_numbers) == 6 and correct_extranmbs): 
      index = len(correct_numbers) - 4 
      WIN_LIST[index] = WIN_LIST[index] + 1 
      if len(correct_numbers) == 7 and args.seven: 
       print("You hit JACKPOT {} round".format(i)) 
       break     
     elif len(correct_numbers) == 6 and correct_extranmbs: 
      six_plus_one=six_plus_one+1 



    print('4 correct %i times, one out of %g\n' 
      '5 correct %i times, one out of %g\n' 
      '6 correct %i times, one out of %g\n' 
      '6+1 correct %i times, one out of %f\n' 
      '7 correct %i times, one out of %f\n' 
      %(WIN_LIST[0],oneoutof(WIN_LIST[0], args.draws), 
      WIN_LIST[1],oneoutof(WIN_LIST[1], args.draws), 
      WIN_LIST[2],oneoutof(WIN_LIST[2], args.draws), 
      six_plus_one,float(args.draws)/float(six_plus_one) if six_plus_one else 0, 
      WIN_LIST[3],oneoutof(WIN_LIST[3], args.draws))) 
+0

Вы можете показать нам сами попробовать? – Kasramvd

+0

@ d-coder Я откатил ваше редактирование, так как он сделал отступ в OPs неправильным ... будьте очень осторожны при изменении кодовых блоков (это очень редко вам нужно будет), поскольку вы полностью изменили значение кода OPs. –

+2

@JonClements Oh! Сожалею. Это не было моим намерением. –

ответ

0

Нам нужен импорт в верхней части файла:

from itertools import count, islice 

Тогда мы можем изменить некоторые из вашего кода ...

Во-первых, установите значение по умолчанию args.draws равным None - мы можем использовать это как "безлимитный".

group.add_argument("-d","--draws", type=int, default=None, help="Stop after number of draws") 

Затем мы корректируем свой print принять во внимание, что None не может быть отформатирован как целое, поэтому мы заменим его с максимально возможным количеством float('inf'), который будет успешно еще отображаться как inf при печати с {:,} форматирования , так:

print('Number of lottery draws is {:,}'.format(args.draws or float('inf'))) 

Затем, вместо зацикливания в диапазоне, мы перебираем бесконечную последовательность, но довершение к n многим элементам, которые либо целое или None (что означает не применить ограни t к этой последовательности):

for i in islice(count(1), args.draws): 
    # ... 
+0

Это работает и делает аргумент -s устаревшим – Skugge

0

Вместо этого вы можете использовать цикл while.

if(args.draws.length!=0) 

     for i in range(args.draws): 
     perform lottery draws here 

else 

    while(!jackpotHit) 
     perform lottery draws here 
0

Я хотел бы использовать itertools.count:

from itertools import count 

draws = range(args.draw) if args.draw is not None else count() 
for i in draws: 
    perform lottery draws here 
+0

Спасибо, что вам удалось сделать работу – Skugge