面向过程编程和函数式编程
面向过程编程的缺点
1. 代码重复多
2. 代码可读性差
函数
1. 什么是函数?
函数就是对一项功能的封装
2. 函数的结构
比如我们计算一个字符串或列表的长度,我们可以写一个这样的函数
1 def lenth(s): # s为形参 2 """ 3 计算可迭代对象长度 4 :param s: 5 :return: 6 """ 7 count = 0 8 for i in s: 9 count += 1 10 return count
def是定义函数,下面写函数的执行语句,return是给函数的调用者返回一个或多个值,多个值以元组的形式返回
解释器遇到def是不会执行的,只有调用的时候才会执行,调用是函数名加一个括号,如lenth(l1),l1是传入的一个列表,称为实参,也就是实际传入的参数
return作用
1. 函数遇到return直接结束
2. return给函数的执行者(函数名加括号)返回值
单独return返回None
return单个值------>返回单个值,数据类型不变
return多个值------>返回以一个元组
3. 函数传参
函数的参数分为位置参数、关键字参数和混合参数
位置参数
函数可以传入多个参数,不加特别声明,就是位置参数,这些参数从左到右需一一对应
例如我们设计一个求两个数中的较大值的函数
1 def get_max(a, b): # a,b就是位置参数 2 return a if a >= b else b 3 4 5 print(get_max(2, 3))
关键字参数
1 def func(name, movie): 2 print("%s是%s中的人物" % (name, movie)) 3 4 5 func(movie="夏洛特烦恼", name="大春")
关键字参数的顺序可以颠倒
混合参数
位置参数和关键字参数可以混合使用,来看代码
1 def func(name, year, movie): # 关键字参数必须在位置参数后面,不管是在形参位置和实参位置 2 print("%s是%s中的人物,故事发生在%s年" % (name, movie, year)) 3 4 5 func("大春", 1998, movie="夏洛特烦恼")
执行结果
大春是夏洛特烦恼中的人物,故事发生在1998年
默认参数
给形参设置默认值,通常是常用的数值,可以更改,需要注意的是默认参数一定要放在位置参数的后面
1 def func(movie, actor, country="中国"): # 默认参数必须在位置参数后面 2 print("%s是在%s上映的一部电影,主角是%s" % (movie, country, actor)) 3 4 5 func("夏洛特烦恼", "夏洛", "美国") # 也可以写成country="美国",如果不写就是中国
执行结果
夏洛特烦恼是在美国上映的一部电影,主角是夏洛
默认参数这里有一个小陷阱,当默认参数是一个容器型数据类型时,那么这个数据在内存里只有一个,看一个实例
1 def func1(a, lst=[]): # 默认参数如果是一个容器型数据类型,那么这个数据在内存中只有一个 2 lst.append(a) 3 return lst 4 5 6 print(func1(666)) # [666] 7 print(func1(22)) # [666,22] 8 print(func1(33, [])) # [33]
这里的默认参数是一个空列表,当第一次添加666时,这个列表变成了[666],第二次调用func函数添加22时,系统不会重新创建一个空列表,而是沿用之前的列表,而之前的列表已经变成了[666],因此再重新添加22时就会变成[666,22]。第8行重新给默认值参数传了一个空列表,表示不用默认的列表,而是用新传入的空列表,所以结果是[33]
万能参数
两个形参参数,接收所有的位置参数和关键字参数
1 def func(*args, **kwargs): 2 print(args) # arg是以元组的形式 3 print(kwargs) # kwargs是以字典的形式 4 5 6 func(1, 2, name="Ara", age=18)
执行结果
(1, 2) {'name': 'Ara', 'age': 18}
小结
实参角度
(1)位置参数从左到右一一对应
(2)关键字参数从左到右一一对应,顺序随便
(3)混合参数,关键字参数一定要在位置参数后面
形参角度
(1)位置参数从左到右一一对应
(2)默认参数一定要放到位置参数后面
(3)万能参数接收实参角度的所有位置参数,关键字参数