【问题标题】:Why doesn't my local variables change in value, despite being called in my functions?为什么我的局部变量的值没有改变,尽管在我的函数中被调用了?
【发布时间】:2019-07-08 01:10:38
【问题描述】:

在我尝试创建的程序中,我正在使用 Turtle 创建一个 12 小时数字闹钟,其中每个数字 (hh:mm) 都会发生变化,就好像时钟经过 24 小时制一样。但是,我用来设置分钟数和位时针的一些变量的值并没有改变,即使我已经将它们设置为在满足某些条件后将它们相加。

所以基本上,我已经设置了海龟来绘制一张桌子,以及那张桌子上的时钟的主体和表面。但更重要的是,我制作了 6 个海龟,一个用于小时数和分钟数之间的点,一个用于上午/下午,一个用于每个数字。它们都是由我上面描述的每个海龟的单独函数绘制的。我有一个单独的 .txt 文档,其中 5 位行,对应于每个数字手需要更改的点。使用 AM/PM 和十位小时数功能,我设置了一个基本的 if 和 else 语句,如果与该特定功能对应的位为 0,则十位应为 0,或者如果该位出现为 1,它将出现为 1。但是,对于其余的数字,如果该位出现为 0,则相应的函数将重复它所做的最后一次绘制,这将保存在自己的功能。如果该位显示为 1,它将被保存在一个变量中,然后该变量将用于与另一个变量进行模运算,该变量将产生一个与循环或旋转的下一个数字相对应的数字。例如,对于一个位的分针,可以出现的数字是 0、1、2、3、4、5、6、7、8 和 9。如果模运算结果是 3,那么数字将是 3。同样,3 将被保存在一个变量中,这样,当该位为 0 时,函数可以显示之前的数字。另外,如果模运算结果为 0,那么我在模函数中描述的第二个变量每次都会加上一个特定的数字。在一个位置分针的情况下,该数字是 10。仅此而已。我的代码如下:

#Program Setup
import turtle
import time
num = turtle.Turtle()
num2 = turtle.Turtle()
num3 = turtle.Turtle()
num4 = turtle.Turtle()
text = turtle.Turtle()
binlist = []
com = 12
com1 = 6
com2 = 10
bits = 0
bits1 = 0
bits2 = 0
#Function Setup
def hour1(bit1,g):
    if int(bit1) == 0:
        num.clear()
        g = num.write("0",False,"center",("alarm clock",100,"normal"))
    else:
        num.clear()
        g = num.write("1",False,"center",("alarm clock",100,"normal"))
