鱼C论坛

 找回密码
 立即注册
查看: 1960|回复: 8

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

[复制链接]
发表于 2020-7-7 15:26:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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() 只能放在底部??放在顶部就出错??
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-7-7 15:34:12 | 显示全部楼层
本帖最后由 heidern0612 于 2020-7-7 15:39 编辑

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

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

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

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

如下这种情况是允许的:
  1. def checkname(name):
  2.     print(name)
  3.     print(x)
  4. x = 10
  5. checkname(456)
复制代码



但是,这种就会报错了。

  1. def checkname(name):
  2.     print(name)
  3.     print(x)
  4. checkname(456)
  5. x = 10
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-7 15:39:12 | 显示全部楼层
heidern0612 发表于 2020-7-7 15:34
函数定义时候的顺序无所谓,但是你调用的时候就有所谓了。

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

意思就是 自己定义的函数在调用的时候只能后执行?意义何在?既然前边已经定义了(比如:def printIntro),为何还要再定义一下def main(): 在它的下面再加 printIntro?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-7 15:42:38 | 显示全部楼层
本帖最后由 heidern0612 于 2020-7-7 15:45 编辑

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

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

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


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

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


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

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


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

好的 小白一个 有点迷糊 谢谢大佬
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-7 15:46:46 | 显示全部楼层
hi,5466 发表于 2020-7-7 15:44
好的 小白一个 有点迷糊 谢谢大佬

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

没必要对每个函数都调用一遍,太傻,改起来也太累人。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

没 ...

受教了! 万分感谢!
我刚开始学习 照着课本打 但是没看明白
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

它山之石可以攻玉,学编程最怕钻牛角尖,如果一时看不懂,可以看看别的类似教程,有时候灵关一闪就明白了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

好的!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-23 05:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表