一. 函数的定义
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) 使用较多,返回的值可以用来传递给其他函数
参考文章
http://www.runoob.com/python3/python3-function.html