一、什么是银杏树
银杏树,大家应该都见过,有扇子似的叶子。

二、讲解代码
        1.引入模块并打印当前画笔的角度
代码如下:

import turtle
import random
from math import *  
print(turtle.heading())
这几句话的意义就是把turtle和random模块引入进程序,引入math模块的所有内容,并且打印当前画笔的角度

2.定义斐波那契数列的方法的函数
代码如下:

def Fibonacci_Recursion_tool(n):
    if n<=0:
        return 0
    elif n==1:
        return 1
    else:
        return Fibonacci_Recursion_tool(n-1)+Fibonacci_Recursion_tool(n-2)

这段代码出现了if elif else的特殊情况,我来举个例子:

if a==1:  #当a==1的时候,就执行以下代码
    print('a')
elif a==2:  #当a不符合以上条件(a≠1),却符合a==2的条件,就执行以下代码(elif就是既else又if的意思)
    print('b')
else:  #当a不符合以上条件(a≠1,a≠2),就执行以下代码
    print('c')

以下就是if elif else总体结构:

if 判断条件:
    执行代码
elif 判断条件:
    执行代码
else:
    执行代码
return 0
这里的return就是函数的返回值,什么意思呢?举个例子:如果你考试考到优秀(90~100),妈妈就会给你一份礼物;如果你考试考到合格(90以下~60),妈妈就会给你一顿骂;如果你考试考到不合格(60以下~0)。那么在Python语言里就是这样表达的:

if 100>mark>=90:
    print("优秀")
    return 一份礼物
elif 90>mark>=60:
    print("合格")
    return 一顿骂
elif 60>mark>=0:
    print("不合格")
    return 一顿揍
else:
    print("错误")

重点代码:

return Fibonacci_Recursion_tool(n-1)+Fibonacci_Recursion_tool(n-2)

很多小伙伴不理解,说:“这么一长串东西(Fibonacci_Recursion_tool)是什么玩意儿?”但是,你回过头去看一眼,你就会发现,这不就是他自己(这个函数)吗?还有小伙伴就问:“那为什么这个函数里还调用了他自己呢?”这就是Python语言里经常要用的一种方式,叫作递归。递归有有三个必要的条件:1.自己调用自己。2.有终止条件。3.终止条件在递归的最开始。

def Fibonacci_Recursion_tool(n):
    if n<=0:
        return 0
    elif n==1:
        return 1
    else:
        return Fibonacci_Recursion_tool(n-1)+Fibonacci_Recursion_tool(n-2)

仔细看,递归的每一个条件在这里都有。

3.生成斐波那契数列,并存入列表
代码如下:

def Fibonacci_Recursion(n):
    result_list=[]
    for i in range(1,n+3):
        result_list.append(Fibonacci_Recursion_tool(i))
    return result_list
yu = Fibonacci_Recursion(10)
print(yu)
result_list.append(Fibonacci_Recursion_tool(i))

这行代码的append就是追加的意思

4.定义画叶子的方法
代码如下:

def leaf(x, y, node):
    til = turtle.heading()
    i = random.random()
    an = random.randint(10, 180)
    ye = random.randint(6, 9)/10
    turtle.color(ye, ye*0.9, 0)
    turtle.fillcolor(ye+0.1, ye+0.05, 0)
    turtle.pensize(1)
    turtle.pendown()
    turtle.setheading(an + 90)
    turtle.forward(8*i)
    px = turtle.xcor()
    py = turtle.ycor()
    turtle.begin_fill()
    turtle.circle(7.5*i, 120)
    turtle.penup()
    turtle.goto(px, py)
    turtle.setheading(an + 90)
    turtle.pendown()
    turtle.circle(-7.5*i, 120)
    turtle.setheading(an + 100)
    turtle.circle(10.5*i, 150)
    turtle.end_fill()
    turtle.penup()
    turtle.goto(x, y)
    turtle.setheading(til)
    turtle.pensize(node / 2 + 1)

