函数:定义之后可以任何需要他的地方调用这个函数
如果函数没有定义返回值,用户去取函数的返回值的话,默认返回None
1.返回值的三种情况:
1.1 没有返回值
1.1.1 没写return
def func():
print(s)
s = "今天天气好"
func()
1.1.2 只写return,后面没有数值,return在函数中一旦执行了return后面的代码就不执行了
def func1():
l = ['景老板', '三毛']
for i in l:
if "三毛" in i:
return #此处return会直接跳出函数func
# break #但是break只会使这个for循环结束,如果还有别的语句在for循环以外,还会继续执行
print("函数执行最后一句")
func1()
1.2 只有一个返回值:可以返回任意数据类型
def func2():
return [1, 2, 3]
print(func2())
1.3 多个返回值:有几个返回值就应该有几个接收值
返回多个值如果只用一个值接收的话,那么就以元祖的形式接收,元祖是不可修改的数据类型
在python中默认如果一个值对应多个赋值就会转变成元组数据类型
def func3():
return 1, 2
r1, r2 =func3()
print(r1, r2)
2.参数
2.1 实参
2.1.1 位置参数:按照位置传参
def func4(a,b):
print(a,b)
func4(1, 2)
2.1.2 关键字传参,按照关键字传
def func4(a, b):
print(a, b)
func4(b=1, a=2)
2.1.3 也可以两种方法混着用,但是必须先按照位置传参,再按照关键字传参,不能给用一个变量传多个值
def func4(a, b):
print(a, b)
func4(1, b = 2)
2.2 形参
2.2.1 位置参数:必须传,有几个参数传几个值
2.2.2 默认参数:可以不传,如果不传就用默认参数,如果传了就用传入的参数
def classmate(name , sex = "男"):
print("%s : %s"%(name, sex))
classmate("jerry")
classmate("tony", "女")
classmate("alex")
特别注意:如果默认参数是一个可变数据类型,类似列表,字典那么每一次调用函数的时候,如果不传值就共用这个数据类型的资源。
# 列表示例
def func(l = []):
l.append(1)
print(l)
func()
func([2])
func()
# 字典示例
def func(k, l={} ):
l.setdefault(k, "M")
print(l)
func(1)
func(2)
func(3)
2.2.3 动态参数 : 可以接受任意多个参数,参数名之前加*,args必须在kwargs之前
(1) *args:以元祖的形式,args只是一个变量名可以改变,但是习惯使用args不能接收关键字参数
def sum (*args):
n = 0
for i in args:
n += i
return n
print(sum(1,2,2,3))
(2) **kwargs:以字典的形式存储,接收关键字参数,默认参数传入的顺序是不定的可以再动态参数以后
def func5(k=None, **kwargs):
print(k,kwargs)
func5(k=1,a=1, b=2, c=3)
func5(a=2, b=2, k=1)
func5(a=6)
2.3.4 动态参数的另一种传法
(1)针对*args,
def func6(*args): # 而站在形参的角度上,给变量加上*就是组合所有传来的值
print(args)
func6(1, 2, 3, 4, 5)
l=[1, 2, 3, 4, 5, 6]
func6(*l) # 站在实参的角度,给序列加上一个*就是将序列按顺序打散
(2)针对**kwargs
def func7(**kwargs):
print(kwargs)
d={"a":1, "b":2}
func7(**d)
3.函数的注释:
def func():
'''
这个函数实现了什么功能
第一个参数的意义
第二个参数的意义
:return:是字符串或者列表的长度
'''
pass