一、什么是银杏树

银杏树,大家应该都见过,有扇子似的叶子,我找了一张图片:

二、讲解代码

1.引入模块并打印当前画笔的角度

代码如下:

import turtle
import random
from math import *
print(turtle.heading())

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

2.定义斐波那契数列的方法的函数

代码如下:

def Fibonacci_Recursion_tool(n):if n<=0:return 0elif n==1:return 1else: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 0elif n==1:return 1else: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)/10turtle.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.25turtle.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] - 1c = 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] -1if node > 0 and button == 0:right = random.random() * 5 + 17left = random.random() * 20 + 19child_length = length * (random.random() * 0.25 + 0.7)     r=random.randint(0, 1)if r==1:turtle.right(right)level = level + 1else:turtle.left(right)level = level + 1         draw(node - 1, child_length,level,yu,button)yu[level] = yu[level] +1if 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] - 1else:turtle.right(right + left)draw(node - 1, child_length, level, yu,button)turtle.left(left)yu[level] = yu[level] - 1else: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和notand是指两个条件同时存在,如上面第一行代码,意思就是既要符合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 = 8yu = Fibonacci_Recursion(top)yu.remove(yu[0])print(yu)button = 0draw(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 0elif n == 1:return 1else: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)/10turtle.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.25turtle.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] - 1c = 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() * 40turtle.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=1else:turtle.forward(length)yu[level] = yu[level] -1if node > 0 and button == 0:right = random.random() * 5 + 17left = random.random() * 20 + 19child_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] +1if 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] - 1else:turtle.right(right + left)draw(node - 1, child_length, level, yu,button)turtle.left(left)yu[level] = yu[level] - 1else: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 = 8yu = Fibonacci_Recursion(top)yu.remove(yu[0])print(yu)button = 0draw(top, 120, 0, yu, button)turtle.write("lzc", font=("微软雅黑", 14, "normal"))turtle.done()

结果如下:

用Turtle绘制漂亮的飘落银杏树相关推荐

  1. python情人节之玫瑰花与表白方式_情人节快乐! python绘制漂亮玫瑰

    情人节快乐!这个节日怎么会少了浪漫的玫瑰花! 用Python的turtle库绘图是很简单的,画了一个玫瑰花,下面奉上源码: 源码: ''' Created on Nov 18, 2017 @autho ...

  2. python turtle画椭圆-python turtle 绘制太极图的实例

    效果如下所示: # -*- coding: utf-8 -*- import turtle # 绘制太极图函数 def draw_TJT(R): turtle.screensize(800, 600, ...

  3. python画图哆啦a梦-使用Python的Turtle绘制哆啦A梦实例

    这是我几年前为了练习python的turtle库而画的,今天翻出了代码,分享给大家. 这是我初学python时画的,当时还没有面向对象的概念,也没有采取类方法之类,纯原始手工,供大家参考. 若有兴趣可 ...

  4. python turtle画彩虹-Python turtle 绘制彩色螺旋线

    小朋友总会别各种五颜六色的色彩所吸引,就拿小编的小侄子来说,自己很喜欢美术课,看到五颜六色的颜色都想尝试着图一下,但结果总是不仅人意,今天南京小码王Python培训机构,就为大家介绍一下Python ...

  5. python简笔画绘制 数据驱动绘图恐龙_使用python turtle绘制简笔画大白-Go语言中文社区...

    使用python turtle绘制简笔画大白 完整代码: import turtle as t pen = t.Turtle() # 定义画笔实例 pen.speed(0) pen.pensize(5 ...

  6. 使用Python+turtle绘制同心圆

    使用Python+turtle绘制同心圆 问题描述:数学定义上是指:同一平面上同一圆心而半径不同的圆.简单来说就是:圆心相同半径不同的圆,如果几个圆的圆心是同一点,那么这几个圆就叫做同心圆. 本文使用 ...

  7. python画国际象棋_python图形工具turtle绘制国际象棋棋盘

    本文实例为大家分享了python图形工具turtle绘制国际象棋棋盘的具体代码,供大家参考,具体内容如下 #编写程序绘制一个国际象棋的棋盘 import turtle turtle.speed(30) ...

  8. python turtle绘制柱状图_python绘制图形(Turtle模块)

    用python的Turtle模块可以绘制很多精美的图形,下面简单介绍一下使用方法. 需要用到的工具有python,python 的安装这里就不再细说.自行搜索. from turtle import ...

  9. Python+turtle绘制虚线同心圆

    问题描述: 使用turtle绘制虚线同心圆,在绘制过程中,不停地抬笔和落笔来使用实线段模拟虚线效果. 参考代码: 运行效果:

最新文章

  1. 新的mysql如何使用_如何使用新的MySQL更新日志
  2. java右移位_java、、移位操作方法
  3. Elasticsearch 基础入门
  4. 【dfs】无穷迷宫(jzoj 3924)
  5. HTML5和CSS3:游戏的变革Flexbox
  6. VsDoc for jQuery
  7. 信贷常用风控报表(二)
  8. UnrealEngine4和3DMax的配合_准备资源
  9. 币安Binance API
  10. 凸包+旋转卡壳模板——kuangbin版
  11. (转) C#网速监测
  12. pgAdmin 4 v4.0 发布
  13. MAC下的SVN工具
  14. linux制作flash软件,Ubuntu中轻松制作Flash短片
  15. SciPy 科学计算基础
  16. html怎么改默认浏览器,怎样设置默认浏览器?3种更改默认浏览器方法介绍
  17. CES2013前瞻:1080p屏幕手机集中爆发
  18. 用shell bash自动化程序
  19. PHP压缩和解压缩文件的三种方式
  20. Xcode使用OpenCV访问Mac摄像头权限问题

热门文章

  1. 1、ESP32-S - 安装开发工具 thonny IDE
  2. 作为中国人要知道的一些常识[ZT]
  3. 如何修改系统磁盘盘符
  4. 差异表达基因提取limma+WGCNA分析全代码
  5. 分布式与集群的区别是什么?
  6. 安卓手机变成横屏_这下牛bi了,自己体会!这才是手机上该有的神器!
  7. 边框(border)
  8. 压力机的性能调优过程
  9. CF1007E Mini Metro(DP 化散为整,将状态压缩)
  10. 《优势谈判》笔记……