重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
一、函数的定义
创新互联建站-成都网站建设公司,专注网站建设、网站制作、网站营销推广,主机域名,网站空间,网站运营有关企业网站制作方案、改版、费用等问题,请联系创新互联建站。
函数是指将一组语句的集合通过一个名字(函数名)封装起来,想要执行这个函数,只需要调用函数名即可
特性:
减少重复代码
使程序变得可扩展
使程序变得易维护
二、函数的参数
2.1、形参和实参数
形参,调用时才会存在的值
实惨,实际存在的值
2.2、默认参数
定义:当不输入参数值会有一个默认的值,默认参数要放到最后
2.3、 关键参数
定义: 正常情况下,给函数传参数要安装顺序,不想按顺序可以用关键参数,只需要指定参数名即可,(指定了参数名的就叫关键参数),但是要求是关键参数必须放在位置参数(以位置顺序确定对应的参数)之后
2.4、非固定参数
定义: 如你的函数在传入参数时不确定需要传入多少个参数,就可以使用非固定参数
# 通过元组形式传递
# 通过列表形式传递
# 字典形式(通过k,value的方式传递)
# 通过变量的方式传递
三、函数的返回值
作用:
返回函数执行结果,如果没有设置,默认返回None
终止函数运行,函数遇到return终止函数
四、变量的作用域
全局变量和局部变量
在函数中定义的变量叫局部变量,在程序中一开始定义的变量叫全局变量
全局变量作用域整个程序,局部变量作用域是定义该变量的函数
当全局变量与局部变量同名是,在定义局部变量的函数内,局部变量起作用,其他地方全局变量起作用
同级的局部变量不能互相调用
想要函数里边的变量设置成全局变量,可用global进行设置
五、特殊函数
5.1、嵌套函数
定义: 嵌套函数顾名思义就是在函数里边再嵌套一层函数
提示 在嵌套函数里边调用变量是从里往外依次调用,意思就是如果需要调用的变量在当前层没有就会去外层去调用,依次内推
匿名函数
基于Lambda定义的函数格式为: lambda 参数:函数体
参数,支持任意参数。
匿名函数适用于简单的业务处理,可以快速并简单的创建函数。
# 与三元运算结合
5.3、高阶函数
定义:变量可以指向函数,函数的参数可以接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数称之为高阶函数 只需要满足一下任意一个条件,即是高阶函数
接收一个或多个函数作为输入
return返回另一个函数
5.4、递归函数
定义:一个函数可以调用其他函数,如果一个函数调用自己本身,这个函数就称为递归函数
在默认情况下Python最多能递归1000次,(这样设计师是为了防止被内存被撑死)可以通过sys.setrecursionlimit(1500)进行修改
递归实现过程是先一层一层的进,然后在一层一层的出来
必须有一个明确的条件结束,要不然就是一个死循环了
每次进入更深层次,问题规模都应该有所减少
递归执行效率不高,递归层次过多会导致站溢出
# 计算4的阶乘 4x3x2x1
# 打印数字从1-100
5.5、闭包现象
定义:内层函数调用外层函数的变量,并且内存函数被返回到外边去了
闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域
1、高阶函数
变量可以指向函数,函数的参数可以接收变量,那么函数可以接收另一个函数作为参数,这种函数称为高阶函数。
(1)把函数作为实参
(2)把函数作为返回值
2、系统的内置高阶函数
(1)map函数:接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并且把结果作为新的列表返回
(2)reduce函数:把一个函数作用到一个序列上,这个函数必须接收两个参数,reduce把结果和序列的下一个元素做累积计算
(3)filter函数:也接收一个函数和一个序列,和map函数不同的是,filter函数把传入的函数依次作用于每个元素,然后返回返回值是True的元素
(4)sorted函数:排序函数
把用户名按照首字母不区分大小写排序
(5)sorted()函数按照关键字排序
关键字:商品个数
(6)sorted()函数按照关键字排序,用键值来查找
(7)lambda匿名函数:有时候传参数时不需要显示自定义的函数,直接传入匿名函数更方便;冒号前面的x,y表示函数参数,匿名函数不需要担心函数名的冲突,匿名函数也是一个函数对象,可以把匿名函数赋值给一个变量,再利用变量来调用函数,匿名函数也可以作为返回值返回
3、高阶函数的应用:
(1)sorted函数:
(2)sorted函数默认是从小到大排序
4、装饰器
装饰器就是用来装饰函数的:想要增加原有函数的功能,但是不希望修改原有函数的定义,在代码运行期间动态增加功能的方式
(1)此装饰器的功能:计算函数的运行时间
import functools
@functools.wraps(f) ##保留原有函数的属性
运行结果:
(2)此装饰器的功能:用户登录认证
运行结果:
(3)此装饰器的功能:认证用户的同时,显示用户的转账金额
import inspect
inspect.getcallargs()将传的参数封装为一个字典,字典的key值是形式参数,value值是实参
(4)此装饰器的功能:确保收到的每个参数都是整数,是整数就求和,否则抛出错误
(5)此装饰器的功能:给装饰器传参数,是整数和浮点数就求和
python学习网,大量的免费python视频教程,欢迎在线学习!
这几个函数在 Python 里面被称为高阶函数,本文主要学习它们的用法。
filter 函数原型如下:
第一个参数是判断函数(返回结果需要是 True 或者 False),第二个为序列,该函数将对 iterable 序列依次执行 function(item) 操作,返回结果是过滤之后结果组成的序列。
简单记忆:对序列中的元素进行筛选,获取符合条件的序列。
返回结果为: ,使用 list 函数可以输入序列内容。
map 函数原型如下:
该函数运行之后生成一个 list,第一个参数是函数、第二个参数是一个或多个序列;
下述代码是一个简单的测试案例:
上述代码运行完毕,得到的结果是: 。使用 print(list(my_new_list)) 可以得到结果。
map 函数的第一个参数,可以有多个参数,当这种情况出现后,后面的第二个参数需要是多个序列。
map 函数解决的问题:
reduce 函数原型如下:
第一个参数是函数,第二个参数是序列,返回计算结果之后的值。该函数价值在于滚动计算应用于列表中的连续值。
测试代码如下:
最终的结果是 6,如果设置第三个参数为 4,可以运行代码查看结果,最后得到的结论是,第三个参数表示初始值,即累加操作初始的数值。
简单记忆:对序列内所有元素进行累计操作。
zip 函数原型如下:
zip 函数将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
如果各个迭代器的元素个数不一样,则返回列表长度与最短的对象相同,利用星号( * )操作符,可以将元组解压为列表。
测试代码如下:
展示如何利用 * 操作符:
输出结果如下:
简单记忆:zip 的功能是映射多个容器的相似索引,可以方便用于来构造字典。
enumerate 函数原型如下:
参数说明:
该函数用于将一个可遍历的数据对象组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
测试代码如下:
返回结果为: 。
本文涉及的函数可以与 lambda 表达式进行结合,能大幅度提高编码效率。最好的学习资料永远是官方手册
1、map
map()函数接受两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每一个元素上,并把结果作为新的Iterator返回。
举例,比如我们有一个函数f(x)=x*2,要把这个函数作用在一个list[1, 2, 3, 4, 5, 6, 7, 8,
9]上,就可以用map()实现。
def f(x):
... return x*2
...
r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
list(r)
[2, 4, 6, 8, 10, 12, 14, 16, 18]
所以,map()作为高阶函数,事实上它把运算规则抽象了,因此,我们不但可以计算简单的f(x)=x*2,还可以计算任意复杂的函数,比如把这个list所有的数字转为字符串:
list(map(str,[1, 2, 3, 4, 5, 6, 7, 8, 9]))
["1", "2", "3", "4", "5", "6", "7", "8", "9"]
2、reduce
reduce是把一个函数作用在一个序列[x1, x2,
x3……]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累计计算。简单来说,就是先计算x1和x2的结果,再拿结果与x3计算,依次类推。比如说一个序列求和,就可以用reduce实现。
from functools import reduce
def add(x, y):
... return x + y
...
reduce(add, [1, 3, 5, 7, 9])
25
也就是说,假设python没有提供int()函数,你完全可以自己写一个把字符串转化为整数的函数,而且只需要几行代码。
3、filter
用于过滤序列,和map函数类似,filter也接收一个函数和一个序列,不同于map的是,filter把传入的函数依次作用于每一个元素,然后根据返回值是True还是False决定保留还是丢弃该元素,例如,在一个list中,删掉偶数,只保留奇数,可以这么写:
def is_odd(n):
return n % 2 == 1
list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
# 结果: [1, 5, 9, 15]
把一个序列中的空字符串删掉,可以这么写:
def not_empty(s):
return s and s.strip()
list(filter(not_empty, ["A", "", "B", None, "C", " "]))
# 结果: ["A", "B", "C"]
可见用filter()这个高阶函数,关键在于正确实现一个筛选函数。
4、sorted
无论冒泡排序还是快速排序,排序的核心是比较两个元素的大小。如果是数字,我们可以直接比较,但如果是字符串或者两个dict呢?直接比较数学上的大小是没有意义的,因此,比较的过程必须通过函数抽象出来,Python内置的sorted()函数就可以对list进行排序:
sorted([36, 5, -12, 9, -21])
[-21, -12, 5, 9, 36]
此外,sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序,例如按绝对值大小排序:
sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]
将函数作为参数传入,这样的函数称为高阶函数。 函数式编程就是指这种高度抽象的编程范式。
变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。如下所示:
map(fun, lst),将传入的函数变量func作用到lst变量的每个元素中,并将结果组成新的列表返回。
定义一个匿名函数并调用,定义格式如--lambda arg1,arg2…:表达式
reduce把一个函数作用在一个序列[x1, x2, x3, …]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算。
filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。
闭包的定义?闭包本质上就是一个函数
如何创建闭包?
如何使用闭包?典型的使用场景是装饰器的使用。
global与nonlocal的区别:
简单的使用如下:
偏函数主要辅助原函数,作用其实和原函数差不多,不同的是,我们要多次调用原函数的时候,有些参数,我们需要多次手动的去提供值。
而偏函数便可简化这些操作,减少函数调用,主要是将一个或多个参数预先赋值,以便函数能用更少的参数进行调用。
我们再来看一下偏函数的定义:
类func = functools.partial(func, *args, **keywords)
我们可以看到,partial 一定接受三个参数,从之前的例子,我们也能大概知道这三个参数的作用。简单介绍下:
总结
本文是对Python 高阶函数相关知识的分享,主题内容总结如下: