2.Python基本图形绘制
2.1 深入理解Python语言
计算机技术的演进
- 计算机技术的演进过程
- 1946-1981 计算机系统结构时代(35年)- 计算能力问题
- 1981-2008 网络和视窗时代(27年)- 交互问题
- 2008-2016 复杂信息系统时代(8年)- 数据问题
- 2017- 人工智能时代 - 人类的问题
- 我们现在的时代:新计算时代
编程语言的多样初心
-
C(计算机系统结构时代)
- 学习内容 指针、内存、数据类型
- 语言本质 理解计算机系统结构
- 解决问题 性能
- 适用对象 计算机类专业
-
Java(网络和视窗时代;面向对象语言)
- 学习内容 对象、跨平台、运行时
- 语言本质 理解主客体关系
- 解决问题 跨平台
- 适用对象 软件类专业
-
C++
- 学习内容 对象、多态、继承
- 语言本质 理解主客体关系
- 解决问题 大规模程序(如操作系统)
- 适用对象 计算机类专业
-
VB(网络和视窗时代)
- 学习内容 对象、按钮、文本框
- 语言本质 理解交互逻辑
- 解决问题 桌面应用
- 适用对象 不确定(很少)
-
Python(复杂信息系统时代)
- 学习内容 编程逻辑、第三方库
- 语言本质 理解问题求解
- 解决问题 各类问题的计算部分
- 适用对象 所有专业
-
2018年以后的计算环境
大数据、云计算、物联网、信息安全、人工智能等需求爆发
解决日益增长的计算需求,用什么语言?
Python语言的特点
-
Python语言是通用(普世)、脚本、开源、跨平台、多模型语言
-
特点与优势
-
语法简洁
-
C代码量的10%
-
强制可读性(缩进)
-
较少的底层语法元素
-
多种编程方式
-
支持中文字符
-
-
生态高产
- 快速增长的计算生态(13万第三方库)
- 避免重复造轮子
- 开发共享
- 跨操作系统平台
-
-
如何看待Python
-
人生苦短,我学Python
-
C/C++
Python语言不能解决计算机底层/内存/接口方面的工作,需要C
对效率,执行速度无多少要求的,完全可以用Python实现
-
Java:针对特定开发和岗位需求
-
HTML/CSS/JS:不可替代的前端技术,全栈能力
-
其他:R/Go/Matlab,特定领域
-
-
最高产的程序设计语言
- 掌握抽象并求解计算问题综合能力的语言
- 了解产业界解决复杂计算问题方法的语言
- 享受利用编程将创新变成现实乐趣的语言
-
工具决定思维:Python高效产出
-
“超级语言”的诞生
- 编程语言的种类
- 机器语言
- 二进制语言,直接执行
- 和CPU型号有关
- 汇编语言
- 将二进制代码直接对应助记符,和CPU有关,需要汇编器转换
- 如add 2,3 ,result是2+3功能的汇编语言
- 高级语言
- 接近自然语言,容易描述计算问题
- 与CPU型号无关,编译运行
- 如result = 2 + 3
- 机器语言
- 编程语言种类和发展
- 机器语言-汇编语言-高级语言
- 超级语言
- 粘性整合已有程序,具有庞大的计算生态
- 编程思维:刀耕火种->集成开发
- 如result=sum(2,3)
- Python是以计算生态位标志的“超级语言”
2.2 实例2:Python蟒蛇绘制
“Python蟒蛇绘制”问题分析
-
Python蟒蛇绘制
-
设计形状
-
问题1 计算机绘图原理是?
一段程序为什么能产生窗体?为什么能在窗体上绘制图形?
-
问题2 绘制从哪开始?
如何绘制一条线?如何绘制一个弧形?如何绘制一个蟒蛇?
-
“Python蟒蛇绘制”实例编写
#PythonDraw.py
import turtle
turtle.setup(650,350,200,200)
turtle.penup()
turtle.fd(-250)
turtle.pendown()
turtle.pensize(25)
turtle.pencolor("purple")
turtle.seth(-40)
for i in range(4):
turtle.circle(40,80)
turtle.circle(-40,80)
turtle.circle(40,80/2)
turtle.fd(40)
turtle.circle(16,180)
turtle.fd(40*2/3)
turtle.done()
import是保留字,它引入了一个绘图库,名字叫turtle
import turtle就是这段程序可绘图的原因
“Python蟒蛇绘制”举一反三
- 语法理解 共17行,多行相似
- 参考框架结构,逐行理解
- 程序参数改变
- 颜色
- 长度
- 方向
- 计算问题拓展-是各类图形绘制问题代表
2.3 模块1:turtle库的使用
turtle库基本介绍
- turtle库概述
- 海龟库,是turtle绘图体系的Python实现
- 是Python标准库之一
- 入门级图形绘制函数库
- 标准库
- Python计算生态=标准库(随解释器安装)+第三方库(需经过安装才能使用)
- 库Library、包Package、模块Module,统称模块
- turtle的原理(玩法)
- 有一只海龟在窗体中心,在布上游走
- 走过的轨迹成了图形
- 海龟可变颜色、宽度等
turtle绘图窗体布局
-
turtle的绘图窗体
-
在操作系统上表现为窗口,是turtle的画布空间,最小单位是像素
-
屏幕坐标系
-
左上角是(0,0)
-
turtle.setup(width,height,startx,starty)
设置窗体的宽度(横向),高度,x(横向),y
xy坐标即窗体左上角位置相对于屏幕左上角的坐标
setup函数非必须,其中最后两个参数也非必须
-
-
turtle空间坐标体系
-
绝对坐标
-
绝对坐标(0,0)在画布正中心,海龟初始朝向为右
-
右为x,上为y
-
turtle.goto(x,y)
指让海龟到达(x,y)
-
-
海龟坐标
- 根据海龟朝向,有前进方向,后退方向,左侧方向,右侧方向
- turtle.fd(d)向正前方运行,turtle.bk(d)向反方向运行
- turtle.circle(r,angle)是以海龟当前位置左侧一点为圆心曲线运行
turtle角度坐标体系
-
绝对角度
-
x轴正方向为0/360度,y轴正方向为90/-270度
-
turtle.seth(angle)
改变海龟行进角度(以度为单位)
-
-
海龟角度
- turtle.left(angle)/turtle.right(angle)
- 令海龟向左/右转angle度
RGB色彩体系
-
RGB色彩模式
- 由三种颜色构成万物色(指红蓝绿的三个通道颜色组合)
- 覆盖视力所能感知的所有颜色
- 每色取值为0-255整数或0-1小数
-
常用RGB色彩
- white;255,255,255;1,1,1;白色
- yellow;255,255,0;1,1,0;黄色
- magenta;255,0,255;1,0,1;洋红
- cyan;0,255,255;0,1,1;青色
- blue;0,0,255;0,0,1;蓝色
- black;0,0,0;0,0,0;黑色
- seashell;255,245,238;1,0.96,0.93;海贝色
- gold;255,215,0;1,0.84,0;金色
- pink;255,192,203;1,0.75,0.80;粉红色
- brown;165,42,42;0.65,0.16,0.16;棕色
- purple;160,32,240;0.63,0.13,0.94;紫色
- tomato;255,99,71;1,0.39,0.28;番茄色
-
色彩模式切换
-
默认采用小数值,可切换为整数值
turtle.colormode(1.0)/turtle.colormode(255)
-
2.4 turtle程序语法元素分析
库引用与import
-
“turtle.”是<a>.<b>()的编码风格
-
库应用
-
扩充Python程序功能的方式
-
使用import保留字完成,<a>.<b>()的编码风格
-
使用时
import <库名>库名>
<库名>.<函数名>(<函数参数>) 函数参数>函数名>库名>
-
-
-
import更多用法
-
使用from和import保留字共同完成
from <库名> import <函数名>函数名>库名>
from <库名> import *库名>
<函数名>(<函数参数>) 函数参数>函数名> -
比较
- 以import库名的方式使用时的**<库名>.<函数名>**整个是新程序的函数名函数名>库名>
- 以from库名import*则库中函数的函数名就是独立的函数名
- 第一种方法不会出现函数重名的问题(因此在import很多库时用第一种)
-
使用import和as保留字共同完成
import <库名> as <库别名>库别名>库名>
<库别名>.<函数名>(<函数参数>) 即**给外部库关联一个更短、更适合的名字** 函数参数>函数名>库别名>
-
turtle画笔控制函数
-
画笔控制函数
-
画笔操作后一直有效,一般成对出现
-
turtle.penup()/turtle.pu()/turtle.up()(turtle库为编写者设计的冗余性函数)
抬起画笔,海龟飞行
-
turtle.pendown()/turtle.pd()
放下画笔
-
-
画笔设置后一直有效,直至下次重新设置
-
turtle.pensize(width)/turtle.width(width)
画笔宽度,海龟腰围
-
turtle.pencolor(color)color为颜色字符串或r,g,b值
画笔颜色,海龟涂装
其中color参数有三种形式
- 颜色字符串:turtle.pencolor(“purple”)
- RGB的小数值:turtle.pencolor(0.63,0.13,0.94)
- RGB的元组值:turtle.pencolor((0.63,0.13,0.94))
-
-
turtle运动控制函数
-
运动控制函数
-
控制海龟行进:直线/曲线
-
turtle.forward(d)/turtle.fd(d)
其中d可为负数(倒退)
-
turtle.circle(r,extent)
根据半径r(圆心在左侧r位置处)绘制一个extent角度的弧形
第二个参数无时默认360度整圆
-
-
turtle方向控制函数
-
方向控制函数
-
控制海龟面对方向:绝对角度/海龟角度
-
turtle.setheading(angle)/turtle.seth(angle)
将海龟转为绝对坐标下的angle角度方向
-
turtle.left(angle)
-
turtle.right(angle)
-
-
循环语句与range()函数
-
循环语句:按照一定次数循环执行一组语句
-
for <变量> in range (<参数>):参数>变量>
<被执行循环的语句>被执行循环的语句>
- <变量>表示每次循环次数(循环到了第几次),0到<次数>-1 次数>变量>
-
-
range()函数:产生循环计数序列
- range(n):产生0到n-1的整数序列,共n个数
- range(m,n):产生m到n-1的整数序列,共n-m个
for i in range(5):
print(i)
result:
0
1
2
3
4
#若
#for i in range(5):
# print("Hello:",i)
#result:
# Hello: 0
# Hello: 1
# Hello: 2
# Hello: 3
# Hello: 4
#可以发现print中的“,”起到了空格的作用
“Python蟒蛇绘制”代码分析
import turtle
turtle.setup(650,350,200,200)
turtle.penup()
turtle.fd(-250)
turtle.pendown()
turtle.pensize(25)
turtle.pencolor("purple")
turtle.seth(-40)
for i in range(4):
turtle.circle(40,80)
turtle.circle(-40,80)
turtle.circle(40,80/2)
turtle.fd(40)
turtle.circle(16,180)
turtle.fd(40*2/3)
turtle.done()
其中turtle.done()函数在使用文件式(而非交互式)编写时停止画笔绘制,程序运行之后,程序不会退出,需手工关闭窗体退出
练习
-
实例2: Python蟒蛇绘制
描述
这是”实例”题,与课上讲解实例相同,请作答检验学习效果。
使用turtle库,绘制一个蟒蛇形状的图形。
注意:这不是自动评阅题目,仅用于练习,没有评阅。
输出示例
输出效果如下:
import turtle as t
t.setup(650,350,200,200)
t.pu()
t.fd(-250)
t.pd()
t.pensize(25)
t.pencolor("purple")
t.seth(-40)
for i in range(4):
t.circle(40,80)
t.circle(-40,80)
t.circle(40,40)
t.fd(40)
t.circle(16,180)
t.fd(80/3)
t.done()
#PythonDraw.py
import turtle
turtle.setup(650, 350, 200, 200)
turtle.penup()
turtle.fd(-250)
turtle.pendown()
turtle.pensize(25)
turtle.pencolor("purple")
turtle.seth(-40)
for i in range(4):
turtle.circle(40, 80)
turtle.circle(-40, 80)
turtle.circle(40, 80/2)
turtle.fd(40)
turtle.circle(16, 180)
turtle.fd(40 * 2/3)
turtle.done()
-
turtle正方形绘制
描述
使用turtle库,绘制一个正方形。
注意:这不是自动评阅题目,仅用于练习,没有评阅。
##
输出示例
正方形效果如下:
import turtle as t t.pensize(6) t.goto(200,0) t.goto(200,200) t.goto(0,200) t.goto(0,0) t.done() #RectDraw.py import turtle as t t.pensize(2) for i in range(4): t.fd(150) t.left(90)
-
turtle六边形绘制
描述
使用turtle库,绘制一个六边形。
注意:这不是自动评阅题目,仅用于练习,没有评阅。
##
输出示例
六边形效果如下:
import turtle as t t.pensize(5) for i in range(6): t.fd(150) t.left(60) t.done() #HexagonDraw.py import turtle as t t.pensize(2) for i in range(6): t.fd(150) t.left(60)
-
turtle叠边形绘制
描述
使用turtle库,绘制一个叠边形,其中,叠边形内角为100度。
注意:这不是自动评阅题目,仅用于练习,没有评阅。
##
输出示例
叠边形效果如下:
import turtle as t t.pensize(3) for i in range(9): t.fd(150) t.left(80) t.done() #TwoRoundDraw.py import turtle as t t.pensize(2) for i in range(9): t.fd(150) t.left(80) #720/9
-
turtle风轮绘制
描述
使用turtle库,绘制一个风轮效果,其中,每个风轮内角为45度,风轮边长150像素。
注意:这不是自动评阅题目,仅用于练习,没有评阅。
提示:turtle.goto(x,y)函数,能够将turtle画笔移动到坐标(x,y)
输出示例
叠边形效果如下:
import turtle as t t.pensize(3) for i in range(4): t.fd(150) t.right(90) t.circle(-150,45) t.right(90) t.fd(150) t.left(135) t.done() #WindWheel.py import turtle as t t.pensize(2) for i in range(4): t.seth(90*i) t.fd(150) t.right(90) t.circle(-150, 45) t.goto(0,0)
测验
单项选择题
-
哪个选项不能正确引用turtle库进而使用setup()函数?
A. from turtle import*
B. import turtle as t
C. import turtle
D. import setup from turtle
D
import只有三种使用方法,以turtle库为例:
import turtle
from turtle import setup 或 from turtle import *
import turtle as t (其中t是别名,可以更换其他名称)
-
关于turtle库,哪个选项的描述是错误的?
A. turtle坐标系的原点默认在屏幕左上角
B. turtle库是一个直观有趣的图形绘制函数库
C. turtle绘图体系以水平右侧为绝对方位的0度
D. turtle库最早成功应用于LOGO编程语言
A
turtle坐标系的原点默认在窗体正中间
-
哪个选项是turtle绘图中角度坐标系的绝对0度方向?
A. 画布正左方
B. 画布正下方
C. 画布正上方
D. 画布正右方
D
坐标系类似这样,角度坐标系的绝对0度方向是右侧
-
哪个选项是下面代码的执行结果?
turtle.circle(-90,90)
A. 绘制一个半径为90像素的弧形,圆心在小海龟当前行进的右侧
B. 绘制一个半径为90像素的弧形,圆心在画布正中心
C. 绘制一个半径为90像素的整圆形
D. 绘制一个半径为90像素的弧形,圆心在小海龟当前行进的左侧
A
circle(x, y) 表示 以x长度为半径,y为角度,当前方向左侧x出为圆心,画圆。其中x和y都可以是负数,相应取反。
-
关于turtle库绘图函数,哪个选项的描述是错误的?
A. turtle.seth(to_angle)函数的作用是设置小海龟当前行进方向为to_angle,to_angle是角度的整数值
B. turtle.fd(distance)函数的作用是向小海龟当前行进方向前进distance距离
C. turtle.pensize(size)函数的作用是改变画笔的宽度为size像素
D. turtle.circle(radius, extent=None)函数的作用是绘制一个椭圆形,extent参数可选
D
circle()函数不能绘制椭圆形。
-
关于turtle库的画笔控制函数,哪个选项的描述是错误的?
A. turtle.width()和turtle.pensize()都可以用来设置画笔尺寸
B. turtle.penup()的别名有turtle.pu(),turtle.up()
C. turtle.pendown()作用是落下画笔,并移动画笔绘制一个点
D. turtle.colormode()的作用是设置画笔RGB颜色的表示模式
C
turtle.pendown()只是放下画笔,并不绘制任何内容。
-
哪个选项不能改变turtle画笔的运行方向?
A. right()
B. left()
C. bk()
D. seth()
C
bk()只能后退,但不改变方向,”后退”不是”转向”。
-
哪个选项所列保留字能够实现对一组语句的循环执行?
A. while和def
B. for和in
C. range()
D. if和else
B
循环相关保留字是:for..in和while,但def用于定义函数,不相关。
-
哪个选项能够使用turtle库绘制一个半圆形?
A. turtle.circle(100, -180)
B. turtle.circle(100, 90)
C. turtle.fd(100)
D. turtle.circle(100)
A
circle(x,y)函数的用法,绘制半圆,第二个参数y是180的奇数倍。
-
哪个选项对turtle.done()的描述是正确的?
A. turtle.done()用来隐藏turtle绘制画笔,一般放在代码最后
B. turtle.done()用来停止画笔绘制,但绘图窗体不关闭
C. turtle.done()用来暂停画笔绘制,用户响应后还可以继续绘制
D. turtle.done()放在代码最后,是turtle绘图的必要要求,表示绘制完成
B
建议在每个turtle绘图最后增加turtle.done()。
程序设计题
-
turtle八边形绘制
描述
使用turtle库,绘制一个八边形。
注意:这是一个自动评阅题目,请补充”编程模板”中横线内容,横线不保留。
输出示例
八边形效果如下:
#请在横线中填写Python表达式或语句,实现所需要的功能
#注意:补充代码将以匹配方式评阅,代码中不要出现空格
import turtle as t
t.pensize(2)
for i in range(_):
t.fd(100)
t.left(_)
import turtle as t
t.pensize(2)
for i in range(8):
t.fd(100)
t.left(45)
-
turtle八角图形绘制
描述
使用turtle库,绘制一个八角图形。
注意:这是一个自动评阅题目,请补充”编程模板”中横线内容,横线不保留。
输出示例
八角图形效果如下:
#请在横线中填写Python表达式或语句,实现所需要的功能 #注意:补充代码将以匹配方式评阅,代码中不要出现空格 import turtle as t t.pensize(2) for i in range(_): t.fd(150) t.left(_) import turtle as t t.pensize(2) for i in range(8): t.fd(150) t.left(135)