手把手教你学Python之函数(一文掌握Python中的函数)

目录

1、函数的定义

2、函数的调用

3、函数中参数类型及其特点

4、参数传递规则

5、变量作用域

6、函数的递归调用

7、Python中的一些特殊函数


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

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

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

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

1、函数的定义

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

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

2、函数的调用

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

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

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

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

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

3、函数中参数类型及其特点

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

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

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

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

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

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

  • 可变长度参数是指函数定义时,无法确定参数的个数。例如系统中的 print 函数,不知道用户需要打印多少个对象,此时将需要打印的内容定义为可变长度参数,根据调用者传递的实际参数来确定参数的长度Python中可变长度参数有两种形式:*参数名**参数名
  1. *参数名表示该参数是一个元组类型,可接受多个实参,并将传递的实参依次存放到元组中,主要针对以位置传值的实参
  2. **参数名表示该参数是一个字典类型,可接受多个实参,并将传递的键值对放到集合中,主要针对以关键字传值的实参
  • 序列解包参数实参为序列对象,传值时将序列中的元素依次取出,然后按照一定规则赋值给相应变量。主要有两种形式:*序列对象**字典对象
  1. 当传递的实参为*序列对象时,将会取出序列中的每个元素,然后按照位置顺序依次赋值给每一个形参。当实参为序列对象时,会将其看做一个整体赋值给某个形参
  2. 当传递的实参为**字典对象时,将会根据关键字来匹配相应的形参,如果没有匹配到则报错,如果匹配到,则将相应的值赋值给该形参。当实参为字典对象时,会将其看做一个整体赋值给某个形参

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

4、参数传递规则

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

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

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

5、变量作用域

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

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

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

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

6、函数的递归调用

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

递归的两个基本要素:

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

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

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

7、Python中的一些特殊函数

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

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

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

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

小小练习题

https://mmbiz.qpic.cn/mmbiz_png/85OdjrokHnEkPUcULia4DYCEdJznGOIdjkvtibQOhzUibfviaNSQrsQr8iacDx3HsHoydhhaWYYUGzoA2jYEUCZ65QQ/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

更多关于手把手教你学Python的文章请关注微信公众号:手把手教你学编程。详细的视频讲解可查看 CSDN学院 里的手把手教你学Python系列视频:https://edu.csdn.net/lecturer/5686。 欢迎加入QQ群一起学习交流:858228002   

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

高成珍

前行路上与你相伴!

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

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

打赏作者

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

抵扣说明:

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

余额充值