2020-12-06

函数
一.函数的概念:
Python中的函数分为内建函数和自定义函数。内建函数是Python自带的,即可以直接使用,如print()函数、input()函数等。常见的内建函数如下表:
在这里插入图片描述
内建函数的数量是有限的,如果大家想自己设计符合使用需求的函数,则可以定义一个函数,其语法格式如下:
在这里插入图片描述
在上述语法格式中,需注意以下几点:
1.def(即define,定义)为关键字,表示定义一个函数。
2.函数名是一个标识符,注意不能与关键字重名。
3.小括号之间可以用于定义参数,参数是可选的,但小括号不可少。
4.函数体以冒号起始,并且缩进。
5.函数体的第一行语句可以选择性地使用文档字符串用来存放函数说明。
6.return [表达式]结束函数,将表达式的值返回给调用者,也可以省略。
二.函数的参数:
参数列表由一系列参数组成,并用逗号隔开。在调用函数时,如果需要向函数传递参数,则被传入的参数称为实参,而函数定义时的参数称为形参,实参与形参之间可以传递数据。
1…位置参数:
位置参数是指函数调用时传递实参的顺序与定义函数的形参顺序一致。
当函数调用时,实参的传递顺序与定义函数形参的顺序需保持一致。由于实参的顺序与函数定义时形参的位置有关,因此称为位置参数。
2.关键参数:
关键参数是指通过对形参赋值传递的参数。关键参数允许函数调用时传递实参的顺序与定义函数的形参顺序不一致,因为 Python解释器能够用形参名匹配实参值,使用户不必记住位置参数的顺序。
3…默认参数:
如果在函数定义时参数列表中的某个形参有值,就称这个参数为默认参数。注意默认参数必须放在非默认参数的右侧,否则函数将出错。
4.不定长参数:
一个形参只能接收一个实参。除此之外,函数形参可以接收不定个数的实参,即用户可以给函数提供可变长度的参数,这可以通过在形参前面使用来实现。此外,不定长参数还可以接受关键参数并将其存放到字典中,这时需要使用**来实现。
5.传递不可变与可变对象:
在Python中,数字、字符串与元组是不可变类型,而列表、字典是可变类型,两者区别如下:
a.不可变类型:该类型的对象所代表的值不能被改变。当改变某个变量时,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。
b.可变类型:该类型的对象所代表的值可以被改变。变量改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟出新的地址。
三.函数的返回值:
函数调用时的参数传递实现了从函数外部向函数内部输入数据,而函数的return语句实现了从函数内部向函数外部输出数据。
此处需注意,如果函数定义时省略return语句或者只有return而没有返回值,则Python将认为该函数以“return None”结束,None代表没有值。return语句可以放置在函数中任何位置,当执行到第一个return语句时,程序返回到调用程序处接着执行,此时不会执行该函数中return语句后的代码。当函数具有多个返回值时,如果只用一个变量来接收返回值,函数返回的多个值实际上构成了一个元组。
四.变量的作用域:
量起作用的代码范围称为变量的作用域,与变量定义的位置密切相关,按照作用域的不同,变量可分为局部变量和全局变量。
1.局部变量:
在函数内部定义的普通变量只在函数内部起作用,称为局部变量。当函数执行结束后,局部变量自动删除,不可以再使用。
2.全局变量:
如果需要在函数内部给一个定义在函数外的变量赋值,那么这个变量的作用域不能是局部的,而应该是全局的。能够同时作用于函数内外的变量称为全局变量,它通过global关键字来声明。此处需注意,如果不使用global声明,则在函数中访问的是局部变量。此外,使用内置函数globals()与locals()可以查看局部变量与全局变量。
五.函数的嵌套调用:
Python语言允许在函数定义中出现函数调用,从而形成函数的嵌套调用。
六.函数的递归调用:
在函数的嵌套调用中,一个函数除了可以调用其他函数外,还可以调用自身,这就是函数的递归调用。递归必须要有结束条件,否则会无限地递归(Python默认支持997次递归,多于这个次数将终止)。
七.间接调用函数:
可以将函数名赋值给一个变量,再通过变量名加参数列表的形式间接调用函数。
八.匿名函数:
1.匿名函数是指没有函数名称的、临时使用的微函数。它可以通过lambda表达式来声明。
在这里插入图片描述
其中,“[arg1 [, arg2, …, argn]]”表示函数的参数,“表达式”表示函数体。lambda表达式只可以包含一个表达式,其计算结果可以看作是函数的返回值。虽然lambda表达式不允许包含其他复杂的语句,但在表达式中可以调用其他函数。
3.使用lambda表达式声明的匿名函数也可以作为自定义函数的实参。
4.此外,lambda表达式声明的匿名函数还可以作为内建函数的实参。
5.lambda表达式表示一个匿名函数,也可以作为列表或字典的元素。
九.闭包:
1.函数可以通过return返回一个变量。此外,函数也可以返回另外一个函数名。
2.将一个函数的定义嵌套到另一个函数中,还有其他的作用。
3.如果内层函数引用了外层函数的变量(包括其参数),并且外层函数返回内层函数名,这种函数架构称为闭包。
4.闭包需要满足的三个条件:
内层函数的定义嵌套在外层函数中。
内层函数引用外层函数的变量。
外层函数返回内层函数名。
十.装饰器:
装饰器本质上还是函数,可以让其他函数在不做任何代码修改的前提下增加额外功能。一个以函数作为参数并返回一个替换函数的可执行函数。装饰器的本质是一个嵌套函数,外层函数的参数是被修饰的函数,内层函数是一个闭包并在其中增加新功能(装饰器的功能函数)。
1.@符号的应用:
可以通过@符号和装饰器名实现两者的联系。
2.装饰有参数的函数:
装饰器除了可以装饰无参数的函数外,还可以装饰有参数的函数。
3.带参数的装饰器—装饰器工厂:
装饰器本身就是一个函数,即装饰器本身也可以带参数。此时,装饰器需要再多一层内嵌函数。
4.偏函数:
函数最重要的一个功能的是复用代码,有时在复用已有函数时,可能需要固定其中的部分参数,除了设置默认值参数外,还可以使用偏函数(用来固定函数调用时部分或全部参数的函数叫偏函数)。
十一.常用的内建函数:
1.eval()函数:用于动态表达式求值。
在这里插入图片描述
其中,source是动态表达式的字符串,globals和locals是求值时使用的上下文环境的全局变量和局部变量,如果不指定,则使用当前运行上下文。
2.exec()函数:
用于动态语句的执行。
在这里插入图片描述
其中,source是动态语句的字符串,globals和locals是使用的上下文环境的全局变量和局部变量,如果不指定,则使用当前运行上下文。
3.compile()函数:
用于将一个字符串编译为字节代码。
在这里插入图片描述
其中,source为代码语句的字符串,filename为代码文件名称,如果不是从文件读取代码,则传递一些可辨认的值,mode为指定编译代码的种类,其值可以为’exec’、‘eval’、‘single’,剩余参数一般使用默认值。
4.map()函数:
在这里插入图片描述
其中,function为函数名,其余参数为序列,返回值为迭代器对象,通过list()函数可以将其转换为列表,也可以使用for循环进行遍历操作。
5.filter()函数:
对指定序列进行过滤操作。
在这里插入图片描述
其中,function为函数名,它所引用的函数只能接受一个参数,并且返回值是布尔值,sequence为一个序列,filter()函数返回值为迭代器对象。
6.zip()函数:
zip()函数用于将一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的迭代对象。zip()参数可以接受任何类型的序列,同时也可以有两个以上的参数。但当传入参数的长度不同时,zip()函数以最短序列长度为准进行截取获得元组。在zip()函数中还可以使用
运算符。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值