什么样的程序员才是优秀的程序员?咪博士认为“慵懒”的程序员才是真正优秀的程序员。听起来不合逻辑?真正优秀的程序员知道如何高效地工作,而不是用不止境的加班来完成工作任务。函数便是程序员高效工作的利器之一。

事实上,在前面的教程中,我们已经在使用函数了。例如,我们在每段代码的最后,都会调用 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. 函数的更多相关文章

  1. Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 7. 条件循环

    条件循环能够让程序在条件成立时(即为真时)重复执行循环体中的语句.如果条件一直成立(即永远不会为假),则循环会一直进行下去,不会停止.如果初始时,条件不成立,则循环 1 次也不会执行.Python 中 ...

  2. Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 6. 条件

    前面的教程中,我们已经可以让小海龟绘制出各种图形了.但是,所有绘图的代码都是预先编好的,程序一旦运行起来,运行结果(绘制的图形)就是固定不变的.这一节中,咪博士将教大家如何让海龟响应用户的输入. im ...

  3. Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 3. 循环

    在前面的教程中,咪博士留了一道练习题给大家—-画正方形,相信聪明的你应该已经画出来了. 下面是咪博士实现的代码. 是不是跟你的代码很像呢? import turtle turtle.forward(2 ...

  4. Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 2. 变量

    大家在中学就已经学过变量的概念了.例如:我们令 x = 100,则可以推出 x*2 = 200 试试下面这段 Python 代码 import turtle turtle.shape("tu ...

  5. Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 1. 神秘朋友

    Python (Windows 下) 自带了一个非常有趣的 海龟绘图程序 (turtle),它是本系列课程的主角. 在 PyCharm 中,新建一个项目,然后在代码编辑器中输入 import turt ...

  6. Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 0. 准备工作

    一.关于 Python Python 是全球使用人数增长最快的编程语言!它易于入门.功能强大,从 Web 后端 到 数据分析.人工智能,到处都能看到 Python 的身影. Python 有两个主要的 ...

  7. Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 5. 参数

    上一个教程中,咪博士带大家学习了函数的使用.例如,line_without_moving 函数,可以让海龟先画出一条线段,然后再回来起点. def line_without_moving(): tur ...

  8. Python 零基础快速入门!

    “人生苦短,我学python”是编程届的名言.用python写小脚本的便捷性,让很多其他语言的学习者把python当作辅助语言.拥有了某一个语言的功底,再来学习另外一种语言应该是十分快速的.编程理念都 ...

  9. 序言 - PHP零基础快速入门

    我为什么要写<PHP零基础快速入门>? 原因: PHP 真心简单,适合零基础的人快速入门掌握,身边的人学习一两周上手开发的比比皆是: 市面上的文章或书籍对初学者并不友好,多半枯燥乏味,我相 ...

随机推荐

  1. leetcode 104. Maximum Depth of Binary Tree 111. Minimum Depth of Binary Tree

    104: class Solution { public: int maxDepth(TreeNode* root) { if(root == NULL) ; int left = maxDepth( ...

  2. docker被入侵后.............

    服务器上线后,怎么发现总有个 xmrig 的容器在跑,删了还出来 那么恭喜你!!你的服务器已经被入侵了!! $ docker ps IMAGE               COMMAND       ...

  3. C语言的基本数据类型

     代码如下: // text.cpp: 定义控制台应用程序的入口点. // #include "stdafx.h" int main() { int a; //告诉编译器,分配 4 ...

  4. 【LeetCode232】 Implement Queue using Stacks★

    1.题目描述 2.思路 思路简单,这里用一个图来举例说明: 3.java代码 public class MyQueue { Stack<Integer> stack1=new Stack& ...

  5. Luogu4338 ZJOI2018 历史 LCT、贪心

    传送门 题意:在$N$个点的$LCT$中,最开始每条边的虚实不定,给出每一个点的$access$次数,求一种$access$方案使得每条边的虚实变换次数之和最大,需要支持动态增加某个点的$access ...

  6. C# webApi上传图片 代码篇

    十年河东,十年河西,莫欺少年穷 学无止境,精益求精 代码篇,不多说 如下: using System; using System.Collections.Generic; using System.D ...

  7. C# 如何物理删除有主外键约束的记录?存储过程实现

    十年河东,十年河西,莫欺少年穷 本篇主旨是如何物理删除有主外键约束的记录!那么,我们从主外键走起! 下面新建三张有主外键约束的表,分别为:系/学院表,专业班表,学生表,如下: CREATE TABLE ...

  8. [转][南京米联ZYNQ深入浅出]第二季更新完毕课程共计16节课

    [南京米联]ZYNQ第二季更新完毕课程共计16节课 [第二季ZYNQ]                                                                  ...

  9. VitualBox安装linux记录

    下载镜像 CentOS 7镜像下载 阿里云站点:http://mirrors.aliyun.com/centos/7/isos/x86_64/ VirtualBox安装linux https://ww ...

  10. 手机H5移动端WEB资源整合之meta标签

    一.相关网站使用meta的实例 youku首页的Meta设置: <meta charset="utf-8"> <meta http-equiv="X-U ...