python语言编程函数_Python语言程序设计(第5章:函数设计初步)

5.1 函数的起源和特点

【1】函数是可以实现某个特定功能的小程序块(block)

【2】函数可以实现代码复用,提高编程效率。

【3】使用函数可以简化程序结构。复杂的编程问题可以分解成若干简单的子问题,每个子问题用函数来解决。函数像积木块一样通过灵活组合构建复杂程序。这种简化问题的方法体现了“自顶向下、模块化编程”的程序设计思想。

【4】使用函数可以使程序更容易阅读。函数使程序结构层次分明,好的函数名可以直接体现程序的功能,易于阅读和理解。

【5】使用函数还可以让程序更容易调试和测试。

5.2 函数的定义

【1】函数用关键字def(def是英文define的缩写)定义

【2】函数名通常体现函数功能,必须符合变量命名的规则

【3】函数名后面圆括号中的参数1、参数2等称为“形式参数”,简称为形参。它的作用是实现调用程序与被调用函数之间的联系。通常把函数要处理的数据、影响函数功能的参数或者函数的运行结果作为形参。形参的个数可以是零个、一个或多个,当参数个数为零时,圆括号也要保留。

【4】def语句以冒号结尾,表示后面的函数体与def语句之间有缩进关系(通常是4个空格)。

【5】函数体是函数每次被调用时执行的代码。

【6】return语句是可选项,它可以在函数体内任何地方出现,表示函数执行到此结束,控制权返回给调用程序,同时返回处理结果。

【7】在调用函数时,必须给函数传递具体的参数值,此时参数称为“实际参数”,简称实参。实参可以是常量、变量、表达式、函数等,无论何种类型,在进行函数调用时都必须具有确定的值,才能让函数运行。

【8】lambda函数省略了def声明函数的标准步骤,因此被称为匿名函数。其本质是一个表达式,能接收任何数量的参数并返回表达式的值。

5.3 函数的参数传递

【1】函数有三种方法将实参传递给形参:按照位置传递参数、按照关键字传递参数、按照默认值传递参数

【2】按照位置传递参数是默认参数传递方式。种参数传递方法要求形参和实参的个数必须一致,并且一一对应,即相同位置的实参向相同位置的形参传递参数。当实参是一个表达式时,先要计算表达式的值,再将它传递给形参

【3】当函数需要传递很多参数时,按照位置传递参数很容易出错,此时可以按照关键字传递实参,这种参数传递方法在实参前添加了参数名,即关键字。关键字明确了每个参数的含义,这样即便参数顺序被打乱,参数的位置发生改变,也不会影响参数的传递。

【4】在定义函数时可以给形参指定默认值。在调用函数时如果形参提供了数值,则使用给定的参数值,如果没有提供数值,则会使用默认值

【5】要注意的是如果函数定义时给某个形参指定了默认值,则该参数必须定义在无默认值的形参后面

5.4 可变数量的函数参数传递

【1】在定义函数时如果参数数量不确定,可以定义可变数量的参数。

【2】在参数名前面加一个“*”,表示参数是以形参名为标识符的元组,元组中的元素个数可以是零个、一个或多个。

【3】在参数名前加两个“*”,表示参数的数据类型是字典,其中关键字(参数名)为“键”,参数值为“值”。

5.5 参数的传递顺序

【1】在定义函数时,可以混合使用多种参数传递方式,此时要遵循以下规则:

关键字参数应放在位置参数后面

元组参数必须在关键字参数后面

字典参数要放在元组参数后面

【2】在调用函数时,首先按位置顺序传递参数,其次按关键字传递参数。多余的非关键字参数传递给元组,多余的关键字参数传递给字典

5.6 函数的返回值

【1】在函数定义中,return语句是可选项,主要功能是返回函数运行结果。

【2】返回的数据类型除常见的数值、字符串外,还可以是布尔值或列表等

【3】当函数中有多条return语句时,执行完第一条return语句就会退出函数,不再执行其它return语句

【4】函数中如果没有return语句,会自动返回None,表示没有返回值。它的数据类型是NoneType

【5】return语句还可以返回多个值,此时返回的数据类型实际上是一个元组

5.7 变量的作用域

【1】函数内部创建的变量只能在函数内部使用和访问,因此被称为局部变量(local

variable),或者局部作用域。

【2】与之对应,如果一个变量在函数之外定义,可以被程序的任何部分(例如其它函数)访问和使用,这样的变量称为全局变量(global

variable)。

【3】Python内部有内存管理(memory

management)机制,在创建一个函数时会为其分配内存空间,当函数运行完毕后会释放这个内存空间,相应地,函数内部创建的各种变量,包括保存运行结果的变量会随之消失。因此必须在调用函数时定义变量来保存结果。

5.8 递归的定义

【1】递归有两个基本要素:

基例:确定递归何时终止,即何时终止分解子问题,也称为递归出口

递归模式:即复杂问题如何分解为子问题,也称为递归体

【2】递归函数只有具备了这两个要素,才能在有限次计算后得出结果。如果一个函数不具备递归的两个基本元素,由于每次调用函数都会占用计算机的一部分内存,当函数调用多次后,程序会返回“超过最大递归深度”的错误信息。这类递归叫做无穷递归,类似于while

true开始的无穷循环,中间没有break和continue语句

【3】理论上,所有的递归函数都可以写成循环的方式,但是递归定义简单,逻辑清晰。如果理解递归函数的定义,递归通常更加易懂,能明显提升程序的可读性。

5.9 递归实例

【1】整数幂运算y=x**n也符合递归的两个条件:当n=0时y=x**0=1,这是递归出口;其它情况下y=x**n=x*x**n-1,这是递归体

【2】二分法查找:被提问者默想一个1~100的数字,提问者通过提问来猜这个数字。被提问者每次回答问题只能用“是”或“不是”,提问者需要提问多少次可以猜中?答案是7次。这个问题的实质是查找一个排序序列中的数字。以序列中点为界将序列分为两个部分(二分法的名字由此而来),通过询问数字在序列的哪个部分来逐步缩小查找范围,最终锁定数字的位置。例如1~100的数字序列,以中点50为界分为两部分。第一次问“数字是否大于50?”,如果被提问者回答说“是”,则小于50的一半数字被淘汰,查找范围缩小至50~100,这个数字序列的中点是75(序列上下边界的平均值),因此接着问“数字是否大于75?”,如果回答“是”,则将查找范围进一步缩小至75~100,然后继续提问直至找出满足条件的数字为止。很明显二分法查找也是一种递归形式:每次递归会缩小一半查找范围,当查找范围的上下边界相同时,这个边界值就是要猜的数字,也就是递归出口;否则以查找范围的中点(上下边界的平均值)为界,继续缩小查找范围,查找数字所在的位置。这个递归例子的关键是顺序。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值