一.什么是函数
函数是一个可重复使用的代码块,它可以执行特定的任务。函数可以接收输入参数,并可以返回一个或多个结果。这对于代码的复用和组织非常有用。
二.如何定义函数
使用def
关键字定义,后跟函数的名称和括号()。括号中可以包含函数的参数。函数的代码块以冒号开始,并且需要缩进。然后,在缩进块中编写函数体。函数的返回值用return语句返回,没有return默认返回 None。
def 函数名(参数列表):
函数体
实例:两个数的加法运算:
def add_numbers(a, b):
return a + b
result = add_numbers(3,3)
print(result)
三、函数的参数类型
在 python 中,变量是没有类型的
- 位置参数
- 关键字参数
- 默认参数
- 不定长参数
3.1 位置参数
位置参数:调用函数时根据函数定义的参数位置来传递参数。
def user_info(name, age, gender):
print(f"您的名字是{name},年龄是{age},性别是{gender}")
user_info('Jerry', 20, '男')
#注意:传递和定义参数的顺序及个数必须一致
#user_info('Jerry', 20, ) #个数定义和传入不一致会报错:user_info() missing 1 required positional argument: 'gender'
user_info(20, 'Jerry', '男')#顺序和定义不一致则导致数据无意义
3.2 关键字参数
关键字参数:函数调用,通过键=值
形式加以指定。可以让函数更加清晰、容易使用,同时也清除了参数顺序需求(注意:函数调用时,如果有位置参数时,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序)。
def user_info(name, age, gender):
print(f"您的名字是{name},年龄是{age},性别是{gender}")
#调用函数传参
user_info('Jerry', age=20, gender='男')
user_info('Muxi', gender='女', age=20)
#注意:函数调用时,如果有位置参数时,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序
#user_info(gender='女', age=20, 'Muxi')
3.3 默认参数
缺省参数(也称为默认参数)是在函数定义时赋予默认值的参数。如果在调用函数时没有为这些参数提供值,那么就会使用默认值(注意:所有位置参数必须出现在默认参数前,包括函数定义和调用)。
def user_info(name, age, gender='男'):
print(f"您的名字是{name},年龄是{age},性别是{gender}")
user_info('Jerry',20)
user_info('Muxi',20, '女')
#注意:函数调用时,如果为缺省参数传值则修改默认参数值;否则使用这个默认值
3.4 不定长参数
Python中的不定长参数是一种特殊形式的参数,允许函数接收任意数量的参数。提供了两种类型的不定长参数:*args
和 **kwargs
。
*args
: 这种形式的参数用于发送非键值对的可变数量的参数列表给一个函数,返回结果为元组
。例如:
def user_info(*args):
print(args)
user_info("Muxi") #结果('Muxi',)
user_info('Muxi',25) #结果('Muxi', 25)
user_info() #在函数调用时没有指定参数,它就是一个空元组:()
#注意:传进的所有参数都会被args变量收集,它会根据传进参数的位置合并为一个元组(tuple),
#args是元组类型,这就是包裹位置传递
**kwargs
:这种形式的参数用于发送长度可变的键值对列表给一个函数。它常用于处理带名字的参数,返回结果为字典
。例如:
#收集所有关键字参数,返回一个字典
def user_info(**kwargs):
print(kwargs)
user_info() #在函数调用时没有指定参数,它就是一个空字典:{}
user_info(name='Tom', age=18) #结果{'name': 'Tom', 'age': 18}
user_info(name='Tom', age=18, id=10089) #结果{'name': 'Tom', 'age': 18, 'id': 10089}
四、递归函数
- 自我调用:递归函数会在函数体内部调用自身;
- 结束条件:递归函数必须有一个明确的结束条件,否则它将无限制地调用自身。
应用:
def sum_numbers(num):
#出口
if num == 1:
return 1
#递归调用
return num + sum_numbers(num-1)
result = sum_numbers(100)
print(result)
执行结果:
五、匿名函数
1.语法:lambda 参数列表:表达式
-
lambda表达式的参数可有可无,函数的参数在lambda表达式中完全适用;
-
lambda表达式能接收任何数量的参数,但是只能返回一个表达式的值。
2、lambda参数列表的传参方式
2.1 无参数
fn1 = lambda : 100
print(fn1())
执行结果如下:
2.2 一个参数
fn2 = lambda a : a
print(fn2('hello world'))
执行结果如下:
2.3 默认参数(缺省参数)
fn3 = lambda a , b , c=30 : a + b +c
print(fn3(10,20))
print(fn3(10,20,100))
执行结果如下:
2.4 可变参数:*args(返回值为元组)
fn4 = lambda *args : args
print(fn4(10,20,30,40))
print(fn4(10,20,30))
print(fn4(10))
#注意:这里的可变参数传入到lambda之后,返回值为元组
执行结果如下:
2.5 可变参数:**kwargs(返回值为字典)
fn5 = lambda **kwargs : kwargs
print(fn5(name='Python'))
print(fn5(name='Python',age=20))
#注意:这里的可变参数传入到lambda之后,返回值为字典
执行结果如下:
2.6 代判断的lambda
#lambda 两个数比大小
fn1 = lambda a , b : a if a > b else b
print(fn1(100,50))
执行结果如下:
六、高阶函数
特点:
- 函数接收一个或多个函数作为参数
- 函数返回另一个函数
5.1 体验高阶函数:
任意两个数字,先进行数字处理「绝对值:abs() 或 四舍五入:round() 」再求和:
#高阶函数:f是第三个参数,用来接收将来传入的函数
def sum(a,b,f):
return f(a) +f(b)
result1 = sum(-2,4,abs)
print(result1) #输出结果6
result2 = sum(-2.9,4.1,round)
print(result2) #输出结果1
5.2 内置高阶函数map()
map(func,lst)`是一个内置的高阶函数,它接受一个函数和一个迭代器作为参数,并返回一个新的迭代器,该迭代器将输入函数应用于每个元素。
#1、准备列表数据
list1 = [1,2,3,4,5,6]
#2、准备2次方计算的函数
def func(x):
return x ** 2
#3、调用map
result = map(func,list1)
print(result) #<map object at 0x7ff3680637b8>
print(list(result)) #[1, 4, 9, 16, 25, 36]
执行结果如下:
5.3 内置高阶函数reduce()
reduce(func,lst),其中func必须有两个参数,每次func函数计算的结果和序列的下一个数据做累积计算。
list1 = [1,2,4,5,6,7]
#1、导入模块
import functools
#2、定义功能函数
def func(a,b):
return a+b
#3、调用reduce,作用:功能函数计算的结果和序列的下一个数据做累积计算
result = functools.reduce(func,list1)
print(result) #输出结果25
#注意:reduce()传入参数func必须接收2个参数
5.4 内置高阶函数filter()
filter(func,lst)函数用于过滤序列,过滤掉不符合条件的元素,返回一个filter对象。如果要转换为列表,可以用list()来转换。
list1 = list(range(1,11))
#1、定义功能函数;过滤序列中的偶数
def func(x):
return x % 2 == 0
#2、调用filter
result = filter(func,list1)
print(result) #<filter object at 0x7fdc100237f0>
print(list(result)) #[2, 4, 6, 8, 10]