til = turtle.heading()
这行代码中的turtle.heading就是得到当前画笔的角度。

i = random.random()
这行代码中的第一个random就是random(随机)模块,第二个random就是random是random模块里的一个函数,是随机制造一个0~1的数。

an = random.randint(10, 180)
这行代码的意义是随机制造一个10~180的一个整数。

turtle.color(ye, ye*0.9, 0)
这行代码的意义就是调整颜色,而这里的调色模式是用RGB模式的。

px = turtle.xcor()
这行代码中的turtle.xcor就是得到当前画笔的x坐标。

py = turtle.ycor()
这行代码中的turtle.ycor就是得到当前画笔的y坐标。

turtle.circle(7.5*i, 120)
turtle.circle(-7.5*i, 120)
这段代码的意义都是画一个半径为7.5×i的120°的圆弧,但画的方向不同,上面这行代码是逆时针地画,而下面这行代码是顺时针地画。

5.定义画树的方法
代码如下:

def draw(node, length, level, yu, button):
    turtle.pendown()
    t = cos(radians(turtle.heading()+5)) / 8 + 0.25
    turtle.pencolor(t*1.6, t*1.2, t*1.4)
    turtle.pensize(node/1.2)
    x = random.randint(0, 10)
    
    if level == top and x > 6:
        turtle.forward(length)
        yu[level] = yu[level] - 1
        c = random.randint(2, 10)
        for i in range(1, c):
            leaf(turtle.xcor(), turtle.ycor(), node)
            if random.random() > 0.3:
                turtle.penup()
                t1 = turtle.heading()
                print("turtle.heading()",t1)
                an1 = -40 + random.random() * 40 
                turtle.setheading(an1)
                dis = int(800 * random.random() * 0.5 + 400 * random.random() * 0.3 + 200 * random.random() * 0.2)
                turtle.forward(dis)
                turtle.setheading(t1)
                turtle.right(90)
                leaf(turtle.xcor(), turtle.ycor(), node)
                turtle.left(90)
                t2 = turtle.heading()
                turtle.setheading(an1)
                turtle.backward(dis)
                turtle.setheading(t2)
    elif level==top and x < 7 :
        turtle.penup()
        turtle.forward(length)
    elif level>3 and x>6 :
        turtle.pendown()
        turtle.forward(length)
        c = random.randint(4, 6)
        for i in range(3, c):
            leaf(turtle.xcor(), turtle.ycor(),node)
        leaf(turtle.xcor(), turtle.ycor(),node)
        
    else:
        turtle.forward(length)
        yu[level] = yu[level] -1
        
    if node > 0 and button == 0:
        right = random.random() * 5 + 17
        left = random.random() * 20 + 19
        child_length = length * (random.random() * 0.25 + 0.7)     
        r=random.randint(0, 1)
        if r==1:
          turtle.right(right)
          level = level + 1
        else:
          turtle.left(right)
          level = level + 1         
        draw(node - 1, child_length,level,yu,button)
        yu[level] = yu[level] +1
        if yu[level] > 1:
            if r==1:
               turtle.left(right + left)
               draw(node - 1, child_length, level, yu,button)
               turtle.right(left)
               yu[level] = yu[level] - 1
            else:
                turtle.right(right + left)
                draw(node - 1, child_length, level, yu,button)
                turtle.left(left)
                yu[level] = yu[level] - 1
        else:
            if r==1:
              turtle.left(right + left)
              turtle.right(left)
            else:
                turtle.right(right + left)
                turtle.left(left)     
    turtle.penup()
    turtle.backward(length)

t = cos(radians(turtle.heading()+5)) / 8 + 0.25
这行代码中出现了math模块(数学模块)中的cos函数,cos就是cosA=(b²+c²-a²)/2bc的意思(需结合以下图片)

