前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【python入门系列课程 第十课 初识函数】

【python入门系列课程 第十课 初识函数】

作者头像
叶子陪你玩
发布2020-03-12 15:19:49
5520
发布2020-03-12 15:19:49
举报
前言

本系列课程是针对无基础的,争取用简单明了的语言来讲解,学习前需要具备基本的电脑操作能力,准备一个已安装python环境的电脑。如果觉得好可以分享转发,有问题的地方也欢迎指出,在此先行谢过。

什么是函数

在正式解释什么是函数之前,来看Blocky迷宫游戏中的关卡。

关卡-1:

小人要走到红色的目标位置,目前有两个指令可以使用,前进:moveForward();左转:turnLeft()。

分析:

根据小人要走的路线观察,小人要达到目标,需要有前进指令,左转指令和右转指令;但是实际上只有两个指令,没有右转指令那要怎么解决呢?

我们知道一圈是360度的,往左转270和往右转90是同样的效果。所以三个往左指令就相当于一个往右指令。

代码语言:javascript
复制
#往右
turnLeft()
turnLeft()
turnLeft()

用语言描述:

代码语言:javascript
复制
1.前进
2.左转
3.前进
4.右转
5.前进

用代码表示:

代码语言:javascript
复制
moveForward()# 1.前进
turnLeft() # 2.左转
moveForward()# 3.前进
turnLeft() # 4.右转
turnLeft()
turnLeft()
moveForward()# 5.前进

关卡-2:

接着再来看下面这个关卡:

方法是同样的,只不过次数更多了。

用语言描述:

代码语言:javascript
复制
1.前进
2.左转
3.前进
4.右转
1.前进
2.左转
3.前进
4.右转
1.前进
2.左转
3.前进
4.右转
1.前进
2.左转
3.前进
4.右转

用代码描述:

代码语言:javascript
复制
moveForward()# 1.前进
turnLeft() # 2.左转
moveForward()# 3.前进
turnLeft() # 4.右转
turnLeft()
turnLeft()
moveForward()# 1.前进
turnLeft() # 2.左转
moveForward()# 3.前进
turnLeft() # 4.右转
turnLeft()
turnLeft()
moveForward()# 1.前进
turnLeft() # 2.左转
moveForward()# 3.前进
turnLeft() # 4.右转
turnLeft()
turnLeft()
moveForward()# 1.前进
turnLeft() # 2.左转
moveForward()# 3.前进
turnLeft() # 4.右转
turnLeft()
turnLeft()

代码改造-1:

上面代码逻辑很容易理解,但是看上去有些代码很多余,现在我们先自己造一个turnRight()命令来改造一下:

代码语言:javascript
复制
# 通过下面这个方法 就创建了一个turnRight()命令
def turnRight():
    turnLeft()
    turnLeft()
    turnLeft()

moveForward()# 1.前进
turnLeft() # 2.左转
moveForward()# 3.前进
turnRight() # 4.右转
moveForward()# 1.前进
turnLeft() # 2.左转
moveForward()# 3.前进
turnRight() # 4.右转
moveForward()# 1.前进
turnLeft() # 2.左转
moveForward()# 3.前进
turnRight() # 4.右转
moveForward()# 1.前进
turnLeft() # 2.左转
moveForward()# 3.前进
turnRight() # 4.右转

代码改造-2:

上面的代码我们可以看到其实还是有很多代码都一样的,再来改造一下,将每一个直角(一共4个直角)再变成一个方法,取名叫做solve_a_corner()。

代码语言:javascript
复制
# 通过下面这个方法 就创建了一个turnRight()命令
def turnRight():
    turnLeft()
    turnLeft()
    turnLeft()
# 创建解决一个直角的命令
def solve_a_corner():    
    moveForward()# 1.前进
    turnLeft() # 2.左转
    moveForward()# 3.前进
    turnRight() # 4.右转
solve_a_corner()
solve_a_corner()
solve_a_corner()
solve_a_corner()

可能有些人会说最后还可以用循环再改造一下,如果多的话的确可以,这里因为不是重点就不讨论了。函数其实并没有用到新的编程知识,只是一种管理组织代码的一种方式。函数是为了让我们更好的重复使用已经写好的功能代码,函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。

你已经知道Python提供了许多内建函数,比如print()。你也可以自己创建函数,这被叫做用户自定义函数。

上面因为有多处需要用到右转,所以通过自己写的一个turnRight()方法代替三个turnLeft(),之后只需要使用turnRight就可以了。下面的代码其实就定义了一个名字叫做turnRight的函数,使用的时候只需要用名字加上括号就可以了--turnRight()。

代码语言:javascript
复制
# 通过下面这个方法 就创建了一个turnRight()命令
def turnRight():
    turnLeft()
    turnLeft()
    turnLeft()

后面的solve_a_corner()也是自定义的一个函数。

代码语言:javascript
复制
# 创建解决一个直角的命令
def solve_a_corner():    
    moveForward()# 1.前进
    turnLeft() # 2.左转
    moveForward()# 3.前进
    turnRight() # 4.右转

为什么要使用函数?

通过上面的案例,相信你应该可以知道一些,为什么要学习函数了,总结一下,具体的原因包括以下几点:

1.创建一个新的函数可以让你给一组语句命名,这可以让你的程序更容易阅读和调试。

2.通过消除重复的代码,函数精简了程序。以后,如果你要做个变动,你只需在一处修改即可。

3.将一个长程序分解为多个函数,可以让你一次调试一部分,然后再将它们组合为一个可行的整体。

4.设计良好的函数经常对多个程序都有帮助。一旦你写出并调试好一个函数,你就可以重复使用它。

函数怎么用?

定义函数

