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 真心简单,适合零基础的人快速入门掌握,身边的人学习一两周上手开发的比比皆是: 市面上的文章或书籍对初学者并不友好,多半枯燥乏味,我相 ...
随机推荐
- 数据库连性池性能测试(hikariCP,druid,tomcat-jdbc,dbcp,c3p0)
文章转自 https://www.tuicool.com/articles/qayayiM 摘要: 本文主要是对这hikariCP,druid,tomcat-jdbc,dbcp,c3p0几种连接池的 ...
- dubbo报错Data length too large: 10710120处理,及服务提供者协议配置详细说明
工作中遇到以下报错信息 cause: java.io.IOException: Data length too large: 10710120, max payload: 8388608, chann ...
- 汇编指令:ldr和str,ldm和stm的区别
(1)LDR:L表示LOAD,LOAD的含义应该理解为:Load from memory into register.下面这条语句就说明的很清楚: LDR R1, [R2] R1<— ...
- 解决 HttpWebResponse.GetResponse()一直提示超时
原文首发: http://anforen.com/wp/2018/04/httpwebresponsegetresponse/ HttpWebResponse response = (HttpWebR ...
- LiveCharts文档-3开始-1安装
原文:LiveCharts文档-3开始-1安装 LiveCharts文档-3开始-1安装 我不会逐字逐句翻译,有些过于基本的地方语言上会所略 三个平台我只翻译WinForm,其他的WPF和UWP大部分 ...
- 【nodejs】让nodejs像后端mvc框架(asp.net mvc)一样处理请求--请求处理结果适配篇(7/8)
文章目录 前情概要 前面一大坨一大坨的代码把route.controller.action.attribute都搞完事儿了,最后剩下一部分功能就是串起来的调用. 那接下就说个说第二个中间件,也是最后一 ...
- zabbix邮件报警功能的验证
zabbix里面设置了很多监控项,有很多重要的监控预警,必须保证zabbix邮件报警功能正常,以确保那些告警信息能及时发送到运维人员的邮箱里. 所以需要每天8:30发一封确认zabbix邮件报警功能正 ...
- 索引节点(inode)爆满问题处理
关于磁盘空间中索引节点爆满的问题还是挺多的,借此跟大家分享几个情况: 情况一 在公司一台配置较低的Linux服务器(内存.硬盘比较小)的/data分区内创建文件时,系统提示磁盘空间不足,用df -h命 ...
- 【ML】Two-Stream Convolutional Networks for Action Recognition in Videos
Two-Stream Convolutional Networks for Action Recognition in Videos & Towards Good Practices for ...
- [BUAA软工]第1次阅读
[BUAA软工]第1次阅读 本次作业所属课程: 2019BUAA软件工程 本次作业要求: 第1次个人作业 我在本课程的目标 熟悉和实践软件工程流程,适应团队开发 本次作业的帮助 帮助理解<构建之 ...