函数是组织好的,可重复使用的,用来实现相关功能的代码块
python中有许多内置函数如print()等等,当然也可以自定义函数
定义一个函数
1.函数代码块以 def 关键词开头。
2.函数中可以传入参数。
3.函数可以有返回值也可以没有,返回值用关键字return,当运行到return则结束函数并返回一个值,如果不写默认为None.
举个栗子
def func():
# 以冒号结尾 括号中可以传参数
b=1+2 # 代码块 需要缩进
print("已运行") # 判断函数是否运行
return b # 这个函数运行后会得到一个返回值b
调用函数
>>func()
>>已运行 # 从这里可以看出函数已经运行
> #但是并没有得到我们想要的值
> #这时候我们需要获得函数的返回值
获得函数返回值
a=func() # 将返回值赋值给一个变量
print(a) # 打印变量
print(func()) # 直接打印函数的返回值
结果
已运行
3
已运行 # 可以看出我们取到了我们要的返回值
3
若没有return 返回None
这两个print结果都是None
a=1
def fun(x):
x * 2
print(fun(a))
# a=1
# def fun(x):
#
# x*2
# return
# print(fun(a))
函数的参数传递
- 不可变类型:类似按值传递,如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。若在 fun(a)内部修改 a的值,只是修改另一个复制的对象,不会影响 a本身。
a=1
def fun(x):
x=x+1 # 按值传递
print(x)
fun(a)
print(a)
结果
2
1
fun(a)
print(a)
- 可变类型:类似引用传递,如 列表,字典。如 fun(y),则是将 y 真正的传过去,修改后fun外部的y也会受影响
a=["haha","lala"]
def fun(x):
x.append(";;") # 按引用传递
print(x)
fun(a)
print(a)
结果
['haha', 'lala', ';;']
['haha', 'lala', ';;']
函数的参数
- 普通参数
- 默认参数
- 关键字参数
- 不定长参数
普通参数
可以有多个,参数位置都要一 一对应,不传会报错
def func(参数1,参数2,.....)
函数体
#调用
func(a1,a2,a3...)
函数名(value1,value2,......)
a="张三"
b="王五"
c="李四"
def func(x,y,z): #参数位置要对应 若改变则结果也会改变
print(x,"是猪")
print(y,"是牛")
print(z,"是羊")
func(a,b,c)
#输出结果
张三 是猪
王五 是牛
李四 是羊
默认参数
调用函数时,默认参数的值如果没有传入,则被认为是默认值。
def func(p1=v1,p2=v2.....)
函数体
#调用1
func(a1=b1,a2=b2)
a="张三"
b="王五"
def func(x,y,z="李四"):
print(x,"是猪")
print(y,"是牛")
print(z,"是羊")
func(a,b) # 这里没有传入z的参数李四,于是函数用了默认值
#结果
张三 是猪
王五 是牛
李四 是羊
a="张三"
b="王五"
c="吴六"
def func(x,y,z="李四"):
print(x,"是猪")
print(y,"是牛")
print(z,"是羊")
func(a,b,c) # 这里传入了 吴六 于是函数使用了传入的值
#结果
张三 是猪
王五 是牛
吴六 是羊
关键字参数
使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
def func(p1=v1,p2=v2.....)
函数体
#调用1
func(a1=b1,a2=b2...)
#调用2
def func(age,name,height):
print("name:", name)
print("age:",age)
print("height:",height)
func(height=150,name="啦啦",age=18) # 按照关键字 与顺序无关
不定长参数
把没有位置,不确定的参数,放入一个特定的数据结构中。
def func(*args): # 注意 *符号是必要的
函数体
#调用
name(p1,p2,p3......)
def func(**kwargs): # 注意 *符号是必要的
函数体
#调用
name(a1=b1,a2=b2....)
def func(*args): # 这里没有定义具体参数 *args 会将收集的参数以元组形式存放
print(args) # 函数内调用可以不用加*
print(type(args))
func(1,2,3,4,5,6,7)
# 运行结果
(1, 2, 3, 4, 5, 6, 7) # 将所有给的参数都打印出了
<class 'tuple'> # 元组类型
def func(**kwargs): # **kwrags 会将收集的参数以字典形式存放
print(kwargs)
print(type(kwargs))
func(a="A",b="B",c="C")
# 运行结果
{'a': 'A', 'b': 'B', 'c': 'C'}
<class 'dict'> # 字典类型
不定长参数可以和其他参数共存,但是要注意位置,args和kwargs配合使用时*args要在前面
def func(ar,*args,arg=150,**kwargs): #栗子
print(ar,arg,args,kwargs)
func(1,2,"3",4,4,a="A",b="B")
# 运行结果
1 150 (2, '3', 4, 4) {'a': 'A', 'b': 'B'}