又是一的开始,也是学习的一天的开始
今天继续函数的学习
1.1 函数传参的两种形式
def func(a, b, c):
print(f'a: {a}')
print(f'b: {b}')
print(f'c: {c}')
# 位置传参,按照形参的位置顺序将实参的值传递给形参
func(1, 2, 3) # a: 1 b: 2 c: 3
# func(3, 1, 2) # a: 3 b: 1 c: 2
# 关键字传参,指定实参给到哪个形参 , 注意点 :关键字必须是函数的形参名
func(a=10, b=20, c=30) # a: 10 b: 20 c: 30
# 混合使使用,先写位置传参,再写关键字传参
func(10, b=20, c=30) # a: 10 b: 20 c: 30
# func(a=10, 20, 30) # 代码会报错
# func(10, a=30, b=20) # 代码会报错
1.2 函数的形参
1.2.1 缺省参数
# 缺省参数形参,在函数定义的时候,给形参一个默认值,这个形参就是缺省参数
# 注意点: 缺点参数要写在普通参数的后边
# 特点: 在函数调用的时候,如果给缺省参数传递实参值,使用的是传递的实参值.如果没有传递,使用默认值
def func(a, b, c=10):
print(f'a: {a}')
print(f'b: {b}')
print(f'c: {c}')
func(1, 2) # a:1 b:2 c:10 没有给c 传递实参,使用默认值10
func(1, 2, 3) # a:1 b:2 c:3 给c传递实参值, 使用传递的数据3
# def func1(a=1, b, c): 代码报错,语法错误
# pass
1.2.2 不定长参数
def func(args, kwargs): # 两个普通的参
print(args)
print(kwargs)
func(1, 2) # 1 2
func(args=2, kwargs=1) # 2 1
print('*' * 30)
# 在形参前加上一个* .该形参变为不定长元组.可以接收所有的位置实参,类型是元组
# 在形参前边加上两个** , 该形参变为不定长字典形参,可以接收所有的关键字实参,类型是字典
def func(*args, **kwargs):
print(args)
print(kwargs)
func(1, 2, 3, 3, 4, 5) # (1, 2, 3, 3, 4, 5)
func(a=1, b=2, c=3, d=4) # {'a': 1, 'b': 2, 'c': 3, 'd': 4}
func(1, 2, 3, a=4, b=5, d=6) # (1, 2, 3) {'a': 4, 'b': 5, 'd': 6}
1.2.3 函数形参的完整格式
# 普通新参 缺省形参 不定长元组形参 不定长字典形参
def func(a, b=1): # a
pass
def func1(a, b=1, *args): # 语法上不会报错,但是缺省参数不能使用默认值
print('a', a)
print('b', b)
print(args)
def func2(a, *args, b=1):
print('a', a)
print('b', b)
print(args)
def func3(a, *args, b=1, **kwargs):
pass
# func1(1, 2, 3, 5 )
# func2(1, 2, 3, 5 )
func2(1, 2, 3, 4, b=10)
2.1 拆包
# 组包,将多个数据值,组成元组 ,给到一个变量
a = 1, 2, 3
print(a) # (1, 2, 3)
def func():
return 1, 2 # 组包
# 拆包:将容器的数据分别给多个变量 ,需要注意: 数据的个数和变量的个数要保持一致
b, c, d = a # 拆包
# print(b, c, d ) # 1 2 3
e, f = func()
print(e, f) # 1 2
my_list = [10, 20]
a, b = my_list
print(a, b) # 10 20
my_dict = {'name': 'isaac', 'age': 18}
a, b = my_dict # key值
print(a, b) # name age
3.1 引用
可以使用 id() 查看变量的引用 , 可以将id 值认为时内存地址的别名
# python 中数据值的传递的是引用
# 赋值运算符可以改变变量的引用
# 将数据10 存储到变量 a 中 , 本质是将数据 10 所在内存的引用地址保存到变量a中
a = 10
# 将变量a 中保存的引用地址给给到b
b = a
print(a, b) # 使用print 函数打印变量 a 和 b 引用中存储的值
print(id(a), id(b))
a = 20
print(a, b)
print(id(a), id(b))
my_list = [1, 2, 3] # 将列表的引用地址保存到变量 my_list 中
my_list1 = my_list # 将 my_list 变量中存储的引用地址给到 my_list1
print(my_list, id(my_list)) # [1, 2, 3] 1815421090240
print(my_list1, id(my_list1)) # [1, 2, 3] 1815421090240
my_list.append(4) # 向列表添加数据4 将数据4 的引用 保存到列表中
print(my_list, id(my_list))
print(my_list1, id(my_list1))
my_list[2] = 5
print(my_list, id(my_list))
print(my_list1, id(my_list1))
4.1 可变与不可变类型
# 类型的可变与不可变:在不改变变量引用的前提下, 能否改变变量中引用中的数据
# 如果能改变是可变类型 ,如果不能改变 ,是不可变类型
# int float bool str list tuple dict
# 不可变类型: int float bool str tuple
# 可变类型: list dict
a = 1000
b = 1000
print(id(a), id(b)) # python中的内存优化, 对于不可变类型进行的
print(id(a) == id(b)) # True
5.引用做函数参数注意点
# 函数传参传递的也是引用
my_list = [1, 2, 3] # 全局变量
def func1(a):
a.append(4)
def func2():
# 为啥不加global, 因为没有修改 my_list 中存的引用值
my_list.append(5)
def func3():
global my_list
my_list = [1, 2, 3] # 修改全局变量的值
def func4(a):
# += 对于列表来说,类似列表的extend方法,不会改变变量的引用地址
a += a # a = a + a, 修改了a变量a的引用
# print(a)
func1(my_list) # [1, 2, 3, 4]
func2() # [1, 2, 3, 4, 5]
func3() # [1, 2, 3]
print(my_list)
b = 10 # 不可变类型
func4(b)
print(b) #
func4(my_list)
print(my_list) # [1, 2, 3, 1, 2, 3]
6.1 函数应用 -学生管理系统
# 定义学生列表,保存所有的学生信息
stu_list = []
def show_menu():
print('1. 添加学生')
print('2. 删除学士')
print('3. 修改学生信息')
print('4. 添加学生信息')
print('5. 查询所有的学生信息')
print('6. 推出系统')
def insert_student():
# 1.通过input 函数获取学生的信息, 姓名 , 年龄 ,性别
name = input('请输入学生名字:')
# [{}, {}, {} ] 判断的是字典中的value 是否存在
for stu in stu_list:
if stu['name'] == name:
print('学生信息存在')
return # 结束函数的执行
age = input('请输入学生年龄:')
gender = input('请输入学生性别:')
# 2.将学生信息转换为字典进行保存
stu_dict = {'name': name, 'age': int(age), 'gender': gender}
# 3.将这个学生字典添加的列表中
stu_list.append(stu_dict)
print('==============学生信息添加成功====================')
def remove_student():
# 1.使用 input 获取要删除 / 修改 /查询 的学生姓名
name = input('请输入要操作的学生的名字:')
# 2。判断学生信息是否存在
for stu in stu_list:
if stu['name'] == name:
# 3.学生存在,对学生进行 删除 / 修改 /查询 的学生姓名
stu_list.remove(stu)
break
# 4.学生信息不存在 ,直接结束
else:
print('***********该学生信息不存在,无法删除**************')
def modify_student():
# 1. 使用 input 获取要删除 /修改/查询 的学生姓名
name = input('请输入要操作的学生的名字')
for stu in stu_list:
if stu['name'] == name:
# 3. 学生存在,对学生进行 删除 /修改/查询 操作
stu['age'] = int(input('请输入新的年龄'))
break
else:
print('***********该学生信息不存在,无法修改**************')
def search_student():
# 1. 使用 input 获取要删除 /修改/查询 的学生姓名
name = input('请输入要操作的学生的名字')
# 2. 判断学生信息是否存在
for stu in stu_list:
if stu['name'] == name:
print(f'姓名:{stu["name"]}, 年龄:{stu["age"]}, 性别:{stu["gender"]}')
break
else:
print('***********该学生信息不存在**************')
def show_all_info():
if len(stu_list) > 0:
for stu in stu_list:
print(f'姓名:{stu["name"]}, 年龄:{stu["age"]}, 性别:{stu["gender"]}')
else:
print('目前没有学生信息')
def main():
while True:
show_menu()
opt = input('请输入用来选择的操作编号:')
if opt == '1':
# 添加学生
insert_student()
elif opt == '2':
# 删除学生
remove_student()
elif opt == '3':
# 修改学生信息
modify_student()
elif opt == '4':
# 查询带个学生信息
search_student()
elif opt == '5':
show_all_info()
elif opt == '6':
print('欢迎下次使用本系统....')
break
else:
print('输入有误,请再次输入')
continue
input('...回车继续操作.....')
main()
有什么更好的学习方法也介绍给我认识一下?