yu[level] = yu[level] - 1
这行代码的意义就是把yu这个列表的索引号为level的元素-1赋值给yu这个列表里的索引号为level的元素。举个例子:假设yu这个列表里的第level项元素为13,那么通过这行代码以后,yu这个列表里的索引号为level项元素就会变成12。

an1 = -40 + random.random() * 40
这行代码的意义就是把an1赋值为-40+一个0~1的随机数再*40。

leaf(turtle.xcor(), turtle.ycor(), node)
这行代码中的node参数是指定义draw函数里所定义的node参数,不是定义leaf函数里的node参数。

draw(node - 1, child_length,level,yu,button)
这行代码在draw函数里,引用了递归的语句。递归有三个必要的条件:1.自己调用自己。2.有终止条件。3.终止条件在递归的最开始。

if level == top and x > 6:
if level == top or x >6:
if level == top not x>6:
这行代码虽然也是if elif else的句型,但这里出现了连接词。什么是连接词?就是连接条件的词语,连接词一共只有3个,分别是and、or和not。and是指两个条件同时存在,如上面第一行代码,意思就是既要符合level==top这个条件,又要符合x>6这个条件的时候,才会执行以下代码。or是指两个条件只要一个条件存在,如第二行代码,意思就是只要符合level==top和x>6两个条件中的其中之一,就可以执行一下代码了。not是指不是第一个条件就是第二个条件,或者不是第二个条件就是第一个条件,如第三行代码,意思就是当不是level==top这个条件,就是x>6这个条件。

r=random.randint(0, 1)
这行代码的意义就是随机产生0~1的一个随机整数,绝不是随机产生0~1中的任意一个数。

6.主程序
代码如下:

if __name__ == '__main__':
    turtle.setup(width=1.0, height=1.0)
    turtle.hideturtle()
    turtle.speed(0)
    turtle.penup()
    turtle.left(90)
    turtle.backward(300)
    top = 8
    yu = Fibonacci_Recursion(top)
    yu.remove(yu[0])
    print(yu)
    button = 0
    draw(top, 120, 0, yu, button)
    turtle.write("lzc", font=("微软雅黑", 14, "normal"))
    turtle.done()

turtle.setup(width=1.0, height=1.0)
这行代码中的turtle.setup的意义就是设置画面的全屏显示。

yu.remove(yu[0])
这行代码的意义就是删除yu列表里的索引号为0的元素。

turtle.write("lzc", font=("微软雅黑", 14, "normal"))
这行代码就是书写汉字,其中“lzc”是指书写的文字,“微软雅黑”是指字体,“14”是指紫的大小,“normal”就是普通,普遍的意思。

三、全代码及结果
代码如下:

import turtle
import random
from math import *
print(turtle.heading())
def Fibonacci_Recursion_tool(n):
    if n <= 0:
        return 0
    elif n == 1:
        return 1
    else:
        return Fibonacci_Recursion_tool(n - 1) + Fibonacci_Recursion_tool(n - 2)
def Fibonacci_Recursion(n):
    result_list = []
    for i in range(1, n + 3):
        result_list.append(Fibonacci_Recursion_tool(i))
    return result_list
yu = Fibonacci_Recursion(10)
print(yu)
def leaf(x, y, node):
    til = turtle.heading()
    i = random.random()
    an = random.randint(10, 180)
    ye = random.randint(6, 9)/10
    turtle.color(ye, ye*0.9, 0)
    turtle.fillcolor(ye+0.1, ye+0.05, 0)
    turtle.pensize(1)
    turtle.pendown()
    turtle.setheading(an + 90)
    turtle.forward(8*i)
    px = turtle.xcor()
    py = turtle.ycor()
    turtle.begin_fill()
    turtle.circle(7.5*i, 120)
    turtle.penup()
    turtle.goto(px, py)
    turtle.setheading(an + 90)
    turtle.pendown()
    turtle.circle(-7.5*i, 120)
    turtle.setheading(an + 100)
    turtle.circle(10.5*i, 150)
    turtle.end_fill()
    turtle.penup()
    turtle.goto(x, y)
    turtle.setheading(til)
    turtle.pensize(node / 2 + 1)
