hi,5466 发表于 2020-7-7 15:26:59

求大佬帮忙解答!万分感谢!!!

from random import random

def printIntro():#程序的介绍性信息
    print("这个程序模拟两个选手A和B的某种竞技比赛")
    print("程序运行需要A和B 的能力值(0-1之间的小数)")
   
def getInputs(): #获得程序运行需要的参数a,b,n
    a = eval(input("请输入选手A的能力值(0-1):"))
    b = eval(input("请输入选手B的能力值(0-1):"))
    n = eval(input("模拟比赛的场次:"))
    return a,b,n

def simNGames(n,probA,probB): #利用球员AB的能力值probA,probB模拟n场比赛
    winsA,winsB = 0,0
    for i in range(n):
      scoreA,scoreB = simOneGame(probA,probB)
      if scoreA > scoreB:
            winsA += 1
      else:
            winsB += 1
    return winsA,winsB

def simOneGame(probA,probB):
    scoreA,scoreB = 0,0
    serving = "A"
    while not gameOver(scoreA,scoreB):
      if serving == "A":
            if random() < probA:
                scoreA += 1
            else:
                serving = "B"
      else:
            if random() < probB:
                scoreB += 1
            else:
                serving = "A"
    return scoreA,scoreB

def gameOver(a,b):
    return a == 15 or b ==15

def printSummary(winsA,winsB):
    n = winsA+winsB
    print("竞技分析开始,共模拟{}场比赛",format(n))
    print("选手A获胜{}场比赛,占比{:0.1%}".format(winsA,winsA/n))
    print("选手B获胜{}场比赛,占比{:0.1%}".format(winsB,winsB/n))

def main():
    printIntro()
    probA, probB, n = getInputs()
    winsA, winsB = simNGames(n, probA, probB)
    printSummary(winsA, winsB)
main()

为什么最后一段def() 到 main() 只能放在底部??放在顶部就出错??

heidern0612 发表于 2020-7-7 15:34:12

本帖最后由 heidern0612 于 2020-7-7 15:39 编辑

函数定义时候的顺序无所谓,但是你调用的时候就有所谓了。

调用的时候没办法先执行,再往下部去找。

也就是说,你前面定义的顺序怎么换都行,因为函数并不是按从上到下的顺序来进行查找的。

但是你程序执行的时候,是按顺序来的。

如下这种情况是允许的:
def checkname(name):
    print(name)
    print(x)
x = 10
checkname(456)


但是,这种就会报错了。

def checkname(name):
    print(name)
    print(x)
checkname(456)
x = 10

hi,5466 发表于 2020-7-7 15:39:12

heidern0612 发表于 2020-7-7 15:34
函数定义时候的顺序无所谓,但是你调用的时候就有所谓了。

调用的时候没办法先执行,再往下部去找。

意思就是 自己定义的函数在调用的时候只能后执行?意义何在?既然前边已经定义了(比如:def printIntro),为何还要再定义一下def main(): 在它的下面再加 printIntro?

heidern0612 发表于 2020-7-7 15:42:38

本帖最后由 heidern0612 于 2020-7-7 15:45 编辑

我感觉你没理解我说的意思。

你定义函数的时候,顺序无所谓,但是调用一定要放在最后。你不能先调用,再定义,这种肯定是会报错的。

既然前边已经定义了(比如:def printIntro),为何还要再定义一下def main(): 在它的下面再加 printIntro?

你定义了之后,不是没调用吗? 不是在main函数里面调用的吗?这不就是简单的函数套函数的应用吗?

你不觉得把所有函数的调用都放在一个函数里,只调用一个函数就调用了所有定义的函数,这种写法比较简单明了吗?....


假如说我程序写了一万个定义函数,我还一万个每个都调用一遍?....

我肯定是需要把所有调用的函数都封装到一个函数里面,直接调用这个主函数就好了啊。


hi,5466 发表于 2020-7-7 15:44:29

heidern0612 发表于 2020-7-7 15:42
hi,5466 发表于 2020-7-7 15:39
意思就是 自己定义的函数在调用的时候只能后执行?意义何在?既然前边已 ...

好的 小白一个 有点迷糊 谢谢大佬

heidern0612 发表于 2020-7-7 15:46:46

hi,5466 发表于 2020-7-7 15:44
好的 小白一个 有点迷糊 谢谢大佬

以后写的程序复杂了,这种嵌套调用是很实用的,因为你只需要写一个主函数,调用主程序接口就好了。

没必要对每个函数都调用一遍,太傻,改起来也太累人。

hi,5466 发表于 2020-7-7 15:50:03

heidern0612 发表于 2020-7-7 15:46
以后写的程序复杂了,这种嵌套调用是很实用的,因为你只需要写一个主函数,调用主程序接口就好了。

没 ...

受教了! 万分感谢!
{:5_99:}我刚开始学习 照着课本打 但是没看明白

heidern0612 发表于 2020-7-7 15:54:14

hi,5466 发表于 2020-7-7 15:50
受教了! 万分感谢!
我刚开始学习 照着课本打 但是没看明白

它山之石可以攻玉,学编程最怕钻牛角尖,如果一时看不懂,可以看看别的类似教程,有时候灵关一闪就明白了。

hi,5466 发表于 2020-7-7 16:44:59

heidern0612 发表于 2020-7-7 15:54
它山之石可以攻玉,学编程最怕钻牛角尖,如果一时看不懂,可以看看别的类似教程,有时候灵关一闪就明白了 ...

好的!
页: [1]
查看完整版本: 求大佬帮忙解答!万分感谢!!!