2016-06-23 4 views
-4

Я сделал сценарий для вычисления вероятности точки в теннисном матче, в зависимости от текущего балла.Python, Почему мой скрипт не работает?

Но по какой-то причине, когда я хочу запустить мой скрипт, ничего не происходит. В сценарии есть объяснение.

Любые предложения?

## calculate the probability of server winning a single game, 
## given p(winning single point) and current point score 

def fact(x): 
    if x in [0, 1]: return 1 
    r = 1 
    for a in range(1, (x+1)): r = r*a 
    return r 

def ch(a, b): 
    return fact(a)/(fact(b)*fact(a-b)) 

def gameOutcome(s, a, b): 
    return ch((a+b), a)*(s**a)*((1-s)**b)*s 

def gameProb(s=[0.6], v=2, w=1): 
    ## function calculates the probability of server winning 
    ## a single game, given p(winning any given point) [s], 
    ## and the current point score. 
    ## v, w = current game score, where love = 0, 15 = 1, etc. 
    ## - e.g. 30-15 is v=2, w=1 
    ## check if game is already over: 
    if v >= 4 and (v-w) >= 2: 
     return 1 
    elif w >= 4 and (w-v) >= 2: 
     return 0 
    else: pass 
    ## if deuce or ad score e.g. 5-4, reduce to e.g. 3-2 
    while True: 
     if (v+w) > 6: 
      v -= 1 
      w -= 1 
     else: break 
    ## specific probabilities: 
    if w == 0: w0 = gameOutcome(s, 3-v, 0) 
    else: w0 = 0 
    if w <= 1: w15 = gameOutcome(s, 3-v, 1-w) 
    else: w15 = 0 
    if w <= 2: w30 = gameOutcome(s, 3-v, 2-w) 
    else: w30 = 0 
    if v == 4: 
     wAd, lAd = s, 0 
     d = 1-s 
    elif w == 4: 
     wAd, lAd = 0, 1-s 
     d = s 
    else: 
     wAd, lAd = 0, 0 
     a = 3 - v 
     b = 3 - w 
     d = ch((a+b), a)*(s**a)*((1-s)**b) 
    if v <= 2: l30 = gameOutcome((1-s), 3-w, 2-v) 
    else: l30 = 0 
    if v <= 1: l15 = gameOutcome((1-s), 3-w, 1-v) 
    else: l15 = 0 
    if v == 0: l0 = gameOutcome((1-s), 3-w, 0) 
    else: l0 = 0 
    ## given d = prob of getting to deuce, 
    ## math to divide up further outcomes 
    denom = s**2 + (1-s)**2 
    wd = (d*(s**2))/denom 
    ld = (d*((1-s)**2))/denom 
    win = w0 + w15 + w30 + wd + wAd 
    lose = l0 + l15 + l30 + ld + lAd 
    return win 
+0

'Return win' ->' return win' и чтобы увидеть функции в действии, вы должны вызвать соответствующую функцию. –

+2

Беда, что ты ничего не звонишь. – IanAuld

+0

Ваш скрипт состоит из множества определений функций. На самом деле это ничего не делает. – melpomene

ответ

1

s с плавающей точкой, так, замените эту строку:

def gameProb(s=[0.6], v=2, w=1): 

с

def gameProb(s=0.6, v=2, w=1): 

и вызвать функцию в конце сценария:

print gameProb() 

Вы можете также называйте это:

if __name__ == "__main__": 
    print gameProb() 

Это делает ваш скрипт reusable module, что означает, что вы можете импортировать его внутри другого скрипта, не запустив строку print gameProb().

+0

и где я могу назвать функцию? – Wouter

4

Вы звоните в gameProb в любом месте? Общей практикой является использование этой схемы:

if __name__ == "__main__": 
    gameProb() 

и сделать возврат в нижнем регистре.

+2

впереди в течение одной секунды: P – Netwave

+0

@PatNowak, где я помещаю шаблон, упомянутый вами? – Wouter

+0

В конце скрипта. – PatNowak

Смежные вопросы