一、函数
-
什么叫做函数
-
就是将一个代码块封装成一个函数,然后重复进行调用的话
1、函数的定义和调用
-
def 关键字定义函数
-
函数名 就是调用了,必须调用了函数,才能起作用
-
先定义后调用
def get_sum(n):result=0for i in range(1,n+1):result+=iprint(f"和为{result}")get_sum(100)
2、函数的参数
1、位置参数
-
就是调用函数的时候,传入参数,必须按照一定的位置进行传入
-
按照一定的顺序进行传入,有几个形参就传入几个参数
def user_name(name, age):print(f"我的名字是{name},年龄是{age}")user_name("qq", 11)
2、关键字参数
- 顺序可以不一样
def user_name(name, age):print(f"我的名字是{name},年龄是{age}")user_name(age=10,name="rrr")
- 位置参数和关键字传参可以一起使用,但是这个位置参数必须放在最前面,关键字参数是在后面的
3、默认值参数
-
在函数定义的时候,直接对形参进行赋值了
-
如果在调用的时候不赋值的话,将使用默认值
-
如果赋值了的话,则使用传递的值
# 没有传参
def user_name(name, age=18):print(f"我的名字是{name},年龄是{age}")user_name("qqq")
4、可变参数
1、个数可变的位置参数
-
参数是一个元组
-
也就是这个位置参数的参数是可变的,取决于调用的时候传入了多少个
def fun(*area): # *变量名 是一个元组,可以传入多个参数print(type(area))for i in area:print(i)fun(1,2,3) # 传入到元组中去
fun([1,2,3]) # 会将整个列表作为一个元素传入到元组中,相当于是一个元素
fun(*[1,2,3]) # 在调用的时候 * 会将列表中的每一个元素作为一个参数传入到元组中去# 输出结果为
<class 'tuple'>
1
2
3
<class 'tuple'>
[1, 2, 3]
<class 'tuple'>
1
2
3
2、个数可变的关键字参数
-
传入到是一个字典存储
-
关键字参数也是可变的,取决于调用的时候能传入多少个
def fun(**keywords):print(type(keywords))for key,value in keywords.items():print(key,"---",value)fun(name="qq",age="18") # 接受的是一个键值对的方式
d={"name":"qq","age":"18"} # 如果想要传入一个字典的话,需要**来进行解析
# fun(d) # 不使用的话,会报错
fun(**d)
3、函数的返回值
-
return 返回值,返回到函数的调用的地方
-
没有return的话,函数的返回值为none
def fun(a,b):s=a+breturn s # 这个s返回到函数调用的地方result=fun(1,3) # 返回到函数调用的地方,赋值给了result变量
print(result)
- 可以返回多个值,但是一个变量接收的话,就是一个元组类型来存储多个返回值
def fun(n):ji_shu=0ou_shu=0sum_shu=0for i in range(1,n+1):if i%2 !=0:ji_shu+=ielse:ou_shu+=isum_shu+=ireturn ji_shu,ou_shu,sum_shu
result=fun(10)
print(type(result))
print(result)# 输出结果为
<class 'tuple'>
(25, 30, 55)
4、变量的作用域
1、局部变量
-
在函数内部定义的变量
-
仅在函数的内部,函数执行结束后,这个局部变量的生命周期也会结束
-
当局部变量和全局变量名字一样的时,局部变量的优先级高
def fun(a,b):s=a+breturn sresult = fun(1,2) # 函数调用后,这个局部变量会被销毁print(result)
2、全局变量
-
在函数外面定义的变量,或者是在函数内部使用global关键字定义的变量
-
作用于整个程序,程序结束后,生命周期结束
-
全局都有用,可以在函数的内部参与运算
-
在函数内部使用global 变量,这个变量就是全局变量
s=100
def fun(a,b):sum=s+a+breturn sumresult = fun(1,2)print(result)# 输出结果为
103# 当局部变量和全局变量名字一样时
s=100
def fun(a,b):s=200 # 局部变量的优先级高于全局变量,在名字相同的时候sum=s+a+breturn sumresult = fun(1,2)print(result)# 输出结果为
203# 函数内部 global关键字定义变量def fun(a,b):global s # s这个变量为全局变量s=200 # 对其进行赋值sum=s+a+breturn sumresult = fun(1,2)print(result)
print(s)
s=100 # 在外面可以进行修改这个变量的值
print(s)# 输出结果为203
200
100
5、匿名函数
-
lambda函数
-
是指没有名字的函数,这个函数只能使用一次
-
一般是在函数的函数体只有一句代码且只有一个返回值的时候,可以使用匿名函数来简化
def fun(a,b):return a+b
result=fun(1,2)
print(result)# 上面代码可以简化成这样的,也就是只有一个返回值的时候使用,lamba匿名函数s=lambda a,b:a+b # a,b是参数,: 后面是操作 s是函数名
print(type(s))
print(s(1,2)) # 调用函数名s la = [1,2,3,4,5]
for i in range(len(la)):result = lambda x:x[i] # 传入是一个列表s = result(la)print(s)#输出结果为1
2
3
4
5student_scores=[{"name":"qq","score":100},{"name":"oo","score":90},{"name":"ww","score":95},
]# 按照这个key的查找来进行排序,降序的方式来查找
# x 是字典,x.get 取出这些成绩,按照这个成绩来进行排序# 字典是可变的数据类型student_scores.sort(key=lambda x:x.get("score"),reverse=True)
print(student_scores)# 输出结果为
[{'name': 'qq', 'score': 100}, {'name': 'ww', 'score': 95}, {'name': 'oo', 'score': 90}]
6、递归的操作
-
自己调用自己
-
有一个终止条件
# 计算一个数的阶乘def fun(n):if n==1: # 终止条件return 1else:return n*fun(n-1) # 自己调用自己print(fun(4))
二、内置函数
总结
- 位置参数和关键字参数同时存在的时候,位置参数是在最前面的,关键字参数是在后面的
案例
1、10个元素,使用函数求出这个列表中元素的最大值
2、编写函数实现提取字符串中的数字并求出和
- 输入一个字符串,有数字和字母的
3、实现字符串中的字母大小写转换
-
小写字母转换成大写
-
大写字母转换成小写