def draw(node, length, level, yu, button):
    turtle.pendown()
    t = cos(radians(turtle.heading()+5)) / 8 + 0.25
    turtle.pencolor(t*1.6, t*1.2, t*1.4)
    turtle.pensize(node/1.2)
    x = random.randint(0, 10)
    
    if level == top and x > 6:
        turtle.forward(length)
        yu[level] = yu[level] - 1
        c = random.randint(2, 10)
        for i in range(1, c):
            leaf(turtle.xcor(), turtle.ycor(), node)
            if random.random() > 0.3:
                turtle.penup()
                t1 = turtle.heading()
                print("turtle.heading()",t1)
                an1 = -40 + random.random() * 40
                turtle.setheading(an1)
                dis = int(800 * random.random() * 0.5 + 400 * random.random() * 0.3 + 200 * random.random() * 0.2)
                turtle.forward(dis)
                turtle.setheading(t1)
                turtle.right(90)
                leaf(turtle.xcor(), turtle.ycor(), node)
                turtle.left(90)
                t2 = turtle.heading()
                turtle.setheading(an1)
                turtle.backward(dis)
                turtle.setheading(t2)
    elif level==top and x < 7 : 
        turtle.penup()
        turtle.forward(length)
    elif level>3 and x>6 :
        turtle.pendown()
        turtle.forward(length)
        c = random.randint(4, 6)
        for i in range(3, c):
            leaf(turtle.xcor(), turtle.ycor(),node)
        leaf(turtle.xcor(), turtle.ycor(),node)
        #button=1
        
    else:
        turtle.forward(length)
        yu[level] = yu[level] -1
        
    if node > 0 and button == 0:
        right = random.random() * 5 + 17
        left = random.random() * 20 + 19
        child_length = length * (random.random() * 0.25 + 0.7)      
        r=random.randint(0, 1)
        if r==1:
          turtle.right(right)
          level = level + 1
          #print("level", level)
        else:
          turtle.left(right)
          level = level + 1        
        draw(node - 1, child_length,level,yu,button)
        yu[level] = yu[level] +1
        if yu[level] > 1:
            if r==1:
               turtle.left(right + left)
               draw(node - 1, child_length, level, yu,button)
               turtle.right(left)
               yu[level] = yu[level] - 1
            else:
                turtle.right(right + left)
                draw(node - 1, child_length, level, yu,button)
                turtle.left(left)
                yu[level] = yu[level] - 1
        else:
            if r==1:
              turtle.left(right + left)
              turtle.right(left)
            else:
                turtle.right(right + left)
                turtle.left(left)     
    turtle.penup()
    turtle.backward(length)
if __name__ == '__main__':
    turtle.setup(width=1.0, height=1.0)
    turtle.hideturtle()
    turtle.speed(0)
    turtle.penup()
    turtle.left(90)
    turtle.backward(300)
    top = 8
    yu = Fibonacci_Recursion(top)
    yu.remove(yu[0])
    print(yu)
    button = 0
    draw(top, 120, 0, yu, button)
    turtle.write("lzc", font=("微软雅黑", 14, "normal"))
    turtle.done()

你学会了吗?

