系统环境 ubuntu18

4.1turtle模块

模块一开始导入turtle模块就报错了

1 Python 3.6.5 (default, Apr 1 2018, 05:46:30)2 [GCC 7.3.0] on linux3 Type "help", "copyright", "credits" or "license" formore information.4 >>>import turtle5 Traceback (most recent call last):6 File "", line 1, in

7 File "/usr/lib/python3.6/turtle.py", line 107, in

8 import tkinter asTK9 ModuleNotFoundError: No module named 'tkinter'

从错误信息中可以看出:

turtle模块引用tkinter模块,但当前的运行环境没有tkinter模块文件,所以报错

解决办法:

注意:这里如果直接安装tkinter,会发现没有tkinter包

因为python-tk/python3-tk的类库需要在操作系统层面进行安装

这里把tkinter是什么,以及解决的过程描述的很清晰了。不再缀述,

只说解决办法:

使用命令安装:

sudo apt-get install tcl-dev tk-dev python3-tk

开始安装:

1 wangju@wangju-GL553VD:~$ sudo apt-get install tcl-dev tk-dev python3-tk2 [sudo] password forwangju:3 Reading package lists... Done4 Building dependency tree5 Reading state information... Done

完成安装:

再试一下:

问题解决

1 Python 3.6.5 (default, Apr 1 2018, 05:46:30)2 [GCC 7.3.0] on linux3 Type "help", "copyright", "credits" or "license" formore information.4 >>>import turtle5 >>> bob = turtle.Turtle()

出现了一个这样的窗口

创建文件mypolygon.py

代码如下:

1 import tutle2 bob =turtle.Turtle()3 print(bob)4 turtle.mainloop()

运行mypolygon.py,结果如下:

1 wangju@wangju-GL53VD:~$ python3 mypolygon.py2

若要画一个朝右的角,在程序中(建立bob实例之后,调用mainloop之前)添加如下代码:

bob.fd(100)

bob.lt(90)

bob.fd(100)

运行这个程序时,将会看到bob先向东走,再向北走,身后留下两线段

现在修改程序,画出一个正方形来

1 bob.fd(100)2 bob.lt(90)3

4 bob.fd(100)5 bob.lt(90)6

7 bob.fd(100)8 bob.lt(90)9

10 bob.fd(100)

4.2简单重复

下面是使用for语句绘制正方形的程序

1 for i in range(4):2 bob.fd(100)3 bob.lt(90)

for 语句的语法和函数定义类似。它也有一个以冒号结束的语句头,并有一个缩进的语句体。语句体可以包含任意数量的语句。

for语句也称为循环(loop),因为执行流程会遍历语句体,之后从语句体的最开头重新循环执行。在这个例子里,,语句体执行了4次。

4.3练习

1.写一个函数 square,接受一个形参t,用来表示一只乌龟。利用乌龟来画一个正方形。

写一个函数调用,传入bob作为实参来调用square函数,并再运行一遍程序。

1 import turtle2 bob =turtle.Turtle()3

4 def square(t):5 for i in range(4):6 t.fd(100)7 t.lt(90)8

9 #函数调用10 square(bob)11 turtle.mainloop()

2.给 square 函数再添加一个形参 length。修改函数内容,保证正方形的长度是length,并修改函数调用以提供这第二个实参。再运行一遍程序。使用不同的length值测试你的程序。

1 import turtle2 bob =turtle.Turtle()3

4 def square(t,length):5 for i in range(4):6 t.fd(length)7 t.lt(90)8

9 square(bob,50)10 turtle.mainloop()

3.复制 square函数,并命名为 polygon。再添加一个形参n并修改函数体以绘制一个正n边形。提示: 正n边形的拐角是360/n度。

def polygon(t,length,n):'''t bob,length 多边形每边的长度(bob每次移动的距离),n 正n边形'''

for i inrange(n):

t.fd(length)

t.lt(360/n)

# square(bob,200)

#正五边形

# polygon(bob,100,5)

#正3角形

