请老师帮忙看下这段代码啥情况.

请老师帮忙看下这段代码啥情况.

# 数字猜猜猜小游戏 第二个版本, 完全按照作业要求来做
import random
import sys
from datetime import datetime


# 界面输出方法
def guide_page(guide_word):
    """ 提示玩家进入游戏,并输出如效果图标题的所示信息 """
    print("{0}{1}{0}".format('*'*20, guide_word))


# 判断是否为数字
def all_num(n):
    """     判断指定的值是否为数字,     """
    return n.isdigit()


# 自定义数值合法性判定
def num_legal(ls):
    """    判定指定序列中的数值是否相等以及记录数字区间起始位置的值是否大于记录数字区间终止位置的值        """
    if int(ls[0]) == int(ls[1]):
        print("您输入的区间数字相同!请重新启动程序")
        sys.exit()
    elif int(ls[0]) > int(ls[1]):
        print("您输入的数字大小有误!请重新启动程序")
        sys.exit()
    else:
        return 1


# 自定义产生指定区间随机数函数
def set_final_num(num1, num2):
    # 把输入的值传入列表ls
    ls = [num1, num2]
    # 通过 filter 和 all_num 筛选 输入的全部为数字, 结果保留到res里面
    res = filter(all_num, ls)
    if len(list(res)) == 2:
        """ 调用num_legal 函数判断首末数值的合理性 ,并根据判断之后的返回值,
        输出用户产生随机数的区间,并运用random模块,返回产生区间内的随机数;反之
        则提示玩家所输入的为非数字字符,请重新启动"""
        if num_legal(ls) == 1:
            rest = random.randint(int(num1), int(num2))
            print("所产生的随机数区间为:{0}".format(ls))
            return rest
    else:
        print("您输入的非数字,请重新启动程序")
        sys.exit()


# 核查数值是否属于指定区间函数
def check_num_legal(num):
    """ 判定所输入的数值是否在指定的区间 """
    # 先判断是否为数字,为数字
    if all_num(num):
        # 是数字,再判断是否在猜测的区间 在区间返回True
        if int(i) <= int(num) <= int(j):
            return True
        # 不在区间返回 False
        else:
            return False
    # 猜测值为非数字,发出提示并结束程序
    else:
        print("对不起,您输入的 猜测值  为非数字!")
        sys.exit()


# 日志写入函数
def write_record(times, value):
    """
    记录猜测日志
    :param times: 猜测次数
    :param value: 猜测的数字
    :return:总次数
    """
    file_name = 'record.txt'
    time_now = datetime.now()
    with open(file_name, 'a+', encoding='utf-8') as f:
        f.write("{0}:\t 第{1}次您猜测的数字为:\t{2}\n".format(time_now, times, value))


# 主流程函数
def main(rand1):
    """ 依据所产生的随机数字(rand1),提示玩家输入猜测数字并进行比对直到猜测到正确数字 """
    temp = rand1
    # 输入数字开始猜测
    guess_num = input("请输入您猜测的数值: ")
    times = 0
    # 循环判断
    while True:
        # 如果 输入猜测的 guess_num 在猜测的区间
        if check_num_legal(guess_num):
            times += 1
            new_num = int(guess_num)
            # 比较猜测的数小于答案
            if new_num < temp:
                print("Lower than the answer")
                print("*" * 12)
            # 数大于答案
            elif new_num > temp:
                print("Higher than the answer")
                print("*" * 12)
            # 如果数等于答案
            else:
                print("恭喜您! 只用了{}次就赢得了游戏!".format(times))
                write_record(times, new_num)
                break
            # 写入日志log
            write_record(times, new_num)
            # 因为没猜对,所以需要重新猜,重新输入
            guess_num = input("请继续输入您猜测的数字: ")
        # 不在区间,给出提示重新猜测
        else:
            print("对不起,您输入的数字未在指定区间!!!")
            print("*" * 18)
            guess_num = input("请 重新 输入您猜测的数值: ")


# 开始进执行
if __name__ == '__main__':
    guide_page('欢迎进入数字猜猜猜小游戏')
    i = input("数字区间起始值:")
    j = input("数字区间终止值:")
    # 调用自定义的set...函数产生随机数
    answer_num = set_final_num(i, j)
    # 随机数比较出结果
    main(answer_num)

以上为完整的代码,有点儿不太懂其中这一段的原理.我截图发出来并发在后面.

http://img1.sycdn.imooc.com//climg/5d91fe1e0993c2d005360358.jpg

def check_num_legal(num):
    """ 判定所输入的数值是否在指定的区间 """
    # 先判断是否为数字,为数字
    if all_num(num):
        # 是数字,再判断是否在猜测的区间 在区间返回True
        if int(i) <= int(num) <= int(j):
            return True
        # 不在区间返回 False
        else:
            return False
    # 猜测值为非数字,发出提示并结束程序
    else:
        print("对不起,您输入的 猜测值  为非数字!")
        sys.exit()

这一段代码,是我看了别人的一些然后写的,最重要的是在这个方法(函数)里,这个i和j并没有定义啊,怎么会可以调用啊.

这让我想到一点,在调用函数的时候,只要是程序前面定义了的参数或者变量或者其它什么的,都可以直接拿来用么??如果是这样,会不会导致同名的变量产生冲突呢?

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好:

代码是从上往下执行的。

http://img1.sycdn.imooc.com//climg/5d97fe110955329103480117.jpg

局部变量:定义在函数内部的变量称为局部变量,他的作用域范围为函数内。
全局变量:定义在函数外的变量称之为全局变量,他的作用域范围为全局。

按照上面的执行顺序,定义的i,j是全局变量。当调用main函数时,在该函数中调用check_num_legal

方法。在该函数中没有定义i,j这两个局部变量。会直接访问全局变量i,j。

如果我解决了同学的问题,请采纳!学习愉快^_^。

努力而奋斗的蜗牛 2019-10-01 13:35:43

http://img1.sycdn.imooc.com//climg/5d92e506090b528408590275.jpg

这里调用了的 你别看他上面是num1 num2 你就搞混了  i和j 实际就是 num1 num2 传递参数的时候参数变量名是可以不相同的 他调用的这个函数set_final_num(num1, num2) 里面你就可以看成 i和j的值 你调试下看他们的执行过程里面带的值你就懂了

  • 提问者 3三哥 #1
    我意思是 def check_num_legal(num): """ 判定所输入的数值是否在指定的区间 """ # 先判断是否为数字,为数字 if all_num(num): # 是数字,再判断是否在猜测的区间 在区间返回True if int(i) <= int(num) <= int(j): return True # 不在区间返回 False else: return False # 猜测值为非数字,发出提示并结束程序 else: print("对不起,您输入的 猜测值 为非数字!") sys.exit() 这一段代码没调用上面的这个函数set_final_num(num1, num2).没调用这个函数,怎么就能用到i,j,这个原理不是好懂,是这个,我知道set_final_num(num1, num2)这个函数里面用的是i,j,因为i,和j进入了这个函数的.这个我晓得啊 关键是我提到的这段代码(53行到66行)除了i,j没提到set_final_num(num1, num2)这个函数半点,怎么就能够直接拿里面的i,j来用.函数不是封装了的么?
    2019-10-01 13:45:53
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
1.Python零基础入门
  • 参与学习           人
  • 提交作业       2727    份
  • 解答问题       8160    个

想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师