def hour2(bit2,g1,bits,com):
    if int(bit2) == 0:
        num2.clear()
        g1
    else:
        bits +=1
        return bits
        if int(bits) % int(com) == 1:
            num2.clear()
            g1 = num2.write("1",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % int(com) == 2:
            num2.clear()
            g1 = num2.write("2",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % int(com) == 3:
            num2.clear()
            g1 = num2.write("3",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % int(com) == 4:
            num2.clear()
            g1 = num2.write("4",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % int(com) == 5:
            num2.clear()
            g1 = num2.write("5",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % int(com) == 6:
            num2.clear()
            g1 = num2.write("6",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % int(com) == 7:
            num2.clear()
            g1 = num2.write("7",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % int(com) == 8:
            num2.clear()
            g1 = num2.write("8",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % int(com) == 9:
            num2.clear()
            g1 = num2.write("9",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % int(com) == 10:
            num2.clear()
            g1 = num2.write("0",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % int(com) == 11:
            num2.clear()
            g1 = num2.write("1",False,"center",("alarm clock",100,"normal"))
        else:
            num2.clear()
            g1 = num2.write("2",False,"center",("alarm clock",100,"normal"))
            com += 12
            return com
def min1(bit3,g2,bits1,com1):
    if int(bit3) == 0:
        num3.clear()
        g2
    else:
        bits1 += 1
        return bits1
        if int(bits1) % int(com1) == 1:
            num3.clear()
            g2 = num3.write("1",False,"center",("alarm clock",100,"normal"))
        elif int(bits1) % int(com1) == 2:
            num3.clear()
            g2 = num3.write("2",False,"center",("alarm clock",100,"normal"))
        elif int(bits1) % int(com1) == 3:
            num3.clear()
            g2 = num3.write("3",False,"center",("alarm clock",100,"normal"))
        elif int(bits1) % int(com1) == 4:
            num3.clear()
            g2 = num3.write("4",False,"center",("alarm clock",100,"normal"))
        elif int(bits1) % int(com1) == 5:
            num3.clear()
            g2 = num3.write("5",False,"center",("alarm clock",100,"normal"))
        else:
            num3.clear()
            g2 = num3.write("0",False,"center",("alarm clock",100,"normal"))
            com1 += 6
            return com1
def min2(bit4,g3,bits2,com2):
    if int(bit4) == 0:
        g3
    else:
        bits2 += 1
        return bits2
        if int(bits2) % int(com2) == 1:
            num4.clear()
            g3 = num4.write("1",False,"center",("alarm clock",100,"normal"))
        elif int(bits2) % int(com2) == 2:
            num4.clear()
            g3 = num4.write("2",False,"center",("alarm clock",100,"normal"))
        elif int(bits2) % int(com2) == 3:
            num4.clear()
            g3 = num4.write("3",False,"center",("alarm clock",100,"normal"))
        elif int(bits2) % int(com2) == 4:
            num4.clear()
            g3 = num4.write("4",False,"center",("alarm clock",100,"normal"))
        elif int(bits2) % int(com2) == 5:
            num4.clear()
            g3 = num4.write("5",False,"center",("alarm clock",100,"normal"))
        elif int(bits2) % int(com2) == 6:
            num4.clear()
            g3 = num4.write("6",False,"center",("alarm clock",100,"normal"))
        elif int(bits2) % int(com2) == 7:
            num4.clear()
            g3 = num4.write("7",False,"center",("alarm clock",100,"normal"))
        elif int(bits2) % int(com2) == 8:
            num4.clear()
            g3 = num4.write("8",False,"center",("alarm clock",100,"normal"))
        elif int(bits2) % int(com2) == 9:
            num4.clear()
            g3 = num4.write("9",False,"center",("alarm clock",100,"normal"))
        else:
            num4.clear()
            g3 = num4.write("0",False,"center",("alarm clock",100,"normal"))
            com2 += 10
            return com2
def meridiem(bit5,g4):
    if int(bit5) == 0:
        text.clear()
        g4 = text.write("AM",False,"center",("alarm clock",25,"normal"))
    else:
        text.clear()
        g4 = text.write("AM",False,"center",("alarm clock",25,"normal"))
f = open("ikeokereke.txt","r")
for line in f:
    binlist.append(line.rstrip('\n'))
for e in binlist:
    bit1 = e[0:1]
    bit2 = e[1:2]
    bit3 = e[2:3]
    bit4 = e[3:4]
    bit5 = e[4:5]
    time.sleep(.5)
    hour1(bit1,g)
    hour2(bit2,g1,bits,com)
    min1(bit3,g2,bits1,com1)
    min2(bit4,g3,bits2,com2)
    meridiem(bit5,g4)
    print(bits)
    print(bits1)
    print(bits2)
    print(com)
    print(com1)
    print(com2)

预期结果:正常、正常工作的数字闹钟 实际结果:十位时针显示为0,一位分针显示为0,另外两个数字根本没有出现。

ikeokereke.txt

https://docs.google.com/document/d/e/2PACX-1vT6O_NqKrKR0tC8IPvoItwmJL0uCgbUJsBK0xH62IHAfx_nJxD62DuKjc8Ih93YyMKsNGn0EP6Nxu6Q/pub

【问题讨论】:

  • 将您的 ikeokereke.txt 文件的内容添加到问题中,以便我们运行代码进行调试。

标签: python function variables turtle-graphics


【解决方案1】:

即使是这么小的sn-p代码也有很多问题:

def hour2(bit2,g1,bits,com):
    if int(bit2) == 0:
        num2.clear()
        g1
    else:
        bits +=1
        return bits
        if int(bits) % int(com) == 1:
            ...

具体来说:

  • g1 从未在任何地方定义,因此调用 hour2(bit2,g1,bits,com) 无法工作。

  • g1 是否有任何可能的值可以将g1 作为代码的一部分单独放在一行上?

  • 递增bits 并返回它没有意义,因为没有任何东西查看hour2() 调用的返回值,如果bits 是作为全局变量,这将不起作用函数中没有global 语句。

  • return bits 语句之后的大约 30 行代码将永远不会在您离开函数时执行。

  • bitscom 都已经是整数,所以一遍又一遍地调用 int() 似乎表明你对自己的设计缺乏了解。

【讨论】:

  • 关于 g1 变量,它首先在代码的#Main Program 部分中设置。我只在程序结束时给了你 for 循环。
  • 同样,由于 g1 线本身,我不确定如何重复先前的绘图,而不直接将该值设置为该值。
【解决方案2】:

我能够通过在 for 循环中增加变量而不是函数本身来解决这个问题。代码改动如下:

#Program Setup
import turtle
import time
#...
num = turtle.Turtle()
num2 = turtle.Turtle()
num3 = turtle.Turtle()
num4 = turtle.Turtle()
circles = turtle.Turtle()
text = turtle.Turtle()
binlist = []
bits = 0
bits1 = 0
bits2 = 0
firsthour = True
#Function Setup
#...
def hour1(bit1):
    if int(bit1) == 0:
        num.clear()
        num.write("0",False,"center",("alarm clock",100,"normal"))
    else:
        num.clear()
        num.write("1",False,"center",("alarm clock",100,"normal"))
def hour2(bit2,bits,firsthour):
    if int(bit2) == 0:
        if firsthour == True:
            num2.write("2",False,"center",("alarm clock",100,"normal"))
        else:
            num2.clear()
            num2.write(,False,"center",("alarm clock",100,"normal"))
    else:
        if int(bits) % 12 == 1:
            num2.clear()
            num2.write("1",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % 12 == 2:
            num2.clear()
            num2.write("2",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % 12 == 3:
            num2.clear()
            num2.write("3",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % 12 == 4:
            num2.clear()
            num2.write("4",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % 12 == 5:
            num2.clear()
            num2.write("5",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % 12 == 6:
            num2.clear()
            num2.write("6",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % 12 == 7:
            num2.clear()
            g1 = num2.write("7",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % 12 == 8:
            num2.clear()
            num2.write("8",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % 12 == 9:
            num2.clear()
            num2.write("9",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % 12 == 10:
            num2.clear()
            num2.write("0",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % 12 == 11:
            num2.clear()
            num2.write("1",False,"center",("alarm clock",100,"normal"))
        else:
            num2.clear()
            num2.write("2",False,"center",("alarm clock",100,"normal"))
def min1(bit3,bits1):
    if int(bit3) == 0:
        num3.clear()
        num3.write(,False,"center",("alarm clock",100,"normal"))
    else:
        if int(bits1) % 6 == 1:
            num3.clear()
            num3.write("1",False,"center",("alarm clock",100,"normal"))
        elif int(bits1) % 6 == 2:
            num3.clear()
            num3.write("2",False,"center",("alarm clock",100,"normal"))
        elif int(bits1) % 6 == 3:
            num3.clear()
            num3.write("3",False,"center",("alarm clock",100,"normal"))
        elif int(bits1) % 6 == 4:
            num3.clear()
            num3.write("4",False,"center",("alarm clock",100,"normal"))
        elif int(bits1) % 6 == 5:
            num3.clear()
            num3.write("5",False,"center",("alarm clock",100,"normal"))
        else:
            num3.clear()
            num3.write("0",False,"center",("alarm clock",100,"normal"))
def min2(bit4,bits2):
    if int(bit4) == 0:
        num4.clear()
        num4.write(str(bits2),False,"center",("alarm clock",100,"normal"))
    else:
        if int(bits2) % 10 == 1:
            num4.clear()
            num4.write("1",False,"center",("alarm clock",100,"normal"))
        elif int(bits2) % 10 == 2:
            num4.clear()
            num4.write("2",False,"center",("alarm clock",100,"normal"))
        elif int(bits2) % 10 == 3:
            num4.clear()
            num4.write("3",False,"center",("alarm clock",100,"normal"))
        elif int(bits2) % 10 == 4:
            num4.clear()
            num4.write("4",False,"center",("alarm clock",100,"normal"))
        elif int(bits2) % 10 == 5:
            num4.clear()
            num4.write("5",False,"center",("alarm clock",100,"normal"))
        elif int(bits2) % 10 == 6:
            num4.clear()
            num4.write("6",False,"center",("alarm clock",100,"normal"))
        elif int(bits2) % 10 == 7:
            num4.clear()
            num4.write("7",False,"center",("alarm clock",100,"normal"))
        elif int(bits2) % 10 == 8:
            num4.clear()
            num4.write("8",False,"center",("alarm clock",100,"normal"))
        elif int(bits2) % 10 == 9:
            num4.clear()
            num4.write("9",False,"center",("alarm clock",100,"normal"))
        else:
            num4.clear()
            num4.write("0",False,"center",("alarm clock",100,"normal"))
def dots():
    circles.speed(0)
    circles.dot(20,"red")
    circles.penup()
    circles.left(90)
    circles.forward(50)
    circles.pendown()
    circles.dot(20,"red")
    circles.hideturtle()
def meridiem(bit5):
    if int(bit5) == 0:
        text.clear()
        text.write("AM",False,"center",("alarm clock",25,"normal"))
    else:
        text.clear()
        text.write("PM",False,"center",("alarm clock",25,"normal"))

#Main Program
#...
f = open("ikeokereke.txt","r")
for line in f:
    binlist.append(line.rstrip('\n'))
for e in binlist:
    bit1 = e[0:1]
    bit2 = e[1:2]
    bit3 = e[2:3]
    bit4 = e[3:4]
    bit5 = e[4:5]
    time.sleep(.5)
    if int(bit2) == 1:
        bits += 1
    if int(bit3) == 1:
        bits1 += 1
    if int(bit4) == 1:
        bits2 += 1
    if int(bits) == 1:
        firsthour = False
    hour1(bit1)
    hour2(bit2,bits,firsthour)
    min1(bit3,bits1)
    min2(bit4,bits2)
    meridiem(bit5)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-31
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 2023-02-10
    • 2019-10-02
    • 1970-01-01
    • 2014-08-23
    相关资源
    最近更新 更多