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)