一. 函数的定义
1. 函数的定义:
1) 具备某一功能的代码段
2) 可以重复使用
2. 函数定义语法:
def 函数名称(): 函数体(实现功能的代码段) 注意:函数体的缩进
二. 函数的调用
1. 没有参数:函数名称()
实例1:
#定义函数 def hello(): print("Hello World!") #调用无参函数 hello() 运行结果: Hello World!
2. 有参数:函数名称(参数值)
实例2:
#定义函数 def welcome(name): print("Welcome", name) #调用有参函数 welcome("student") 运行结果: Welcome student
三. 函数的参数
1. 形参
形参:形式参数。定义函数时,使用形参,相当于占位符。目的是用来接收调用该函数时传递的参数,告诉使用者,需要提供的数据有哪些
2. 实参
实参:调用函数时,是传入的参数,必须是确定的值
四. 函数的参数类型
1. 位置参数:按照形参顺序,放入实参
#定义函数 def print_info(name, age): print("名字: ", name) print("年龄: ", age) #调用print_info函数 print_info("Jack", 30) 运行结果: 名字: Jack 年龄: 30
2. 关键字参数(指定参数):不用按形参顺序放入实参,传参时要求:形参名称=实参值
#定义函数 def print_info(name, age): print("名字: ", name) print("年龄: ", age) #调用print_info函数 print_info(age=30, name="Jack") 运行结果: 名字: Jack 年龄: 30
3. 默认参数:在定义函数时,给形参一个默认值,需要放在形参的最后,当调用函数时,默认参数的值可传可不传,不传时,使用默认值
#定义函数 def print_info(name, age=28): print("名字: ", name) print("年龄: ", age) #调用print_info函数 print_info("Jack") print_info("Jack", 30) 运行结果: 名字: Jack 年龄: 28 名字: Jack 年龄: 30
必须注意:默认参数必须指向不可变对象:整数、字符串、元组
#定义一个默认参数指向可变对象列表的函数 def add_end(L=[]): L.append('END') print(L) #调用add_end函数 add_end() add_end() add_end() 运行结果: ['END'] ['END', 'END'] ['END', 'END', 'END']
这是因为python函数在定义的时候,默认参数L的值就被计算出来了,为[]。默认参数L是一个变量,它指向对象[],每次调用该函数时,如果改变了L的内容,下次再调用时,默认参数的内容就变了,不再是函数定义时的[]了
4. 可变参数(动态参数):在定义函数时,不限定参数的个数,可用*args和**kwargs表示
*args 为元组,比如print()函数的参数就是*args
**kwargs为字典,比如requests库的request()方法的参数就是**kwargs
*args将参数打包成tuple给函数体使用
#定义函数 def print_info(name, age, *args): print(name) print(age) print(args) for item in args: print(item) #调用print_info函数 print_info("Jack", 30, "male", "running") 运行结果: Jack 30 ('male', 'running') male running
**kwargs将参数打包成dict给函数体使用,调用时实参是key=value的形式
#定义函数 def print_info(name, age, **kwargs): print(name) print(age) print(kwargs) for key, value in kwargs.items(): print(key + ":" + value) #调用print_info函数 print_info("Jack", 30, sex="male", hobby="reading") 运行结果: Jack 30 {'hobby': 'reading', 'sex': 'male'} hobby:reading sex:male
5. 参数组合:当多种参数组合使用时,参数定义的顺序为:位置参数(关键字参数)、默认参数、可变参数
#定义函数 def print_info(name, age, sex="male", **kwargs): print("name:" + name) print("age:" + str(age)) print("sex:" + sex) for key, value in kwargs.items(): print(key + ":" + value) #调用print_info函数 print_info("Jack", 30, hobby="reading", city="shenzhen") print_info(sex="female", age=20, name="Lucy",hobby="reading", city="shenzhen") 运行结果: name:Jack age:30 sex:male hobby:reading city:shenzhen name:Lucy age:20 sex:female hobby:reading city:shenzhen
五. 匿名函数
1. python使用lambda来创建匿名函数
所谓匿名,也就是没有函数名,不再使用def 函数名 这样标准的形式定义一个函数
2. lambda与标准函数的区别
1) lambda只是一个表达式,而不是一个语句
作为一个表达式,lambda可以返回一个函数,可以赋值给变量,而不像def那样在头部将函数赋值给变量名(函数名)
2) lambda的主体是一个表达式,而不是一个代码块
因此,lambda通常要比def功能小,仅能在lambda主体中封装有限的逻辑进去,连if这样的语句都不能够使用。这是有意设计的——它限制了程序的嵌套:lambda是一个为编写简单的函数而设计的,def用来处理更大的任务
3) lambda函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数
3. lambda函数的语法
lambda arg1, arg2, ... argN: expression
实例1:可以将lambda函数对象赋值给变量 f
#定义lambda函数,将其赋值给变量f f = lambda x, y, z: x + y + z #通过变量f来调用函数,并打印结果 print(f(2, 3, 4)) 运行结果: 9
实例2:在lambda函数中也可以使用默认参数
#定义lambda函数,使用默认参数 x = lambda a = "fee", b = "fie", c = "foe": a + b + c #通过变量x来调用函数,并打印结果 print(x()) 运行结果: feefiefoe
六. 返回值
1. 语法:
return 参数(可选,没有参数,则返回None)
2. 注意:
1) 返回值可以是任何类型的变量
2) 返回值也可以是表达式
3) 可以返回一个/多个变量,可以用逗号隔开或用元组
def func(): return 返回值1,返回值2 接收值1,接收值2 = func() print(接收值1,接收值2)
4) 函数体执行过程中遇到return,意味着函数调用结束
5) 函数中没有return关键字,默认返回None
6) 使用较多,返回的值可以用来传递给其他函数