Python函数总结

第六章 函数

函数的概述
函数是组织好的、实现单一功能或相关联功能的代码段。我们可以将函数视为一段有名字的代码,这类代码可以在需要的地方以“函数名()”的形式调用。
函数的优点
将程序模块化,既减少了冗余代码,又让程序结构更为清晰
提高开发人员的编程效率
方便后期的维护与扩展
函数的定义和调用
前面使用的print()函数和input()都是Python的内置函数,这些函数由Python定义。开发人员也可以根据自己的需求定义函数,Python中使用关键字def来定义函数,其语法格式如下:
在这里插入图片描述
函数在定义完成后不会立刻执行,直到被程序调用时才会执行。
语法:
函数名([参数列表])

  1. 程序在调用函数的位置暂停执行。
  2. 将数据传递给函数参数。
  3. 执行函数体中的语句。
  4. 程序回到暂停处继续执行。
    注:函数内部还可以调用其他函数,即函数可以嵌套使用。
    而且函数还可以嵌套定义。
    函数参数的传递
    我们通常将定义函数时设置的参数称为形式参数(简称为形参),将调用函数时传入的参数称为实际参数(简称为实参)。函数的参数传递是指将实际参数传递给形式参数的过程。
    函数参数的传递可以分为位置参数传递、关键字参数传递、默认参数传递、参数的打包与解包以及混合传递。
    1.位置参数:
    函数在被调用时会将实参按照相应的位置依次传递给形参,也就是说将第一个实参传递给第一个形参,将第二个实参传递给第二个形参,以此类推。
    2.关键字参数
    关键字参数的传递是通过“形参=实参”的格式将实参与形参相关联,将实参按照相应的关键字传递给形参。
    也可以两种混合起来使用。
    使用符号“/”来区分。
    Python在3.8版本中新增了仅限位置形参的语法,使用符号“/”来限定部分形参只接收采用位置传递方式的实参。
    在这里插入图片描述
    结果会报错
    所以“/”前面的只能用位置参数。
    3.默认参数的传递
    函数在定义时可以指定形参的默认值,如此在被调用时可以选择是否给带有默认值的形参传值,若没有给带有默认值的形参传值,则直接使用该形参的默认值。
    4.参数的打包与解包
    如果函数在定义时无法确定需要接收多少个数据,那么可以在定义函数时为形参添加“”或“**”:
    ” —— 接收以元组形式打包的多个值
    ”—— 接收以字典形式打包的多个值
    虽然函数中添加“*”或“
    ”的形参可以是符合命名规范的任意名称,但这里建议使用args和**kwargs。
    若函数没有接收到任何数据,参数
    args和kwargs为空,即它们为空元组或空字典。
    实参是元组 → 可以使用“*”拆分成多个值 → 按位置参数传给形参
    实参是字典 → 可以使用“
    ” 拆分成多个键值对 → 按关键字参数传给形参
    前面介绍的参数传递的方式在定义函数或调用函数时可以混合使用,但是需要遵循一定的规则,具体规则如下。
    优先按位置参数传递的方式。
    然后按关键字参数传递的方式。
    之后按默认参数传递的方式。
    最后按打包传递的方式。
    在定义函数时:
    带有默认值的参数必须位于普通参数之后。
    带有“”标识的参数必须位于带有默认值的参数之后。
    带有“**”标识的参数必须位于带有“
    ”标识的参数之后。
    函数的返回值
    函数中的return语句会在函数结束时将数据返回给程序,同时让程序回到函数被调用的位置继续执行。
    如果函数使用return语句返回了多个值,那么这些值将被保存到元组中。
    变量作用域
    变量并非在程序的任意位置都可以被访问,其访问权限取决于变量定义的位置,其所处的有效范围称为变量的作用域。根据作用域的不同,变量可以分为局部变量和全局变量。
    1.局部变量
    函数内部定义的变量,只能在函数内部被使用
    函数执行结束之后局部变量会被释放,此时无法再进行访问。
    不同函数内部可以包含同名的局部变量,这些局部变量的关系类似于不同目录下同名文件的关系,它们相互独立,互不影响。
    2.全局变量
    全局变量可以在整个程序的范围内起作用,它不会受到函数范围的影响。
    全局变量在函数内部只能被访问,而无法直接修改
    注LEGB原则
    LEGB是程序中搜索变量时所遵循的原则,该原则中的每个字母指代一种作用域,具体如下:
    Python在搜索变量时会按照“L-E-G-B ”这个顺序依次在这四种区域中搜索变量:若搜索到变量则终止搜索,使用搜索到的变量;若搜索完L、E、G、B这四种区域仍无法找到变量,程序将抛出异常。
    Python提供了global和nonlocal来修改全局变量和嵌套函数的中的变量。
    直接上代码
number = 10                    # 定义全局变量
def test_one():
    global number              # 使用global声明变量number为全局变量
    number += 1
    print(number)
test_one()
print(number)


def test():
    number = 10
    def test_in():
        nonlocal number
        number = 20
    test_in()
    print(number)
test()

结果:
在这里插入图片描述
特殊的几种函数
递归函数
函数在定义时可以直接或间接地调用其他函数。若函数内部调用了自身,则这个函数被称为递归函数。
递归函数在定义时需要满足两个基本条件:一个是递归公式,另一个是边界条件。其中:
递归公式是求解原问题或相似的子问题的结构;
边界条件是最小化的子问题,也是递归终止的条件。
递归函数的执行可以分为以下两个阶段:
1.递推:递归本次的执行都基于上一次的运算结果。
2.回溯:遇到终止条件时,则沿着递推往回一级一级地把值返回来。
一般定义格式:
def 函数名([参数列表]):
if 边界条件:
rerun 结果
else:
return 递归公式*
匿名函数
和普通函数的区别:
普通函数在定义时有名称,而匿名函数没有名称;
普通函数的函数体中包含有多条语句,而匿名函数的函数体只能是一个表达式;
普通函数可以实现比较复杂的功能,而匿名函数可实现的功能比较简单;
普通函数能被其他程序使用,而匿名函数不能被其他程序使用。
定义好的匿名函数不能直接使用,最好使用一个变量保存它,以便后期可以随时使用这个函数。

# 定义匿名函数,并将它返回的函数对象赋值给变量temp
temp = lambda x : pow(x, 2) 
temp(10) 

高阶函数
高阶函数可以接收另一个函数作为参数,Python内置了一些高阶函数:map()、filter()、reduce()。如果需要逐个查看可迭代对象中的元素,然后进行执行一些操作,就可以使用这些高阶函数。从编程技术的角度,这些高阶函数都是为了更好地描述“做什么”的逻辑,它们也是常用的函数式编程工具。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值