Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 4. 函数
什么样的程序员才是优秀的程序员?咪博士认为“慵懒”的程序员才是真正优秀的程序员。听起来不合逻辑?真正优秀的程序员知道如何高效地工作,而不是用不止境的加班来完成工作任务。函数便是程序员高效工作的利器之一。
事实上,在前面的教程中,我们已经在使用函数了。例如,我们在每段代码的最后,都会调用 turtle.exitonclick() 函数。exitonclick 函数的作用就是让海龟画完图像之后保持住,不要退出,直到我们点击窗口的时候 (onclick),才退出 (exit)。我们不需要知道函数 exitonclick 具体是怎样实现的,我们只需要在合适的地方调用它,使用它提供的功能就可以了。使用函数便是程序员高效工作的秘密(之一)。
那么,我们要如何定义自己的函数呢?
Python 中,我们使用 def 关键字来定义函数。请看下面这个例子:
def line_without_moving():
turtle.forward(100)
turtle.backward(100)
跟在关键字 def 之后的是函数名 line_without_moving。后面,我们就可以用 line_without_moving 这个函数名来调用它了。函数名之后,需要有一个冒号,告诉 python 接下来就是函数的具体内容(称为函数体)。
函数的功能就是通过函数体中的语句来实现的。注意到,函数体中的语句 (第2, 3 行) 和 def 所在的行 (第 1 行) 相比,要往右缩进了一些。Python 正是通过缩进来判断哪些语句是属于函数体中的语句(类似前面教程中谈到的,Python 用缩进来判断哪些语句属于循环体)。通常,我们用 4 个空格符来表示一级的缩进。
好了,让我们仔细看看 line_without_moving 的函数体(第 2, 3 行),看看这个函数实现的是什么功能? turtle.forward(100) 前进 100 个单位距离, turtle.backward(100) 后退 100 个单位的距离,这一进一退,小海龟又回到了原来的位置,这不等于啥也没干吗?No No No!海龟虽然又回到的原来的位置,但它在爬行过程中,会在屏幕上留下痕迹,即画出线条。因此,line_without_moving 这个函数的作用就是让海龟沿着当前方向绘制一条长度为 100 个单位的线条,然后还要回到起始的位置,同时保持龟头的方向不变。
上面的代码,仅仅是定义了函数 line_without_moving。光定义函数是看不到直接的效果的,函数需要被使用(即被调用),函数体中的代码才能被执行,我们才能看到效果。例如,下面的代码,我们在 line_without_moving 函数定义之后,调用了它(第 7, 9, 11, 13 行)。调用方式为函数名之后,跟一个小括号。这样,我们就能看到函数调用之后的效果了。
import turtle def line_without_moving():
turtle.forward(100)
turtle.backward(100) line_without_moving()
turtle.right(90)
line_without_moving()
turtle.right(90)
line_without_moving()
turtle.right(90)
line_without_moving() turtle.exitonclick()
运行上面的代码,我们可以看到一个十字型的图案。

类似循环可以嵌套一样,函数也可以嵌套。上面画十字型的代码,还可以改写成下面的形式。
import turtle def line_without_moving():
turtle.forward(100)
turtle.backward(100) def draw_cross():
line_without_moving()
turtle.right(90)
line_without_moving()
turtle.right(90)
line_without_moving()
turtle.right(90)
line_without_moving() draw_cross() turtle.exitonclick()
第 7-14 行,定义了一个新的函数 draw_cross。第 16 行,调用 draw_cross 函数画十字,而 draw_cross 函数内部又调用了 line_without_moving 函数(第 8, 10, 12, 14 行),即函数嵌套函数。
进一步观察,我们发现 8-14 行的代码有许多是重复的。第 8, 9 行的代码,重复了 4 次。结合前面咪博士讲的循环,聪明的你是不是已经想到了如何进一步简化代码了呢?下面是咪博士给出的参考代码,是不是和你想的一样呢?
import turtle def line_without_moving():
turtle.forward(100)
turtle.backward(100) def draw_cross():
for i in range(4):
line_without_moving()
turtle.right(90) draw_cross() turtle.exitonclick()
【练习】

尝试编写函数绘制出蜂窝的图案
【提示】

