Python 程序设计语言 笔记(五)

来源:互联网 发布:软件开发技术员招聘 编辑:程序博客网 时间:2024/06/05 18:15
第四周 函数
4.1 函数的定义、调用与返回

(1)函数定义 — def语句,格式如下:

def <name>(<parameters>):

【说明】函数名<name>:任何有效的Python标识符
参数列表<parameters>:调用函数时传递给函数的值
(个数 >= 0,多个参数用”,”分隔)
形式参数(形参):定义函数时给函数传递的参数
形参只在函数内部有效
实际参数(实参):调用函数时给函数传递的参数
(可以是实数,变量,函数;必须要初始化)
函数体<body>:函数被调用时执行的代码,由一至多个语句组成

函数调用的一般形式:

<name>(<parameters>)
函数返回:① return语句 — 结束函数调用并返回结果
② return语句是可选的,可以出现在函数体的任意位置
③ 若无return语句,函数结束后将控制权返回给调用方
函数接口 — 返回值和参数
函数传递信息的主要途径:① 通过函数返回值的方式传递信息
② 通过参数传递信息
例】打印《生日快乐歌》歌词
# 程序4.1.1def 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.2import mathdef square(x):    return x*xdef distance(x1,y1,x2,y2):    dist = math.sqrt(square(x1 - x2) + square(y1 - y2))    return distdef isTriangle(x1,y1,x2,y2,x3,y3):    flag = ((x1 - x2) * (y3 - y2) - (x3 - x2) * (y1 - y2)) != 0    return flagdef 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.1def fact(n):if n == 0: return 1else:return n * fact(n-1)</span></span>
【例2】字符串反转
Python列表有反转的内置方法
方法1:字符转换为字符列表,反转列表,列表转换回字符串
方法2:递归
【IPO】输入:字符串
 处理:用递归的方法反转字符串
 输出:反转后的字符串
【注意】① 构造递归函数,需要基例
② 基例不进行递归,否则递归就会无限循环执行
# 程序4.2.2def reverse(s):if s == "":return selse: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.1from turtle import Turtlep = 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.pyfrom 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()

【运行结果】


1 0
原创粉丝点击