所谓的函数,实际上是指具有一定功能的代码块,通过函数我们可以快速的调用某一功能,不需要从无到有,从零开始构建程序,能够很好的实现代码的重复使用,大大提升开发效率。
从使用者角度看,函数就像一个“黑盒子”,用户传入一些参数,该“黑盒子”经过一定操作即可返回结果。用户并不需要知道“黑盒子”是如何得到这个结果的。
从设计者(实现函数的人)角度看,需考虑以下方面:
函数中哪些部分是动态变化的,这些通常会定义为参数;函数要实现什么功能,函数最终给使用者返回什么,即函数体;函数如何实现这些功能,即函数体。
1、函数的定义Python中函数定义的语法如下:
![6aded11bfd8ddaefd66c02eea65f3431.png](https://img-blog.csdnimg.cn/img_convert/6aded11bfd8ddaefd66c02eea65f3431.png)
注意:函数体中通过
缩进控制语句的层次关系,同一层次的语句缩进必须一致。Python中的函数可以没有返回值,也可以有多个返回值,
多个返回值之间用逗号隔开。
![27ca670c0c09c269e06d6c9327e37fb5.png](https://img-blog.csdnimg.cn/img_convert/27ca670c0c09c269e06d6c9327e37fb5.png)
2、函数的调用定义好函数后即可进行调用,
函数调用的方式为
函数名(实参列表)
,实参列表中的
参数个数要与形参个数相同,参数类型也要一致
,否则会抛出
TypeError错误
。
函数的调用一定要放在函数定义之后
,否则找不到函数,将会抛出
NameError错误
。当存在多个同名函数时,
调用的是最后定义的函数
。
根据函数是否有返回值,调用函数有两种方式。
带有返回值的函数调用。通常将函数的调用结果作为一个值处理; 没有返回值的函数调用。通常将函数调用作为一条语句来处理。
![dd256062df44432905de4d6aae42a116.png](https://img-blog.csdnimg.cn/img_convert/dd256062df44432905de4d6aae42a116.png)
判断是否为闰年的函数执行结果为True,字符串居中打印函数执行结果为:
![eba5873de99ca22c797c3cf5ce82cce9.png](https://img-blog.csdnimg.cn/img_convert/eba5873de99ca22c797c3cf5ce82cce9.png)
3、函数中参数类型及其特点
形参
:函数定义时,
写在圆括号里面的变量
,不代表任何具体的值,作为一种占位符参与函数的业务逻辑;
实参
:函数调用时,
实际传递的值
;
在 Python中,定义函数时
不需要指定参数的类型
,形参的类型
由调用者传递的实参的类型决定
。
根据函数参数赋值特点、形式划分,可大致将函数参数分为:
位置参数
、
关键字参数
、
默认值参数
、
可变长度参数
、
序列解包参数
等。
位置参数是指函数调用时,根据函数定义时形参的位置顺序依次将实参的值赋值给形参。要求实参和形参的个数必须一致,而且实参和形参必须一一对应。(最简单、最常见、最通用)关键字参数是指函数调用时,以“键-值”形式指定实参,此时将会根据关键字匹配相应的形参变量名,并对该变量其进行赋值,实参顺序和形参顺序可以不一致。要求传递的关键字一定要在形参列表中,否则将报错。(灵活、方便,调用者不用关注参数顺序和位置)默认值参数是指函数定义时,在形参列表中直接为参数赋值来指定该参数的默认值。函数调用时,对于有默认值的参数,可传值也可不传值。未传值时,将采用默认值;传值时,将用新的值替换默认值。(方便函数调用,可减少参数传递)
注意
:
定义带有默认值参数的函数时,任何一个
默认值参数右边都不能再出现非默认值参数
。
可变长度参数是指函数定义时,无法确定参数的个数。例如系统中的 print 函数,不知道用户需要打印多少个对象,此时将需要打印的内容定义为可变长度参数,根据调用者传递的实际参数来确定参数的长度。Python中可变长度参数有两种形式:*参数名和**参数名。
*参数名:表示该参数是一个元组类型,可接受多个实参,并将传递的实参依次存放到元组中,主要针对以位置传值的实参;**参数名:表示该参数是一个字典类型,可接受多个实参,并将传递的键值对放到集合中,主要针对以关键字传值的实参。序列解包参数:实参为序列对象,传值时将序列中的元素依次取出,然后按照一定规则赋值给相应变量。主要有两种形式:*序列对象、**字典对象。
当传递的实参为*序列对象时,将会取出序列中的每个元素,然后按照位置顺序依次赋值给每一个形参。当实参为序列对象时,会将其看做一个整体赋值给某个形参。当传递的实参为**字典对象时,将会根据关键字来匹配相应的形参,如果没有匹配到则报错,如果匹配到,则将相应的值赋值给该形参。当实参为字典对象时,会将其看做一个整体赋值给某个形参。
多种类型参数混合使用时的一些注意事项:
![423ecb3c1afca2875db0c9cfa742ce1a.png](https://img-blog.csdnimg.cn/img_convert/423ecb3c1afca2875db0c9cfa742ce1a.png)
![59e25302ff0bbfebf2a36f3fcaba0c90.png](https://img-blog.csdnimg.cn/img_convert/59e25302ff0bbfebf2a36f3fcaba0c90.png)
4、参数传递规则
Python中一切皆为对象,根据实参对象是否可变,可将实参分为
可变类型
和
不可变类型
。
对于不可变类型实参,例如整型、字符串、元组、浮点型等,
函数调用时传递的只是实参的值,相当于是将实参的值复制一份给形参,函数内部对形参的修改,不会影响到实参
;
对于可变类型实参,例如列表、字典、集合等,函数调用时,
传递的是实参所指对象,此时形参和实参指向同一对象,函数内部对形参的修改,可能会影响到实参
。
![e61f4ce5f0795b281de1f29f84950918.png](https://img-blog.csdnimg.cn/img_convert/e61f4ce5f0795b281de1f29f84950918.png)
5、变量作用域
变量作用域:根据变量定义的位置,可将变量分为
全局变量和
局部变量。
全局变量:
定义在函数外面的变量,可以在多个函数中进行访问,但不能执行赋值操作。如果有赋值语句,相当于
创建了一个同名的局部变量;
局部变量:
定义在函数内部的变量,只能在它被定义的函数中使用。在函数外面无法直接访问。
注意:当局部变量和全局变量同名时,在函数内部使用变量时,通常都是指局部变量,如果确实需要对全局变量进行修改,需要
使用global关键字对变量进行声明,此时操作的就是全局变量了。
![87dba4189d579edf1460798e6d82c45e.png](https://img-blog.csdnimg.cn/img_convert/87dba4189d579edf1460798e6d82c45e.png)
6、函数的递归调用函数的递归调用是指
在调用一个函数的过程中,又直接或间接调用该函数本身,递归常用来
解决结构相似的问题。所谓结构相似,是指构成原问题的子问题与原问题在结构上相似,
可以用类似的方法求解。整个问题的求解可分为两部分:第一部分是
一些特殊情况,有直接的解法;第二部分
与原问题相似,但比原问题的规模小,并且依赖第一部分的结果。递归的两个基本要素:
边界条件:递归出口,即什么时候结束递归; 递归模式:大问题是如何分解为小问题的,也称为递归体。
一般来说,
通过循环能实现的效果,往往递归也可以实现
,但反过来,
通过递归能实现的,循环不一定能够实现
。相对而言,递归的代码非常简洁,但难以理解,而循环则很容易理解。
![59e25302ff0bbfebf2a36f3fcaba0c90.png](https://img-blog.csdnimg.cn/img_convert/59e25302ff0bbfebf2a36f3fcaba0c90.png)
7、Python中的一些特殊函数
通过lambda表达式实现匿名函数的用法,lambda表达式既可以赋值给一个变量,从而多次使用,也可以直接作为某个函数的参数,只使用一次。通常是作为其他函数的参数,例如map函数、filter函数等。
![be8c175af906724cdcc05dad03a77ed3.png](https://img-blog.csdnimg.cn/img_convert/be8c175af906724cdcc05dad03a77ed3.png)
通过lambda表达式实现的效果,都能通过普通函数实现
,lambda表达式是函数的一种简化版本。但反过来通过函数能实现的,lambda表达式不一定能够实现,因为
lambda表达式只有一条语句
。
![c8cbf7cc542b4262bc3cb7ecf265238f.png](https://img-blog.csdnimg.cn/img_convert/c8cbf7cc542b4262bc3cb7ecf265238f.png)
map函数主要用于将可迭代对象中的元素依次取出,然后作为参数调用某个函数,并将所有执行结果依次保存到一个迭代器中。函数有几个参数,这里就需要几个可迭代对象。
![408a301d9c2fedd19c35960fea7f90cb.png](https://img-blog.csdnimg.cn/img_convert/408a301d9c2fedd19c35960fea7f90cb.png)
![d743f6d8173b2d164ab8f2964e7109b0.png](https://img-blog.csdnimg.cn/img_convert/d743f6d8173b2d164ab8f2964e7109b0.png)
filter函数用于
过滤可迭代对象中的元素
,保留所有能使函数结果为True的元素。
![0017b91c88878580263343272bf6335b.png](https://img-blog.csdnimg.cn/img_convert/0017b91c88878580263343272bf6335b.png)
![4c5cf81490e0a671badb1fddb4137be8.png](https://img-blog.csdnimg.cn/img_convert/4c5cf81490e0a671badb1fddb4137be8.png)
小小练习题
![8d5a32b28f00d7e6ee4abae4fa83a417.png](https://img-blog.csdnimg.cn/img_convert/8d5a32b28f00d7e6ee4abae4fa83a417.png)
Python更多资源可关注微信公众号、加入QQ群或添加老师微信获取,我们会不定期更新文章与视频。
![c419be74eb5e8e77abfa365374cecf93.png](https://img-blog.csdnimg.cn/img_convert/c419be74eb5e8e77abfa365374cecf93.png)
点击下方
即可查看手把手教你学Python详细视频!
欢迎转给身边有需要的小伙伴!
|