在使用函数前需要先定义出一个函数。函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 (),函数里面的内容需要有缩进,一般格式如下:

代码语言:javascript
复制
def function_name(arg1,arg2,...,argN):
    函数代码块

例-1:定义一个可以打印hello的函数。

代码语言:javascript
复制
def say_hello():
    print("hello")

调用函数

函数如果只是定义好了,没有调用是没有效果的,调用函数时只需要函数名加上括号就可以了。

代码语言:javascript
复制
def say_hello():
    print("hello")
# 调用函数
say_hello()

函数参数

前面定义函数的一般格式中括号里是不是还有一些arg1,arg2内容,这些在函数中叫做参数,参数具体可以分为形参和实参。

例-2:定义一个可以打印任意hello次数的函数。

代码语言:javascript
复制
def say_hello(n):
    for i in range(n):
        print("hello")
# 调用函数
say_hello(5)

解释:

括号里面的n就叫做形参,5就叫做实参;如果把实参改成100,那么就可以打印100次了,这样灵活性就更高了。通俗一点来说,这里的实参其实就是一个变量,占位置的;当要调用时,实参也就是实际传入的数字就会替代形参了。

例-3:定义一个可以自定义内容和次数的函数。

代码语言:javascript
复制
def say_hello(n,content):
    for i in range(n):
        print(content)
# 调用函数
say_hello(5,"大家好,我是叶子,我爱学编程")

这样函数的通用性就更高了,函数的威力远不止于这些,随着课程深入,你会了解的越来越多,到目前位置这个就已经够用了。

任务:绘制3排正方形,每排3个

要求:数量,颜色可变。

最后来完成一个任务,对前面学习过的内容做个综合应用。

思路分析:

1.先绘制一个大小100,颜色黑色固定的正方形。

2.利用函数的方式改写,传入正方形颜色的参数。

3.绘制一排3个正方形。

4.改成可以绘制一排任意数量的正方形。

5.绘制3排,每排任意数量的正方形。

6.绘制任意排,任意列数量的正方形。

代码实现:

1.绘制100,颜色黑色正方形

代码语言:javascript
复制
import turtle
pen = turtle.Pen()
for i in range(4):
    pen.forward(100)
    pen.left(90)
turtle.done()

2.定义一个可以自定义颜色的函数

代码语言:javascript
复制
import turtle
pen = turtle.Pen()
# 定义一个颜色自选的函数
def draw_square(color):
    pen.pencolor(color)
    for i in range(4):
        pen.forward(50)
        pen.left(90)
#调用函数
draw_square("red")
turtle.done()

3.绘制一排3个正方形

代码语言:javascript
复制
import turtle

pen = turtle.Pen()
# 定义一个颜色自选的函数
def draw_square(color):
    pen.pencolor(color)
    for i in range(4):
        pen.forward(50)
        pen.left(90)
#调用函数
draw_square("red")
pen.forward(60)
draw_square("red")
pen.forward(60)
draw_square("red")
pen.forward(60)
turtle.done()

4.改成可以绘制一排任意数量的正方形

代码语言:javascript
复制
import turtle
pen = turtle.Pen()
# 定义一个颜色自选的函数
def draw_square(color):
    pen.pencolor(color)
    for i in range(4):
        pen.forward(50)
        pen.left(90)
def draw_line_square(n,color):
    for i in range(n):
        draw_square(color)
        pen.forward(60)
draw_line_square(4, "green")
turtle.done()

5.绘制3排,每排任意数量的正方形

代码语言:javascript
复制
import turtle
pen = turtle.Pen()
# 定义一个颜色自选的函数
def draw_square(color):
    pen.pencolor(color)
    for i in range(4):
        pen.forward(50)
        pen.left(90)
def draw_line_square(n,color):
    for i in range(n):
        draw_square(color)
        pen.forward(60)
draw_line_square(4, "green")
pen.goto(0,-60)
draw_line_square(4, "green")
pen.goto(0, -120)
draw_line_square(4, "green")
pen.goto(0, -180)
turtle.done()

6.绘制任意排,任意列数量的正方形

前面绘制完发现有移动的痕迹留下,在绘制正方形的函数中,加上了抬笔和落笔的方法解决了。

代码语言:javascript
复制
import turtle
pen = turtle.Pen()
# 定义一个颜色自选的函数
def draw_square(color):
    pen.pencolor(color)
    pen.pendown()# 落笔
    for i in range(4):
        pen.forward(50)
        pen.left(90)
    pen.penup() # 抬笔
def draw_line_square(n, color):
    for i in range(n):
        draw_square(color)
        pen.forward(60)
def draw_any_square(n,m,color):
    for i in range(m):
        draw_line_square(n, color)
        # 绘制完一行,y坐标需要-60,i是从0开始的,需要+1
        pen.goto(0, -60*(i+1))
draw_any_square(5, 3, "red")
turtle.done()
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 叶子陪你玩编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是函数
  • 关卡-1:
    • 用语言描述:
      • 用代码表示:
      • 关卡-2:
        • 用语言描述:
          • 用代码描述:
            • 代码改造-1:
              • 代码改造-2:
              • 为什么要使用函数?
              • 函数怎么用?
                • 定义函数
                  • 调用函数
                    • 函数参数
                    • 任务:绘制3排正方形,每排3个
                      • 思路分析:
                        • 代码实现:
                          • 1.绘制100,颜色黑色正方形
                            • 2.定义一个可以自定义颜色的函数
                              • 3.绘制一排3个正方形
                                • 4.改成可以绘制一排任意数量的正方形
                                  • 5.绘制3排,每排任意数量的正方形
                                    • 6.绘制任意排,任意列数量的正方形
                                    领券
                                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档