Новичок в программировании, для практики я пытаюсь запрограммировать оракула И-Цзин. Я получаю вывод, который хочу, но только копируя этот блок кода в мою программу 6 раз.

Есть ли условие цикла, которое я могу установить, чтобы сделать это более кратким?

Я прочитал документы и инструкции по зацикливанию, но не видел, как это можно применить в этом контексте.

import random 

oracle = random.randint(6,9)

if oracle == 6:
   print "__ __~"
elif oracle == 7:
 print "_____"
elif oracle == 8:
 print "__ __"
elif oracle == 9:
 print "_____~"   (X6)

=> это вывод, который я получаю:

_____
__ __
__ __~
_____
_____~
__ __
1
Benjamin James 31 Янв 2013 в 02:01

5 ответов

Лучший ответ

Вы можете использовать такой цикл while:

import random 

counter = 0

while counter < 6:
    oracle = random.randint(6,9)

    if oracle == 6:
       print "__ __~"
    elif oracle == 7:
       print "_____"
    elif oracle == 8:
       print "__ __"
    elif oracle == 9:
       print "_____~"

    counter += 1
1
pemistahl 30 Янв 2013 в 22:12

Вы также можете заменить этот стек if и elif на словарь, а цикл - на понимание списка, и уменьшить его до нескольких строк.

d = {6: "__ __~", 7: "_____" , 8: "__ __" , 9: "_____~",}
print '\n'.join([d[random.randint(6, 9)] for j in range(6)])
0
tacaswell 30 Янв 2013 в 22:21

Обратите внимание, что ваше распределение вероятностей неверно.

Чтобы читать по-и-цзински, вы должны бросить 3 честные монеты и набрать 2 очка за каждый хвост и 3 очка за каждую голову:

Coin1  Coin2  Coin3  Points
t      t      t      6
t      t      h      7
t      h      t      7
t      h      h      8
h      t      t      7
h      t      h      8
h      h      t      8
h      h      h      9

Вы можете видеть, что есть 3 способа суммирования до 7 или 8, но только один способ суммирования до 6 или 9; таким образом, распределение должно составлять 6: 12,5%, 7: 37,5%, 8: 37,5%, 9: 12,5%. randint дает равномерное распределение, то есть 25% каждый.

Я бы предложил примерно следующее:

from random import randint

xyin  = "__ __~"
yang  = "_____"
yin   = "__ __"
xyang = "_____~"

three_coins = [ xyin, yang, yang, yin, yang, yin, yin, xyang ]

def cast():
    return three_coins[randint(0, 7)]

def hexagram():
    return '\n'.join(cast() for i in range(6))

print hexagram()
3
Hugh Bothwell 31 Янв 2013 в 02:34

Что-то вроде этого?

import random 

for n in range(6):
  oracle = random.randint(6,9)
  if oracle == 6:
    print "__ __~"
  elif oracle == 7:
    print "_____"
  elif oracle == 8:
    print "__ __"
  elif oracle == 9:
    print "_____~"

Выход:

__ __
__ __~
_____~
__ __~
_____~
1
Jess 31 Янв 2013 в 14:19

Используйте для цикла конструкцию, как это:

import random 

for x in range(6):  # Loop 6 times
    oracle = random.randint(6,9)
    if oracle == 6:
       print "__ __~"
    elif oracle == 7:
       print "_____"
    elif oracle == 8:
       print "__ __"
    elif oracle == 9:
       print "_____~"   (X6)

Подробнее о функции диапазона от help(range):

range (...) range ([start,] stop [, step]) -> список целых чисел

Return a list containing an arithmetic progression of integers.
range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.

Вы также можете использовать конструкцию while для достижения того же эффекта.

start = 0
stop = 6
while start < stop:
    #Your code-block here
    start = start+1
1
sidi 30 Янв 2013 в 22:13