本系列课程是针对无基础的,争取用简单明了的语言来讲解,学习前需要具备基本的电脑操作能力,准备一个已安装python环境的电脑。如果觉得好可以分享转发,有问题的地方也欢迎指出,在此先行谢过。
在正式解释什么是函数之前,来看Blocky迷宫游戏中的关卡。
小人要走到红色的目标位置,目前有两个指令可以使用,前进:moveForward();左转:turnLeft()。
分析:
根据小人要走的路线观察,小人要达到目标,需要有前进指令,左转指令和右转指令;但是实际上只有两个指令,没有右转指令那要怎么解决呢?
我们知道一圈是360度的,往左转270和往右转90是同样的效果。所以三个往左指令就相当于一个往右指令。
#往右
turnLeft()
turnLeft()
turnLeft()
1.前进
2.左转
3.前进
4.右转
5.前进
moveForward()# 1.前进
turnLeft() # 2.左转
moveForward()# 3.前进
turnLeft() # 4.右转
turnLeft()
turnLeft()
moveForward()# 5.前进
接着再来看下面这个关卡:
方法是同样的,只不过次数更多了。
1.前进
2.左转
3.前进
4.右转
1.前进
2.左转
3.前进
4.右转
1.前进
2.左转
3.前进
4.右转
1.前进
2.左转
3.前进
4.右转
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()
上面代码逻辑很容易理解,但是看上去有些代码很多余,现在我们先自己造一个turnRight()命令来改造一下:
# 通过下面这个方法 就创建了一个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.右转
上面的代码我们可以看到其实还是有很多代码都一样的,再来改造一下,将每一个直角(一共4个直角)再变成一个方法,取名叫做solve_a_corner()。
# 通过下面这个方法 就创建了一个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()。
# 通过下面这个方法 就创建了一个turnRight()命令
def turnRight():
turnLeft()
turnLeft()
turnLeft()
后面的solve_a_corner()也是自定义的一个函数。
# 创建解决一个直角的命令
def solve_a_corner():
moveForward()# 1.前进
turnLeft() # 2.左转
moveForward()# 3.前进
turnRight() # 4.右转
通过上面的案例,相信你应该可以知道一些,为什么要学习函数了,总结一下,具体的原因包括以下几点:
1.创建一个新的函数可以让你给一组语句命名,这可以让你的程序更容易阅读和调试。
2.通过消除重复的代码,函数精简了程序。以后,如果你要做个变动,你只需在一处修改即可。
3.将一个长程序分解为多个函数,可以让你一次调试一部分,然后再将它们组合为一个可行的整体。
4.设计良好的函数经常对多个程序都有帮助。一旦你写出并调试好一个函数,你就可以重复使用它。
在使用函数前需要先定义出一个函数。函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 (),函数里面的内容需要有缩进,一般格式如下:
def function_name(arg1,arg2,...,argN):
函数代码块
例-1:定义一个可以打印hello的函数。
def say_hello():
print("hello")
函数如果只是定义好了,没有调用是没有效果的,调用函数时只需要函数名加上括号就可以了。
def say_hello():
print("hello")
# 调用函数
say_hello()
前面定义函数的一般格式中括号里是不是还有一些arg1,arg2内容,这些在函数中叫做参数,参数具体可以分为形参和实参。
例-2:定义一个可以打印任意hello次数的函数。
def say_hello(n):
for i in range(n):
print("hello")
# 调用函数
say_hello(5)
解释:
括号里面的n就叫做形参,5就叫做实参;如果把实参改成100,那么就可以打印100次了,这样灵活性就更高了。通俗一点来说,这里的实参其实就是一个变量,占位置的;当要调用时,实参也就是实际传入的数字就会替代形参了。
例-3:定义一个可以自定义内容和次数的函数。
def say_hello(n,content):
for i in range(n):
print(content)
# 调用函数
say_hello(5,"大家好,我是叶子,我爱学编程")
这样函数的通用性就更高了,函数的威力远不止于这些,随着课程深入,你会了解的越来越多,到目前位置这个就已经够用了。
要求:数量,颜色可变。
最后来完成一个任务,对前面学习过的内容做个综合应用。
1.先绘制一个大小100,颜色黑色固定的正方形。
2.利用函数的方式改写,传入正方形颜色的参数。
3.绘制一排3个正方形。
4.改成可以绘制一排任意数量的正方形。
5.绘制3排,每排任意数量的正方形。
6.绘制任意排,任意列数量的正方形。
import turtle
pen = turtle.Pen()
for i in range(4):
pen.forward(100)
pen.left(90)
turtle.done()
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()
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()
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()
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()
前面绘制完发现有移动的痕迹留下,在绘制正方形的函数中,加上了抬笔和落笔的方法解决了。
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()