Python 为什么这个L系统只画了一条直线?

Python 为什么这个L系统只画了一条直线?,python,tkinter,turtle-graphics,l-systems,Python,Tkinter,Turtle Graphics,L Systems,我试图编写一个程序,生成字符串,然后根据字符串中的下一个字符绘制特定的行。我相信它能够正确地生成字符串,因为我已经手动检查了几次迭代,但是我使用的海龟似乎不能正常工作 例如,下面的代码应该生成Sierpinski三角形,但只绘制一条直线 我已经检查过其他L系统(如dragon curve),虽然它没有产生水平线,但结果仍然不正确。字符串似乎是正确的,所以我认为问题在于海龟模块如何解释我的指令。这是我第一次使用这个模块,所以如果我犯了一些非常基本的错误,我不会感到惊讶 from tkinter i

我试图编写一个程序,生成字符串,然后根据字符串中的下一个字符绘制特定的行。我相信它能够正确地生成字符串,因为我已经手动检查了几次迭代,但是我使用的海龟似乎不能正常工作

例如,下面的代码应该生成Sierpinski三角形,但只绘制一条直线

我已经检查过其他L系统(如dragon curve),虽然它没有产生水平线,但结果仍然不正确。字符串似乎是正确的,所以我认为问题在于海龟模块如何解释我的指令。这是我第一次使用这个模块,所以如果我犯了一些非常基本的错误,我不会感到惊讶

from tkinter import *
import turtle 

Width=500
Height=500

def process_string(string):
    return string.translate(str.maketrans({'A':'B-A-B','B':'A+B+A'}))


def createSystem(seed,depth):
    string=seed
    for i in range(depth):  
        string=process_string(string)
        print(string)
    return(string)


def draw(string):

    t = turtle.RawTurtle(canvas) 
    t.penup()
    t.goto(-0.4*Width,0.4*Height) #this translation fits more of the curve 
                                   on the screen
    t.pendown()
    t.shape("circle")
    t.speed("fastest")


    for char in string:

        if char=="A" or char=="B":
            t.forward(10)
        elif char=="+":
            t.right(60)
        elif char=="-":
            t.left(60)



root=Tk()
canvas=Canvas(width=Width, height=Height)
canvas.pack()    
draw(createSystem("A",3))
print("COMPLETE")
root.mainloop() }
与前面一样,本例应该生成Sierpinski三角形,但只生成一条水平线

作为最后一个我认为不值得自己发帖的快速问题,海龟文档说速度(“最快”)应该删除所有动画,但事实并非如此,有什么想法吗?谢谢你花了这么多时间

编辑:我已经用用户建议更新了代码,虽然这为三角形提供了正确的结果,但仍然为龙曲线提供了错误的图像。龙曲线的信息如下所示

变量:xy 常数:F+− 起点:FX 规则:(X)→ X+YF+,(Y→ −外汇−Y) 角度:90度 这里,F表示“向前拉”,− 表示“左转90°”,+表示“右转90°”。X和Y不对应于任何绘图动作,仅用于控制曲线的演变。”

更改:

如果字符==“A”或“B”:
致:

如果char==“A”或char==“B”:
更改:

如果字符==“A”或“B”:
致:

如果char==“A”或char==“B”:
问题是

if char=="A" or "B":
也就是说

if (char == "A") or "B":
因此,它仅将
char
中的“A”
进行比较,得出

if True or "B": 

首先给出

if True:
第二次给予

if "B": 
但这就像

if bool("B"): 

if True: 
最后,如果char==“A”或“B”:的工作原理类似于
如果为True:
,因此这部分代码总是被执行


一定是这样

if char == "A" or char == "B": 


正如@cdlane在评论中提到的,您也可以使用
set()

需要固定的时间来检查任意大小集合中的字符。但对于小集合,你们将看不到时间上的差异。

问题是

if char=="A" or "B":
也就是说

if (char == "A") or "B":
因此,它仅将
char
中的“A”
进行比较,得出

if True or "B": 

首先给出

if True:
第二次给予

if "B": 
但这就像

if bool("B"): 

if True: 
最后,如果char==“A”或“B”:的工作原理类似于
如果为True:
,因此这部分代码总是被执行


一定是这样

if char == "A" or char == "B": 


正如@cdlane在评论中提到的,您也可以使用
set()


需要固定的时间来检查任意大小集合中的字符。但对于小集合,您将看不到时间上的差异。

正确
如果char==“A”或char==“B”:
如果char在(“A”,“B”)中:
如果char在“AB”中,则正确
如果char==“A”或char==“B”:
如果char在(“A”,“B”)中:
如果char在“AB”中:
对于这个例子来说,这是有效的,但我不确定我是否理解为什么?逻辑上有什么区别?
不会检查变量是一个值还是另一个值。它将这两个条件分开,因此如果
char==“A”
“B”
,则该语句为true。它总是
True
,因为
的“B”
不是空字符串。要测试一个变量是否是多个值中的一个,您可以将
in
关键字与
列表一起使用,或者检查每个可能的值。这对于示例是有效的,但我不确定我是否理解为什么?逻辑上有什么区别?
不会检查变量是一个值还是另一个值。它将这两个条件分开,因此如果
char==“A”
“B”
,则该语句为true。它总是
True
,因为
的“B”
不是空字符串。要测试一个变量是否是多个值中的一个,您可以将
in
关键字与
列表一起使用,或者检查每个可能的值。据我所知,
if char==“a”或“B”:
并不意味着
if char==“a”或“B”):
而是
if(char==“a”)或“B”:
。将
char
设置为
“C”
以说服自己。为什么
if-char-in(“A”,“B”):
当你可以做
if-char-in{A”,“B}:
?@cdlane我使用
(“A”,“B”)
是因为习惯。我很少有机会使用
set()
,所以我忘了它的存在:)@cdlane你是对的,它是
如果(char==“A”)或“B”
,我觉得有什么地方出错了。据我所知,
如果char==“A”或“B”:
并不意味着
如果char==“A”或“B”):
而是
如果(char==“A”)或“B”):。将
char
设置为
“C”
以说服自己。为什么
if-char-in(“A”,“B”):
当你可以做
if-char-in{A”,“B}:
?@cdlane我使用
(“A”,“B”)
是因为习惯。我很少有机会使用
set()
,所以我忘记了它的存在:)@cdlane你是对的,它是
如果(char==“A”)或“B”
,我觉得某个地方出错了。