可乐与酱油 发表于 2018-12-10 14:29:15

封装函数有关的问题

本帖最后由 可乐与酱油 于 2018-12-10 14:33 编辑

鱼c论坛的各位大佬好,我是一名大一新生,在电子设计课讲七段数码管显示的启发下,我参照书上代码结合我自己的学习编了一段程序
程序如下:


#七段数码管绘制
import turtle
import time
def preset():                                                
         turtle.pensize(5)                   #预设
         turtle.hideturtle()
         turtle.speed(100)
         turtle.pu()
         turtle.fd(-300)
def drawLine():                              #划一笔
         turtle.pu()
         turtle.fd(10)
         turtle.pendown()
         turtle.fd(30)
         turtle.pu()
         turtle.fd(10)
         turtle.pd()
def drawNone():                           #不画
         turtle.pu()
         turtle.fd(50)
         turtle.pd()
def drawNum():                               #画一个数字(按照画的顺序编号)
         drawLine() if a else drawNone()
         turtle.right(90)
         drawLine() if b else drawNone()
         turtle.right(90)
         drawLine() if c else drawNone()
         turtle.right(90)
         drawLine() if d else drawNone()
         drawLine() if e else drawNone()
         turtle.right(90)
         drawLine() if f else drawNone()
         turtle.right(90)
         drawLine() if g else drawNone()
def skip():                                    #画完一个数字后前进一小点
         turtle.right(90)
         turtle.pu()
         turtle.fd(10)
         turtle.pd()
def gang():                                  #划一杠
         turtle.right(90)
         turtle.pu()
         turtle.fd(5)
         turtle.pd()
         turtle.fd(5)
         turtle.pu()
         turtle.fd(5)
         turtle.pd()



         
def judge(num):                              #真值赋予七个字母
         a = 1 if num in (2,3,4,5,6,8,9) else 0
         b = 1 if num in (0,1,3,4,5,6,7,8,9) else 0
         c = 1 if num in (0,2,3,5,6,8,9) else 0
         d = 1 if num in (0,2,6,8) else 0
         e = 1 if num in (0,4,5,6,8,9) else 0
         f = 1 if num in (0,2,3,5,6,7,8,9) else 0
         g = 1 if num in (0,1,2,3,4,7,8,9) else 0
def main():
         preset()                                     #预设
         num1=time.strftime('%H-%M-%S')#获取当前时间
         for each in num1:
                  if each == '-':                   #如果不是数字
                           gang()
                  else:                               #如果是数字
                           each=eval(each)
                           judge(each)
                           drawNum()
                  skip()
         turtle.reset()
while 1:
         main()


然后运行结果


Traceback (most recent call last):
File "C:\Users\wzl\Desktop\不知道出了啥bug的时间绘制程序.py", line 74, in <module>
    main()
File "C:\Users\wzl\Desktop\不知道出了啥bug的时间绘制程序.py", line 70, in main
    drawNum()
File "C:\Users\wzl\Desktop\不知道出了啥bug的时间绘制程序.py", line 23, in drawNum
    drawLine() if a else drawNone()
NameError: name 'a' is not defined


我试了一下,可能是

judge(each)


没有给七个字母赋上值,但我怎么也想不通。{:9_220:}
我还尝试了下如果这么写

a = 1 if num in (2,3,4,5,6,8,9) else 0

就可以给a赋上值
可能是封装函数用错了,但就是找不到问题所在。
这究竟是什么原因???
{:9_234:} {:9_234:} {:9_234:}

xy123151 发表于 2018-12-10 15:21:26

你需要global
a在judge里被赋值了,然而在judge外侧并没有用

塔利班 发表于 2018-12-10 15:24:23

你的a定义在函数里,却要在别的函数里调用

xy123151 发表于 2018-12-10 15:25:27

你这是在写python吗,这缩进,这语法。。。我看不懂啊

可乐与酱油 发表于 2018-12-10 17:24:21

xy123151 发表于 2018-12-10 15:25
你这是在写python吗,这缩进,这语法。。。我看不懂啊

呃,我刚学没多久,之前都是抄书上的代码,犯错误应该是难免的{:10_266:},然后请问能否告诉我具体哪个地方有错误呢?

可乐与酱油 发表于 2018-12-10 17:29:51

本帖最后由 可乐与酱油 于 2018-12-10 17:31 编辑

xy123151 发表于 2018-12-10 15:21
你需要global
a在judge里被赋值了,然而在judge外侧并没有用

就是说封装函数的时候,被封装的函数里边定义的变量不能在函数外面用,是吗?

可乐与酱油 发表于 2018-12-10 17:32:25

塔利班 发表于 2018-12-10 15:24
你的a定义在函数里,却要在别的函数里调用

谢谢

xy123151 发表于 2018-12-10 17:42:16

先在全局定义下abcdefg,然后在那个函数里加一句
global a,b,c,d,e,f,g

可乐与酱油 发表于 2018-12-10 18:10:04

xy123151 发表于 2018-12-10 17:42
先在全局定义下abcdefg,然后在那个函数里加一句
global a,b,c,d,e,f,g

谢谢,我知道了,做出来了{:10_250:}
页: [1]
查看完整版本: 封装函数有关的问题