polygon(bob,100,3)

4.写一个函数 circle接受代表乌龟的形参t,以及表示半径的形参 r ,并使用合适的长度和边数调用polygon画一个近似的圆。使用不同的r 值来测试你的函数。

提示: 思考圆的周长(circumference),并保证 length * n = circumference.

另一个提示: 如果你觉得bob太慢,可以修改bob.delay来加速。bob.delay代表每次行动之间的停顿,单位是秒。bob.delay = 0.01应该能让它跑得足够快。

解释:bob第一次移动的距离即圆形的半径r(圆上的任意一点到圆心的距离称为半径)。如图所示:

圆的周长公式:周长L=2πr(其中r为圆的半径,π为圆周率,通常情况下取3.14)

所以“ 合适的长度和边数”是

length * n = circumference

circumference=2πr

所以 length * n=2πr

如果不遵守这个规则,也可以画出圆,但是圆的半径却不能保证是r了,如图:

缩小r的值以后:

使用函数来编写程序:

1 def circle(t,r,length,n):2 #先画出圆心到圆周的距离r3 t.fd(r)4 polygon(t,length,n)5

6 #半径1007 circle(bob,100,12.5,50)

5.给circle函数写一个更通用的版本,称为arc。增加一个形参 angle,用来表示画的圆弧的大小。这里angle的单位是度数,所以当 arc = 360时,则会画一个整圆。

这道题看不太懂是什么意思,我想是不是应该是这个意思,指定一个圆的周长,用angle表示。然后当周长是360时,会画出一个整圆(应该是angle=350吧?)

1 #angle 表示圆弧的长度2 def arc(t,angle):3 #随机生成一个在10~30之间的边长4 n = random.randint(15,20)5

6 length= angle/n7

8 t.fd(n)9 polygon(t,length,n)10 arc(bob,360)

最后一道题感觉做的有问题,但是不想再深究了,因为主要不是为了解析这一道数学题目,而是为了学习书中的编程思想

4.4 封装

第一个练习要求把画正方形的代码放到一个函数定义中,并将乌龟bob作为实参传入,调用该函数。

最内侧的语句,fd和lt都缩进了两层,表示它们是在for 语句体内部,而for语句在函数定义的函数体内部。最后一行 square(bob),又重新从左侧开始而没有缩进,这表明for语句和square函数都已经结束。

在函数体中,t引用的乌龟和bob引用的相同,所以 t.lt(90)和直接调用bob.lt(90)是一样的效果。在这种情况下为什么不直接把形参写成bob呢?原因是t可以是任何乌龟,而不仅仅是bob,所以可以再新建一只乌龟,并将它作为参数传入到square函数

1 alice =turtle.Turtle()2 square(alice)

把一段代码用函数包裹起来,称为封装。封装的一个好处是,它给这段代码一个有意义的名称,增加了可读性。另一个好处是,当重复使用这段代码时,调用一次函数比复制粘贴代码要简易的多。

4.5泛化

给函数添加参数的过程称为泛化,因为它会让函数变得更通用

如果函数的形参比较多,很容易忘掉每一个具体是什么,或者忘掉它们的顺序,所以在Python中,调用函数时可以加上形参名称,这样是合法的,并且有时候会有帮助:

polygon(bob,n=7,length=70)设计

4.6接口设计

函数的接口是如何使用它的概要说明:它有哪些参数?这个函数做什么?它的返回值是什么?我们说一个接口“整洁”,是说它能够让调用者完成所想的的事情,而不需要处理多余的细节

在这个例子里,r属于函数的接口,因为它指定了所画的圆的基本属性。相对地,n则不那么适合,因为它说明的是如何画圆的细节信息。

所以与其弄乱接口,不如在代码内部根据周长来选择合适的n值

1 def circle(t,r):2 circum=2*math.pi*r3 n=int(circum/3)+1

4 length=circum/n5 length= circum/n6 polygon(t,n,length)