- 蜂窝是由一系列的正六边形构成的,先编写一个绘制正六边的函数,再通过多次函数调用的方式绘制出多个正六边形
- 设计正六边形函数的时候,要让海龟在画完正六边形之后,再次回到起始的位置,并保持龟头方向不变,这样方便我们拼接多个正六边形构成蜂窝的图案
- 在考虑如何用多个正六边形构成蜂窝时,请忽略绘制正六边形的细节(请忘记龟头转了几度,海龟前进了多少距离等细节 ),只需要知道海龟在绘制单个正六边形时的旋转方向(顺时针还是逆时针),并且海龟在绘制正六边形之后,会回到起始的位置,并保持龟头方向不变
- 在函数调用时忽略函数内部的细节,这事实上就是一种抽象的思维,函数不仅是程序员“偷懒”的工具,更是程序员通过抽象思维,实现复杂逻辑的利器
原文链接:http://www.ipaomi.com/2017/11/20/python-零基础-快速入门-趣味教程-咪博士-海龟绘图-turtle-4-函/
Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 4. 函数的更多相关文章
- Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 7. 条件循环
条件循环能够让程序在条件成立时(即为真时)重复执行循环体中的语句.如果条件一直成立(即永远不会为假),则循环会一直进行下去,不会停止.如果初始时,条件不成立,则循环 1 次也不会执行.Python 中 ...
- Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 6. 条件
前面的教程中,我们已经可以让小海龟绘制出各种图形了.但是,所有绘图的代码都是预先编好的,程序一旦运行起来,运行结果(绘制的图形)就是固定不变的.这一节中,咪博士将教大家如何让海龟响应用户的输入. im ...
- Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 3. 循环
在前面的教程中,咪博士留了一道练习题给大家—-画正方形,相信聪明的你应该已经画出来了. 下面是咪博士实现的代码. 是不是跟你的代码很像呢? import turtle turtle.forward(2 ...
- Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 2. 变量
大家在中学就已经学过变量的概念了.例如:我们令 x = 100,则可以推出 x*2 = 200 试试下面这段 Python 代码 import turtle turtle.shape("tu ...
- Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 1. 神秘朋友
Python (Windows 下) 自带了一个非常有趣的 海龟绘图程序 (turtle),它是本系列课程的主角. 在 PyCharm 中,新建一个项目,然后在代码编辑器中输入 import turt ...
- Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 0. 准备工作
一.关于 Python Python 是全球使用人数增长最快的编程语言!它易于入门.功能强大,从 Web 后端 到 数据分析.人工智能,到处都能看到 Python 的身影. Python 有两个主要的 ...
- Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 5. 参数
上一个教程中,咪博士带大家学习了函数的使用.例如,line_without_moving 函数,可以让海龟先画出一条线段,然后再回来起点. def line_without_moving(): tur ...
- Python 零基础快速入门!
“人生苦短,我学python”是编程届的名言.用python写小脚本的便捷性,让很多其他语言的学习者把python当作辅助语言.拥有了某一个语言的功底,再来学习另外一种语言应该是十分快速的.编程理念都 ...
- 序言 - PHP零基础快速入门
我为什么要写<PHP零基础快速入门>? 原因: PHP 真心简单,适合零基础的人快速入门掌握,身边的人学习一两周上手开发的比比皆是: 市面上的文章或书籍对初学者并不友好,多半枯燥乏味,我相 ...
随机推荐
- fatal error LNK1169: 找到一个或多个多重定义的符号或多个.c/.cpp文件想同时调用定义在.h文件里面的全局变量,防止重定义变量问题。
为什么.h文件中不能定义全局变量? 原因: 存在多次创建变量.如果头文件中可以定义全局变量,那么每个包含该头文件的文件里都会有该全局变量的定义.因为C语言的include是直接将文件嵌入到includ ...
- esp-adf Element PipeLine
audio_element: 开发基于ADF的程序软件最基本的模块就是audio_element对象.所有的编码.解码.过滤.输入流.输出流实际上都是audio_element.(这个是官方的文件我翻 ...
- Android 解决布局无法对齐的情况
是这样的,在为app制作titlebar或者使用RadioGroup设置布局的的weight属性后,会出现有些机型的手机布局无法居中的问题. 在遇到这类问题时,大部分的原因就是因为没有设置控件的属性: ...
- [06] 利用mybatis-generator自动生成代码
1.mybatis-generator 概述 MyBatis官方提供了逆向工程 mybatis-generator,可以针对数据库表自动生成MyBatis执行所需要的代码(如Mapper.java.M ...
- 《MySQL必知必会》[05] 存储过程和游标
1.存储过程 存储过程是什么,简单来讲,就像Java中的方法(函数),不过它是SQL世界中的方法. 大部分时候,我们所使用都是单条SQL,用来针对一个或多表连接.但是也有情况,是据判断先对表A执行操作 ...
- token令牌
本文摘自 WebApi安全性 使用TOKEN+签名验证 首先问大家一个问题,你在写开放的API接口时是如何保证数据的安全性的?先来看看有哪些安全性问题在开放的api接口中,我们通过http Post或 ...
- Linux安装RabbitMq-Centos7版本
一.Linux系统中安装RabbitMQ 由于RabbitMQ依赖于Erlang,所以先要在机器上安装Erlang环境 单机版 1.安装GCC GCC-C++ Openssl等模块 yum -y in ...
- svg画弧
http://www.pindari.com/svg-arc.html https://jsfiddle.net/8robssa0/ http://jsbin.com/giyotacuxu/edit? ...
- WPF中的Bitmap与byte
原文:WPF中的Bitmap与byte public MainWindow() { InitializeComponent(); byte[] b = GetPictureData(@"F: ...
- BootStrap学习(5)_多媒体对象&列表组
一.多媒体对象 这些抽象的对象样式用于创建各种类型的组件(比如:博客评论),我们可以在组件中使用图文混排,图像可以左对齐或者右对齐.媒体对象可以用更少的代码来实现媒体对象与文字的混排. .media: ...