本篇文章重点讲解 Python 函数 的以下内容:
定义函数语法、调用函数、函数参数、参数的传递方式、参数的类型、可变参数、函数的返回值、函数说明文档、作用域 。
大家也可参照我的另一篇博客,是有关python函数的拓展,有关本章的匿名函数,在这篇文章也有深入解析:Python 之 高阶函数
函数定义语法:
def 函数名(参数):
'''函数文档说明'''
函数体
return 返回值
eg:定义两个数求和的函数
def sum(a,b):
return a+b
注意:必须先定义函数,然后再调用该函数
函数调用:
直接使用函数名,再跟上参数的值即可。
eg:
#调用上面定义好的函数sum
result=sum(1,2)
结果为:result为3
函数参数:
情况1:函数定义的参数的个数必须和调用函数传入的值个数保持一致
情况2:如果指定了函数的参数,在调用函数的时候,没有传入相对应的值,则会出错
情况3:在没有传入函数值的情况下,可以对函数参数设置默认值
eg:
#在定义函数时候,指定参数的默认值
def sum(a=1,b=1):
return a+b
#调用函数,传递参数
sum(2,3):有参数传递,结果为5
sum():没有参数传递,结果为2
函数参数的传递方式:
方式1:位置参数,以正确的顺序传入函数,调用时的数量必须和声明时一样
方式2:关键字参数,允许函数调用时参数的顺序和声明时不一致
#位置参数
sum(1,2):调用后a=1,b=2
#关键字参数
sum(b=1,a=2),调用后a=2,b=1
函数参数类型:
在Python函数中,参数的类型可以是任意类型
eg:
#定义函数
def test(a):
#调用函数
a可以为任意类型,可以为number,也可以为String,可以为List、Tuple、set、Dictionary都可以
函数可变参数:
在某些情况下,函数的参数的个数是不固定的。可以传入参数,也可以选择不传递参数,可以传递一个参数,也可以传递多个,参数为元组类型或字典类型,语法格式:
def 函数名(*参数名):
eg:求多个值的和
def sum(*a):
sum=0
for i in a:
sum+=i
return sum
函数返回值:
语法:
return 结果
注意:返回结果可以是一个值、多个值,也可以是另外一个函数
def sum(*a):
sum=0
for i in a:
sum+=i
def dayin():
print(f"计算的结果为:{sum}")
return dayin()
sum(1,2,3)
函数的说明文档:
类似Java中的每个方法都会有个说明,说明该方法的作用,在Python函数中,定义函数说明格式如下:
在函数的第一行写上:
'''
函数文档说明
'''
eg:
def sum(a,b):
'''
这是一个求两个数之和的函数
参数有两个
'''
return a+b
查看可以使用help()函数,比如查看sum()
help(sum)
作用域:
变量的作用域分为两种:
全局作用域
函数作用域
全局作用域 :不能调用函数作用域中的变量,但是函数作用域可以调用全局作用域中的变量;
若在函数作用域中修改全局作用域中的值,必须使用global 声明
eg:
a=1 #全局作用域
def sum():
b=2 #局部作用域
global a #声明a为全局作用域
a=2 #直接改a的值会出错
递归:函数内部调用函数本身
# 求某个数以内的和
def test(num):
if num == 1:
return 1
return num + test(num - 1)
# 调用递归函数
print(test(100)) # 5050
匿名函数:如果函数有一个返回值,并且只有一句代码,可以用lambda简化
lambda 表达式:
语法:
变量名 = lambda 参数列表 : 表达式/返回值 注意:参数可以省略
参数形式:
无参数
一个参数
默认参数
可变参数:*args 、**kwargs
带判断的lambda:
返回值中使用三元运算符
列表内字段数据进行排序的语法:
列表.sort(key = lambda x:x['排序的列'])
列表.sort(key = lambda x:x['排序的列'],reverse=True)
本章代码:
# 函数:
sa = """
定义函数:
语法:
deg 函数名():
代码
调用函数:
语法:
函数名()
注意:在Python中,函数必须先定义,后调用
"""
print(sa)
def say():
print("俺正在说话")
# 使用lambda表达式简化上面函数
say = lambda: "俺再一次说话"
# print(say())
sb = """
函数参数:
语法:
def 函数名(参数名1,参数名2):
代码
调用有参函数:
语法:参数名(参数值1,参数值2)
注意:
形参:参数名1,参数名2
实参:参数值1,参数值2
"""
print(sb)
# 带参数的函数
def eat(what):
print(f"你们正在吃{what}")
eat = lambda what: f"你们正在吃{what}"
# print(eat("螺蛳粉"))
sc = """
参数的传递方式:
1、位置参数
调用函数时根据函数定义的参数位置来传递参数
注意:传递和定义参数的顺序、个数必须一致
2、关键字参数
函数调用,通过“键=值” 形式加以指定
3、缺省参数
默认参数,用于定义函数时,为参数提供默认值,调用函数时可不传该默认参数的值
4、不定长参数(可变参数)
包裹位置传递
语法:
def 函数名(*args):
代码
包裹关键字传递
语法:
def 函数名(**kwargs):
代码
"""
print(sc)
# 定义带两个参数的函数
def test(a, b=222):
print(f"a={a}")
print(f"b={b}")
test = lambda a,b=222: f"a={a},b={b}"
# print(test(111))
# 带条件的lambda
test7 = lambda a,b : a if a > b else b
print(test7(22, 44))
# 求1,2,3内的和,用lambda实现
test8 = lambda *args: sum(args)
# print(test8(1, 2, 3))
# 定义可变参数1,参数是元组类型
# 多个值的和
def test1(*args):
"""这是一个求多个值和的函数"""
sum = 0
for i in args[0]:
sum += i
else:
# print(f"和为{sum}")
# 返回值
return sum
# 定义可变参数2:
# 参数为字典类型
def test2(**kwargs):
for k, v in kwargs.items():
print(k, v)
# 返回值为多个
def test3(a, b, c):
"""
这是一个测试函数,测试函数为多个返回值
:param a: 值1
:param b: 值2
:param c: 值3
:return: 返回多个值
"""
a += 100
b += 100
c += 100
return a, b, c
# 计算多个值的平均值
def test4(*args):
sum = test1(args)
return sum / len(args)
# 测试变量范围
a = 222 # 全局变量
def test5():
# 在函数内部修改全局变量的值
# 必须声明 变量为全局变量
global a
a = 333
print(f"函数内:{a},地址为:{id(a)}")
# 递归:函数内部调用函数本身
# 求某个数以内的和
def test6(num):
if num == 1:
return 1
return num + test6(num - 1)
# 调用递归函数
# print(test6(100))
# print(f"函数外:{a},地址为:{id(a)}")
# test5()
# print(f"函数外:{a},地址为:{id(a)}")
# 调用函数:必须放在定义函数的后面
# say()
# 调用有参的函数
# eat("辣椒炒尖椒")
# 调用参数:1.位置方式
# test(11, 22)
# 2.关键字方式
# test(b=22, a=11)
# 3.缺省参数(默认值)
# 注意:有默认值的参数必须放在没有默认值参数的后面
# test(11, 22)
# 调用可变参数1
# print(test1(1, 2, 3))
# 调用可变参数2
# test2(name="罗旺", age=19)
# 调用返回值为多个值的函数
# print(test3(20, 10, 30))
# 查看函数的说明文档
# help(test3)
# 函数嵌套
# print(test4(1, 2, 3))
# 使用lambda对字典列表进行排序
persons = [
{"name": "张三", "age": 22},
{"name": "A罗旺", "age": 12},
{"name": "王五", "age": 23},
{"name": "赵六", "age": 2}
]
persons.sort(key= lambda person:person["name"], reverse=True)
print(persons)
"""
需求:员工管理系统
功能:
1.添加员工信息
2.删除员工信息
3.修改员工信息
4.查看单个员工信息
5.查看所有员工信息
6.退出
技术:函数、数据类型(字典列表)、循环、条件语句
"""
emps = [
{"id": "001", "name": "魏无羡", "gender": "男", "age": "19"},
{"id": "002", "name": "蓝忘机", "gender": "男", "age": "20"},
{"id": "003", "name": "江晚吟", "gender": "男", "age": "19"}
]
"""选择功能列表"""
def chocieFunc():
print("*" * 30)
print("\t^V^ 1.添加员工信息")
print("\t^V^ 2.删除员工信息")
print("\t^V^ 3.修改员工信息")
print("\t^V^ 4.查看单个员工信息")
print("\t^V^ 5.查看所有员工信息")
print("\t^V^ 6.退出")
print("*" * 30)
"""添加员工信息"""
def addEmp():
id = input("\n\t\t\t\t请输入要添加的员工编号:")
name = input("\n\t\t\t\t请输入要添加的员工姓名:")
gender = input("\n\t\t\t\t请输入要添加的员工性别:")
age = input("\n\t\t\t\t请输入要添加的员工年龄:")
emp = {"id": id, "name": name, "gender": gender, "age": age}
emps.append(emp)
print("\n\t\t\t\t添加OK ^V^ !\n")
"""删除员工信息"""
def delEmp():
id = input("\n\t\t\t\t请输入要删除的员工编号:")
for emp in emps:
if emp.get("id") == id:
# 将emp删除,从emps
emps.remove(emp)
print("\n\t\t\t\t删除OK ^V^ !\n")
break
else:
print("\n\t\t\t\t查无此人,请输入正确的员工编号!!\n")
"""修改员工信息"""
def updateEmp():
id = input("请输入要修改的员工编号:")
for emp in emps:
if emp["id"] == id:
# 特别注意
emp["name"] = input(f"\n\t\t\t\t请输入要修改后的员工姓名(原来姓名:{emp['name']}):")
emp["gender"] = input(f"\n\t\t\t\t请输入要修改后的员工性别(原来性别:{emp['gender']}):")
emp["age"] = input(f"\n\t\t\t\t请输入要修改后的员工年龄(原来年龄:{emp['age']}):")
# emp = {"id": id, "name": name, "gender": gender, "age": age}
# 先删除原有的emp,在追加新的emp【不推荐】
print("\n\t\t\t\t修改成功 ^V^ !!!\n")
break
else:
print("\n\t\t\t\t查无此人,请输入正确的员工编号!!\n")
"""查看单个员工信息"""
def getEmpById():
id = input("\n\t\t\t\t请输入要查询的员工编号:")
for emp in emps:
if emp["id"] == id:
print("\n\t\t\t\t编号\t姓名\t性别\t年龄")
print(f"\n\t\t\t\t{emp['id']}\t\t{emp['name']}\t {emp['gender']}\t\t{emp['age']}\n")
break
else:
print("\n\t\t\t\t查无此人,请输入正确的员工编号!!\n")
"""查看所有员工信息"""
def getAllEmps():
print("\n\t\t\t\t编号\t姓名\t性别\t年龄")
for emp in emps:
print(f"\n\t\t\t\t{emp['id']}\t\t{emp['name']}\t {emp['gender']}\t\t{emp['age']}")
else:
print(f"\n\t\t\t\t共查询到{len(emps)}条数据\n")
print("\n\t\t******欢迎使用员工管理系统******")
while True:
chocieFunc()
num = int(input("\n\t\t请输入指令:"))
if num == 1:
addEmp()
elif num == 2:
delEmp()
elif num == 3:
updateEmp()
elif num == 4:
getEmpById()
elif num == 5:
getAllEmps()
elif num == 6:
print("\n\t\t\t\t\t\t\t\t ^V^ 欢迎下次再来 ^V^ ")
break
else:
print("\n\t\t请输入正确的指令")