原文地址:https://blog.csdn.net/longteng007/article/details/51018566
第四周 函数
4.1 函数的定义、调用与返回
(1)函数定义 — def语句,格式如下:
def <name>(<parameters>):
【说明】函数名<name>:任何有效的Python标识符参数列表<parameters>:调用函数时传递给函数的值
(个数 >= 0,多个参数用”,”分隔)
形式参数(形参):定义函数时给函数传递的参数
形参只在函数内部有效
实际参数(实参):调用函数时给函数传递的参数
(可以是实数,变量,函数;必须要初始化)
函数体<body>:函数被调用时执行的代码,由一至多个语句组成
函数调用的一般形式:
<name>(<parameters>)
函数返回:① return语句 — 结束函数调用并返回结果
② return语句是可选的,可以出现在函数体的任意位置
③ 若无return语句,函数结束后将控制权返回给调用方
函数接口 — 返回值和参数
函数传递信息的主要途径:① 通过函数返回值的方式传递信息
② 通过参数传递信息
【 例】打印《生日快乐歌》歌词
-
# 程序4.1.1
-
def happy():
-
print(
"Happy birthday to you!")
-
def sing(person):
-
happy()
-
happy()
-
print(
"Happy birthday to", person +
"!")
-
def main():
-
sing(
"Mike")
-
print()
-
main()
【运行结果】
Happy birthday to you!
Happy birthday to you!
Happy birthday to Mike!
(2)函数的调用和返回值
① 调用过程:
② 函数的返回值: 函数的返回值可以是变量或表达式
三种形式 — 无返回值,单值和多值(用逗号分隔)
无返回值 等价于 return None
(None是表示没有任何东西的特殊类型)
【例】设计两点距离函数,求三角形周长
-
# 程序4.1.2
-
import math
-
def square(x):
-
return x*x
-
def distance(x1,y1,x2,y2):
-
dist = math.sqrt(square(x1 - x2) + square(y1 - y2))
-
return dist
-
def isTriangle(x1,y1,x2,y2,x3,y3):
-
flag = ((x1 - x2) * (y3 - y2) - (x3 - x2) * (y1 - y2)) !=
0
-
return flag
-
def main():
-
print(
"Please enter (x,y) of three points in turn:")
-
# 获取用户输入的三个坐标点
-
x1, y1 = eval(input(
"Point1: (x, y) = "))
-
x2, y2 = eval(input(
"Point2: (x, y) = "))
-
x3, y3 = eval(input(
"Point3: (x, y) = "))
-
# 判断三个点是否构成三角形
-
if (isTriangle(x1,y1,x2,y2,x3,y3)):
-
# 算三角形周长
-
perim = distance(x1,y1,x2,y2) + distance(x2,y2,x3,y3) + distance(x1,y1,x3,y3)
-
print(
"The perimeter of the triangle is : {0:0.2f}".format(perim))
-
else:
-
print(
"Kidding me? This is not a triangle!")
-
main()
【运行结果】
Please enter (x,y) of three points in turn:
Point1: (x, y) = 1,3
Point2: (x, y) = 2,2
Point3: (x, y) = 3,4
The perimeter of the triangle is : 5.89
(3)改变参数值的函数:
① 函数的形参只接受了实参的值,给形参赋值并不影响实参
② Python的参数是通过值来传递的(赋值)
③ 如果变量时可变对象(如列表) 返回到调用程序后,该对象会呈现被修改后的状态
4.2 函数与程序结构/递归
(1)函数和程序结构:① 函数可以简化程序,使程序模块化
② 函数可将较长程序分割成短小程序段,提高可读性
(2)递归函数:① 递归 — 函数定义中使用函数自身的方法。例:阶乘
② 递归的定义特征: 1. 有一或多个基例是不需要再次递归的
2. 所有的递归链都要以一个基例结尾
③ 注意: 1. 递归每次调用都会引起新函数的开始
2. 递归有本地值的副本,包括该值的参数
3. 阶乘递归函数中:每次函数调用中的相关n值
在中途的递归链暂时存储,并在函数返回时使用
【例1】计算5!
-
# 程序4.2.1
-
def fact(n):
-
if n ==
0:
-
return
1
-
else:
-
return n * fact(n
-1)</span></span>
【例2】字符串反转
Python列表有反转的内置方法
方法1:字符转换为字符列表,反转列表,列表转换回字符串
方法2:递归
【IPO】输入:字符串
处理:用递归的方法反转字符串
输出:反转后的字符串
【注意】① 构造递归函数,需要基例
② 基例不进行递归,否则递归就会无限循环执行
-
# 程序4.2.2
-
def reverse(s):
-
if s ==
"":
-
return s
-
else:
-
return reverse(s[
1:]) + s[
0]</span>
4.3 函数实例分析
【例】绘制如下图的“二叉树”
【思路】(1)首先学习简单图形绘制的指令
(2)其次为树的绘制设计算法
(1)Turtle库:
-
turtle.forward(
15)
# 乌龟沿直线前行15个单位长度
-
(默认绘制方向为x轴正半轴)
-
turtle.left(
90)
# 乌龟角度逆时针旋转90度(顺时针为right)
-
turtle.penup()
# 乌龟提笔(落笔为pendown)
-
turtle.goto(x,y)
# 乌龟到达指定坐标位置
-
turtle.home()
# 乌龟返回初始坐标
-
turtle.circle(r)
# 乌龟以r为半径画圆
-
turtle.speed(x)
# 设置乌龟速度
-
turtle.pensize(x)
# 设置画笔粗细
-
turtle.pencolor(str1,str2)
# 设置画笔线条颜色和填充色
-
turtle.begin_fill()
# 开始填充颜色(完成填充用end_fill)
【例】绘制并填充五角星
-
# 程序4.3.1
-
from turtle
import Turtle
-
p = Turtle()
-
p.speed(
3)
-
p.pensize(
5)
-
p.color(
"black",
"yellow")
-
p.begin_fill()
-
for i
in range(
5):
-
p.forward(
200)
-
p.right(
144)
-
p.end_fill()
(2)代码如下:
-
# 程序4.3.2
-
# drawtree.py
-
from turtle
import Turtle, mainloop
-
-
def tree(plist, l, a, f):
-
if l >
5:
-
lst = []
-
for p
in plist:
-
p.forward(l)
# 沿着当前的方向画画
-
q = p.clone()
-
p.left(a)
-
q.right(a)
-
lst.append(p)
# 将元素增加到列表的最后
-
lst.append(q)
-
tree(lst, l*f, a, f)
-
def main():
-
p = Turtle()
-
p.color(
"green")
-
p.pensize(
5)
-
p.hideturtle()
-
p.speed(
100)
-
p.left(
90)
# 调整画笔
-
p.penup()
-
p.goto(
0,
-200)
-
p.pendown()
# 这三条语句是一个组合相当于先把笔收起来
-
# 再移动到指定位置,再把笔放下开始画
-
# 否则turtle一移动就会自动的把线画出来
-
t = tree([p],
200,
65,
0.6375)
-
main()
【运行结果】