用Turtle画银杏树相关推荐

  1. python turtle画熊-Python turtle画图库画姓名实例

    *****看一下我定义的change()和run()函数****** 绘图坐标体系: 作用:设置主窗体的大小和位置 ? 1 turtle.setup(width, height, startx, st ...

  2. python turtle画椭圆-Python易学就会(五)turtle绘制椭圆与递归

    前两篇文章基本涵盖了turtle的大部分功能,同时也借由对turtle功能的展示,厘清了Python的一些语法特点,以利于新手入门.但是短短几个例子,阐述得还是有限,这里再展开两个知识点,一方面对tu ...

  3. python画树叶-使用Python turtle画分形树叶图

    关于使用Python的turtle画树叶的代码. 感兴趣的可以自己了解一下分形树叶的数学几何原理--含概率的迭代函数系统.代码不难,关键是数学原理哦~还有,绘制过程有助于对代码和数学原理理解,大家动手 ...

  4. 用python的turtle画圆-(python海龟绘图怎么增加每次画圆的半径)

    Python 如何调用graphics库画圆弧,半圆等 import turtle turtle.left(135) turtle.circle(120,90) turtle.done() pytho ...

  5. python turtle画椭圆-【python turtle如何画椭圆】

    python turtle画4个同心圆方法 from turtle import * def Circle(radius,angle,length): for i in range(length): ...

  6. python画椭圆turtle_Python turtle画图库画姓名实例

    *****看一下我定义的change()和run()函数****** 绘图坐标体系: 作用:设置主窗体的大小和位置 turtle.setup(width, height, startx, starty ...

  7. 如何用python画一个心形图_求问怎样用python/python turtle画“心”

    展开全部 python turtle画52614个同心圆方法 import turtle #draw first circle turtle.penup() turtle.goto(0,-200) t ...

  8. python turtle画房子详细解释_[宜配屋]听图阁

    我就废话不多说了,直接上代码吧! import turtle t=turtle.Turtle() turtle.Turtle().screen.delay(0) tleft=turtle.Turtle ...

  9. 用Python标准库turtle画一只老虎,祝您新年虎虎生威,大吉大利

    用Python标准库turtle画一只老虎,祝您新年虎虎生威,大吉大利! 虎年到了,祝大家新年虎虎生威!大吉大利! 去年我用Python画了一头金牛,参考:https://blog.csdn.net/ ...

最新文章

  1. AMD Athlon ⅡX2 240 K10 平台 超频 全记录
  2. rabbitmq java实例_RabbitMQ消息队列入门篇(环境配置+Java实例+基础概念)
  3. hashtable允许null键和值吗_MySQL默认值选型是空,还是 NULL-爱可生
  4. 整理一些提高C#编程性能的技巧
  5. 邮件发送类,支持Gmail
  6. python cmath模块_cmath模块-PYTHON
  7. adb 命令的个人记录
  8. php弹幕技术轮询,PHP实现长轮询消息实时推送功能代码
  9. 用0和5凑被90整除的max数(洛谷P2192题题解,Java语言描述)
  10. mysql like 贪婪匹配_mysql模糊查询like与REGEXP的使用详细介绍
  11. 如果抛开 Spring,如何自己实现 AOP?面试必问!
  12. sharepoint学习资料-个人博客
  13. bin文件用cad打开_bin文件怎么打开?实测可靠方法
  14. BitBake用户手册-3.语法和操作
  15. python实现搜索功能_python实现搜索框关键词采集功能
  16. 视频格式与编码压缩标准 mpeg4,H.264.H.265 有什么关系?
  17. 自动控制原理笔记-根轨迹法
  18. 宠物寄养小程序实战教程(上篇)
  19. 论光模块光电信号的转换和信号的调制
  20. EMV中易混淆概念总结

热门文章

  1. 星起航:抖店的无货源玩法
  2. 使用Tensorflow对象检测接口进行像素级分类
  3. TensorFlow详解猫狗识别 (三)--训练过程
  4. 吴恩达深度学习笔记(48)-教你如何调参
  5. SONY索尼MP4视频变RSV文件修复方法
  6. java有理数的除法运算,Java互评-有理数的设计
  7. 李开复:我和奥巴马是全班最害羞的人
  8. nginx 静态文件目录配置
  9. Linux安装tomcat方法步骤
  10. word中英文单词字母之间自动有空格