Python 中的函数

        所谓的函数,实际上是指具有一定功能的代码块,通过函数我们可以快速的调用某一功 能,不需要从无到有,从零开始构建程序,能够很好的实现代码的重复使用,大大提升开发 效率。

        从使用者角度看,函数就像一个“黑盒子”,用户传入一些参数,该“黑盒子”经过一 定操作即可返回结果。用户并不需要知道“黑盒子”是如何得到这个结果的。

        从设计者(实现函数的人)角度看,需考虑以下方面

  • 函数中哪些部分是动态变化的,这些通常会定义为参数; 
  • 函数要实现什么功能,函数最终给使用者返回什么,即函数体; 
  • 函数如何实现这些功能,即函数体。

函数的定义

Python 中函数定义的语法如下:

注意:函数体中通过缩进控制语句的层次关系,同一层次的语句缩进必须一致。 Python 中的函数可以没有返回值,也可以有多个返回值,多个返回值之间用逗号隔开。

函数的调用

        定义好函数后即可进行调用,函数调用的方式为函数名(实参列表),实参列表中的 参数个数要与形参个数相同,参数类型也要一致,否则会抛出TypeError错误。

        函数的调用一定要放在函数定义之后,否则找不到函数,将会抛出NameError错 误。当存在多个同名函数时,调用的是最后定义的函数。

根据函数是否有返回值,调用函数有两种方式:

  • 带有返回值的函数调用。通常将函数的调用结果作为一个值处理。 
  • 没有返回值的函数调用。通常将函数调用作为一条语句来处理。

判断是否为闰年的函数执行结果为 True,字符串居中打印函数执行结果为:

函数中参数类型及其特点

        形参:函数定义时,写在圆括号里面的变量,不代表任何具体的值,作 为一种占位符参与函数的业务逻辑;

        实参:函数调用时,实际传递的值;

        在 Python 中,定义函数时不需要指定参数的类型,形参的类型由调用 者传递的实参的类型决定。

        根据函数参数赋值特点、形式划分,可大致将函数参数分为:位置参数、 关键字参数、默认值参数、可变长度参数、序列解包参数等。

  • 位置参数是指函数调用时,根据函数定义时形参的位置顺序依次将实参 的值赋值给形参。要求实参和形参的个数必须一致,而且实参和形参必 须一一对应。(最简单、最常见、最通用)
  • 关键字参数是指函数调用时,以“键-值”形式指定实参,此时将会根据 关键字匹配相应的形参变量名,并对该变量其进行赋值,实参顺序和形 参顺序可以不一致。要求传递的关键字一定要在形参列表中,否则将报 错。(灵活、方便,调用者不用关注参数顺序和位置) 
  • 默认值参数是指函数定义时,在形参列表中直接为参数赋值来指定该参 数的默认值。函数调用时,对于有默认值的参数,可传值也可不传值。 未传值时,将采用默认值;传值时,将用新的值替换默认值。(方便函数 调用,可减少参数传递)

        注意:定义带有默认值参数的函数时,任何一个默认值参数右边都不能 再出现非默认值参数。

  • 可变长度参数是指函数定义时,无法确定参数的个数。例如系统中的 print 函数,不知道用户需要打印多少个对象,此时将需要打印的内容 定义为可变长度参数,根据调用者传递的实际参数来确定参数的长度。

        Python 中可变长度参数有两种形式:*参数名和**参数名。

  1. *参数名:表示该参数是一个元组类型,可接受多个实参,并将传递 的实参依次存放到元组中,主要针对以位置传值的实参; 
  2. **参数名:表示该参数是一个字典类型,可接受多个实参,并将传递 的键值对放到集合中,主要针对以关键字传值的实参。
  • 序列解包参数:实参为序列对象,传值时将序列中的元素依次取出,然 后按照一定规则赋值给相应变量。主要有两种形式:*序列对象、**字典 对象。
  1.  当传递的实参为*序列对象时,将会取出序列中的每个元素,然后按 照位置顺序依次赋值给每一个形参。当实参为序列对象时,会将其看 做一个整体赋值给某个形参。 
  2. 当传递的实参为**字典对象时,将会根据关键字来匹配相应的形参, 如果没有匹配到则报错,如果匹配到,则将相应的值赋值给该形参。 当实参为字典对象时,会将其看做一个整体赋值给某个形参。

多种类型参数混合使用时的一些注意事项:

参数传递规则

        Python 中一切皆为对象,根据实参对象是否可变,可将实参分为可变 类型和不可变类型。

        对于不可变类型实参,例如整型、字符串、元组、浮点型等,函数调 用时传递的只是实参的值,相当于是将实参的值复制一份给形参,函数内 部对形参的修改,不会影响到实参;

        对于可变类型实参,例如列表、字典、集合等,函数调用时,传递的 是实参所指对象,此时形参和实参指向同一对象,函数内部对形参的修 改,可能会影响到实参。

变量作用域

        变量作用域:根据变量定义的位置,可将变量分为全局变量和局部变量。

        全局变量:定义在函数外面的变量,可以在多个函数中进行访问,但不能执 行赋值操作。如果有赋值语句,相当于创建了一个同名的局部变量;

        局部变量:定义在函数内部的变量,只能在它被定义的函数中使用。在函数 外面无法直接访问。

        注意:当局部变量和全局变量同名时,在函数内部使用变量时,通常都是指 局部变量,如果确实需要对全局变量进行修改,需要使用global关键字对变量进 行声明,此时操作的就是全局变量了。

函数的递归调用

        函数的递归调用是指在调用一个函数的过程中,又直接或间接调用该函数本 身,递归常用来解决结构相似的问题。所谓结构相似,是指构成原问题的子问 题与原问题在结构上相似,可以用类似的方法求解。整个问题的求解可分为两 部分:第一部分是一些特殊情况,有直接的解法;第二部分与原问题相似,但 比原问题的规模小,并且依赖第一部分的结果。

        递归的两个基本要素:

        边界条件:递归出口,即什么时候结束递归;

        递归模式:大问题是如何分解为小问题的,也称为递归体。

        一般来说,通过循环能实现的效果,往往递归也可以实现,但反过 来,通过递归能实现的,循环不一定能够实现。相对而言,递归的代码非 常简洁,但难以理解,而循环则很容易理解。

Python 中的一些特殊函数

        通过lambda 表达式实现匿名函数的用法,lambda 表达式既可以赋值给一个变 量,从而多次使用,也可以直接作为某个函数的参数,只使用一次。通常是作为其他 函数的参数,例如map函数、filter函数等。

        通过lambda 表达式实现的效果,都能通过普通函数实现,lambda表达式是函数 的一种简化版本。但反过来通过函数能实现的,lambda表达式不一定能够实现,因 为lambda 表达式只有一条语句。

        map 函数主要用于将可迭代对象中的元素依次取出,然后作为参数调用某个函数, 并将所有执行结果依次保存到一个迭代器中。函数有几个参数,这里就需要几个可迭 代对象。

filter 函数用于过滤可迭代对象中的元素,保留所有能使函数结果为True的元 素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

code36

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值