现在多边形是的边数是一个接近circum/3的整数,所以每个边长近似是3,已经小到足够画出好看的圆形,但又足够大到不影响画线效率,并且可接受任何尺寸的圆。

关于圆形练习题,书中的答案:

1 import turtle2 import math3 bob =turtle.Turtle()4

5 def polygon(t,n,length):6 angle=360/n7 for i inrange(n):8 t.fd(length)9 t.lt(angle)10

11 #version112 def circle(t,r):13 circum=2*math.pi*r14 n=50

15 length= circum/n16 polygon(t,n,length)17

18 #version219 def circle(t,r):20 circum=2*math.pi*r21 n=int(circum/3)+1

22 length=circum/n23 length= circum/n24 polygon(t,n,length)25

26 circle(bob,150)27 turtle.mainloop()

4.8一个开发计划

开发计划是一个写程序的过程。本章的案例分析中,我们使用的过程是“封装和泛化”。这个过程的具体步骤是:

1. 最开始写一些小程序,而不需要函数定义

2. 一旦程序运行成功,识别出其中一段完整的部分,将它封装到一个函数中,并加以命名。

3. 泛化这个函数,添加合适的形参。

4.重复步骤1到步骤3,直到得到一组可行的函数。复制粘贴代码,以避免重复输入(以及重复调试)

5.寻找可以使用重构来改善程序的机会。例如,如果发现程序中几处有相似的代码,可以考虑将它们抽取出来做一个合适的通用函数。

这个过程也有一些缺点——我们会在后面看到其他方式——但如果在开始编程时不清楚如何将程序分成适合的函数,这样做会带来帮助。这个方法能让你一边开发一边设计。

4.9文档字符串

文档字符串很简洁,但已经包含了其他人需要知道的关于函数的基本信息。它简明地解释了函数是做什么的(而不涉及如何实现的细节)。它解释了每个形参对函数行为的影响效果以及每个形参应有的类型(如果其类型并不显而易见)

编写这类文档是接口设计的重要部分。一个设计良好的接口,也应当很简单就能解释清楚; 如果你发现解释一个函数很困难,很可能表示该接口有改进的空间。

4.10调试

函数的接口,作用就像是函数和调用者之间签订的一个合同。调用者同意提供某些参数,而函数则同意使用这些参数做某种工作。

例如,polyline需要4个参数:t必须是一个Turtle; n必须是整数; length应当是个正数; 而则必须是一个数字,并且按照度数来理解。

这些需求被称为前置条件,因为它们应当在函数开始执行之前就保证为真。相对地,函数结束的时候需要满足的条件为后置条件。后置条件包含了函数预期的效果(如画出线段)以及任何副作用(如移动乌龟或者引起其他改变)

满足前置条件是调用者的职责。如果调用者违反了一个(文档说明清晰的!)前置条件,因而导致函数没有正确运行,则bug是在调用者,而不在函数本身。

如果前置条件都已经满足,但后置条件没有满足,那么bug就出现在函数本身。如果前置条件和后置条件都定义清晰,可以帮助调试。

像科学家一样思考python答案_像计算机科学家一样思考python-第4章 案例研究:接口设计...相关推荐

  1. 《Think Python 2e》作业实现(四): 案例研究—接口设计

    <Think Python 2e>作业实现(四): 案例研究-接口设计 文章目录 <Think Python 2e>作业实现(四): 案例研究-接口设计 这是什么? 习题4-1 ...

  2. 全国计算机等级考试python试题_全国计算机等级考试二级Python真题及解析(5)

    全国计算机等级考试二级 Python 真题及解析( 5 ) 一.选择题 1. 关于二叉树的遍历,以下选项中描述错误的是 A 二叉树的遍历可以分为三种:前序遍历.中序遍历.后序遍历 B 前序遍历是先遍历 ...

  3. 像科学家一样思考python列表_像计算机科学家一样思考python-第3章 函数

    在程序设计中,函数是指用于进行某种计算的一系列语句的有名称的组合.定义一个函数时,需要指定函数的名称并写下一系列程序语句.之后,就可以使用名称来"调用"这个函数 3.1函数调用 一 ...

  4. 智慧树大数据分析python答案_智慧树大数据分析的python基础答案

    当前位置:主页 > 娱乐 > 正文 智慧树大数据分析的python基础答案

  5. 《像计算机科学家一样思考Python》——第4章 案例研究:接口设计 4.1 乌龟世界...

    本节书摘来自异步社区<像计算机科学家一样思考Python>一书中的第4章,第4.1节,作者[美]Allen B. Downey,赵普明 译,更多章节内容可以访问云栖社区"异步社区 ...

  6. 我要翻译《Think Python》- 006 第四章 学习案例:接口设计

    本文翻自:Allen B. Downey --<Think Python> 原文链接:http://www.greenteapress.com/thinkpython/html/think ...

  7. 像计算机科学家一样思考python 百度网盘_像计算机科学家一样思考Python PDF_Python教程...

    资源名称:像计算机科学家一样思考Python PDF 第1章 程序之道 1 1.1 Python编程语言 1 1.2 什么是程序 3 1.3 什么是调试 3 1.4 语法错误 3 1.5 运行时错误 ...

  8. 什么可以搜python答案_什么软件可以搜python答案

    什么软件可以搜python答案 递归函数有什么特点? 以下可以终结一个循环的执行的语句是 函数必须使用return保留字提供返回值. 以下哪个不可能出现在and的操作真值表中 有关递归函数基例的说明, ...

  9. 读芯术python答案_你爱 “Python”的身体,还是“R”的灵魂?

    全文共2337字,预计学习时长6分钟 数据科学界有三大宝: Python.SAS和R,不过像SAS这种高端物种,不是我们这些平民能供养得起的啊. 根据 IEEE Spectrum的最新排名,R和Pyt ...

最新文章

  1. CSDN 开学见面礼!限时免费申请,手慢无!
  2. TensorFlow tfjs 0.10.3 发布
  3. 米莱狄机器人怎么那么多_王者荣耀排位遇到米莱狄太恶心?三大短板可以轻松克制!...
  4. C++自定义直方图统计
  5. seo代码优化工具_企业seo该怎么优化
  6. Python TypeError: object() takes no parameters
  7. Mariadb安装及主从搭建,基于centos7
  8. Android Sensor Framework(狠详)
  9. 慕有轶:看不清的方向,你还在盲目操作,犹如飞蛾扑火!
  10. app抓包工具_【iOS】新版本App不好用,带你找回旧版本
  11. 道长运维之正则表达式
  12. 什么是TPS, 什么是QPS
  13. python找不到文件怎么办_python中open找不到文件怎么解决
  14. Auto CAD:图纸材质图例(石材、瓷砖、细木工板、钢筋混凝土、 木材、夹板、黏土砖 镜面/玻璃、软质吸音层 、钢/金属、硬质吸音层、硬隔层、基层龙骨、陶质类、涂料粉刷层)的设置之详细攻略
  15. word表格跨页多出一根线(三线表)
  16. java邮箱地址正则表达式_JAVA 电子邮箱格式验证,使用正则表达式
  17. 大学生普通话测试软件,普通话测试app
  18. react-native调用Android原生模块
  19. 智能外呼系统助力全行业销售自动化
  20. 53、Gif 控件GifView 的使用,播放gif图片

热门文章

  1. Docker Swarm集群创建与演练
  2. linux vim 编辑器的颜色方案等自定义配置
  3. Java线程池和阻塞队列
  4. 基于Android的小区核酸检测系统--Square广场界面(仿淘宝小红书的 陈列式布局的实现)
  5. 工程师如何实现西门子PLC S7-1500的远程程序上下载?
  6. 三七是地道中药材,三七对于血液方面的疾病有很好的治疗和预防作用
  7. 各类密码如何设置才能避免黑客盗取,学习一下!
  8. react native学习篇之图片学习
  9. C# winform 将EXCEL导入datagridview
  10. 不用看透风景 也要细水长流