Python基础之day04-函数
文章目录
代码仓库地址: https://gitee.com/andox_yj/python
一、函数的介绍,定义,调用
-
介绍:当遇到某段代码需用重复用到时,就可以把该段代码封装成一个小的功能模块,在使用的时候可以重复调用
这就是函数。函数能提高应用的模块性,和代码的重复利用率。 -
注意:函数内的代码在每次重新调用的时候都会重头执行
""" # 定义函数:函数名定义规范,一般为单词字母小写,多个单词之间用_下划线连接 def 函数名(): 代码 # 调用函数: 函数名() # 定义一个输出个人信息的函数 def info(): print("姓名:Andox") print("年龄:18") print("性别:男") # 调用函数,执行函数内的代码,可重复调用 info() info()
二、带参数的函数
-
介绍:带有参数的函数就是当调用函数的时候,需要给函数一些变量,值或者是对象,就可以把这些当做参数传给函数定义函数时,需要几个参数,就在()括号里写入几个接收参数的变量名,在函数内的代码里直接使用该变量即可。此时里接收的叫做"形参"
def info(name, age, gender): print(name) print(age) print(gender) # 调用函数方法1:传入与函数定义接收的数量一致的数据给函数。此时这里传入的叫做"实参" info("Andox", "18", "男") # 调用函数方法2:直接指定参数接收的是那个数据,此时与上面调用的结果一样。 info(name="Andox", age="18", gender="男") """ 注意: 1.定义时小括号中的参数,用来接收参数用的,称为 “形参” 2.调用时小括号中的参数,用来传递给函数用的,称为 “实参” 3.形参与实参的数量必须相等,如果没赋值指定参数的话,需要按照位置顺序数量来填写。 4.多传会报错,少传,如果函数内不使用就不会报错,如果使用了没传的参数,就会报错。 5.赋值传递参数的时候,位置可以发生变化。 """
-
函数的参数类型:位置参数,可变参数,关键字参数
# 1.位置参数:按照从左向右的位置依次传入,叫位置参数 def info(name, age): print(name) # Andox print(age) # 18 info("Andox", 18) # 2.可变参数:在变量名前加*号,该变量会存放所有未命名的变量参数,该变量在函数内为元组,通常名称伟*args def info(*args): print(args) # ('Andox', 18) info("Andox", 18) # 3.关键字参数:在变量名前加两个*号,该变量会接收key=value的参数, 该变量在函数内为字典.通常命名为**kwargs def info(**kwargs): print(kwargs) # {'name': 'anem', 'age': 18} info(name="anem", age=18) # 一般参数对位置顺序为:位置参数-->可变参数-->关键字参数 def info(name, *args, **kwargs): print(name) # Andox print(args) # (18,) print(kwargs) # {'gender': '男'} info("Andox", 18, gender="男")
三、带返回值的函数
-
函数返回值:函数返回值就是在调用函数后需要函数给反馈一个结果。所以就需要使用带有返回值的参数
-
注意:接收函数返回值的变量可以与函数内定义的变量相同。
每个函数内只能有一个return,if-else除外。return后面可以不返回内容,当做函数的停止。# 1.定义带有返回值的函数,在函数最后添加return关键字来把函数执行后的结果返回出去 def count(): num = 1 + 2 return num # 2.在调用函数时,需要使用一个变量来接收函数的返回值,书写规范为:变量 = 函数() num = count() print(num)
四、函数的嵌套调用
介绍:既在函数里面调用了另外一个函数
def function1():
print("函数1执行")
def function2():
print("函数2开始执行")
function1()
print("函数2执行结束")
function2()
"""
调用函数2的时候,当函数2里面执行又遇到了函数1,
# 则会执行到函数1调用的位置后,去执行函数1。当函数1执行完后,接着回来执行函数2剩余的代码。
执行顺序:
函数2开始执行
函数1执行
函数2执行结束
"""
五、局部变量与全局变量
- 定义在函数内的就是局部变量,使用范围从:定义开始到函数结束
- 定义在函数外面的就是全局变量,使用范围从:定义开始到程序结束
- 可以将函数内的变量修改为全局变量,使用范围从:定义开始到程序结束。
""" 定义方法:在函数内定义变量前,先用global声明该变量为全局变量 global 变量名 变量名 = 值 """ num = 10 # 定义全局变量 def info(): age = 10 # 定义局部变量 global name # 声明全局变量 name = "Andox" info() print(name) # Andox
- 注意:
- 如果外面有同名的变量定义在该调用该函数之前,则在运行到该函数的全局声明是,会修改外面的函数
- 如果外面没有定义同名的变量,如果想在外面使用,必须要在调用该函数之后才能使用该变量
六、拆包
# 1.对函数返回值进行拆包
def info():
high = 175
weight = 120
age = 18
return high, weight, age
high, weight, age = info() # 拆包
print(high, weight, age) # 175 120 18
# 2.对列表的拆包
a, b = [1, 2]
print(a, b) # 1 2
# 3.对元祖的拆包
a, b = (3, 4)
print(a, b) # 3 4
# 4.对字典的拆包:注意拆出来得到的是key
a, b = {"a": 1, "b": 2}
print(a, b) # a b
七、引用
引用介绍:
使用id()来查看数据储存在内存中的地址,变量名实际储存的是数据在内存中的地址,
我们可以通过这边地址访问到储存在内存中的变量。而我们传递变量时,其实是把该变量
的引用(变量储存在内存中的地址)传递出去。
a = 100
b = [1, 2]
c = (1, 2)
d = {"name": "Andox"}
print(id(a)) # 4321048320
print(id(b)) # 140495662574720
print(id(c)) # 140495643250240
print(id(d)) # 140495643211776
可变类型与不可变类型是指:如果能直接修改那么就是可变,否则是不可变
可变类型有: 列表、字典、集合
不可变类型有: 数字、字符串、元组,
当变量为不可变类型时,对其修改,其实是把修改后的新数据地址,重新储存在该变量名中
当变量为可变类型时,对其修改,是在内存原来的位置进行修改
# 不可变类型
a = 10
print(id(a)) # 4403084224
a += 1
print(id(a)) # 4403084256 #修改后地址改变
# 可变数据类型
b = [1]
print(id(b)) # 140476780873152
b.append(2)
print(id(b)) # 140476780873152 # 修改后地址不变
八、函数案例-学生管理系统
import time
import os
# 定一个列表,用来存储所有的学生信息(每个学生是一个字典)
info_list = []
def print_menu():
print("---------------------------")
print(" 学生管理系统 V1.0")
print(" 1:添加学生")
print(" 2:删除学生")
print(" 3:修改学生")
print(" 4:查询学生")
print(" 5:显示所有学生")
print(" 6:退出系统")
print("---------------------------")
def add_new_info():
"""添加学生信息"""
global info_list
new_name = input("请输入姓名:")
new_tel = input("请输入手机号:")
new_qq = input("请输入QQ:")
for temp_info in info_list:
if temp_info['name'] == new_name:
print("此用户名已经被占用,请重新输入")
return # 如果一个函数只有return就相当于让函数结束,没有返回值
# 定义一个字典,用来存储用户的学生信息(这是一个字典)
info = {}
# 向字典中添加数据
info["name"] = new_name
info["tel"] = new_tel
info["qq"] = new_qq
# 向列表中添加这个字典
info_list.append(info)
def del_info():
"""删除学生信息"""
global info_list
del_num = int(input("请输入要删除的序号:"))
if 0 <= del_num < len(info_list):
del_flag = input("你确定要删除么?yes or no")
if del_flag == "yes":
del info_list[del_num]
else:
print("输入序号有误,请重新输入")
def modify_info():
"""修改学生信息"""
global info_list
modify_num = int(input("请输入要修改的序号:"))
if 0 <= modify_num < len(info_list):
print("你要修改的信息是:")
print("name:%s, tel:%s, QQ:%s" % (info_list[modify_num]['name'],
info_list[modify_num]['tel'], info_list[modify_num]['qq']))
info_list[modify_num]['name'] = input("请输入新的姓名:")
info_list[modify_num]['tel'] = input("请输入新的手机号:")
info_list[modify_num]['qq'] = input("请输入新QQ:")
else:
print("输入序号有误,请重新输入")
def search_info():
"""查询学生信息"""
search_name = input("请输入要查询的学生姓名:")
for temp_info in info_list:
if temp_info['name'] == search_name:
print("查询到的信息如下:")
print("name:%s, tel:%s, QQ:%s" % (temp_info['name'],
temp_info['tel'], temp_info['qq']))
break
else:
print("没有您要找的信息....")
def print_all_info():
"""遍历学生信息"""
print("序号\t姓名\t\t手机号\t\tQQ")
i = 0
for temp in info_list:
# temp是一个字典
print("%d\t%s\t\t%s\t\t%s" % (i, temp['name'], temp['tel'], temp['qq']))
i += 1
def main():
"""用来控制整个流程"""
while True:
# 1. 打印功能
print_menu()
# 2. 获取用户的选择
num = input("请输入要进行的操作(数字)")
# 3. 根据用户选择,做相应的事情
if num == "1":
# 添加学生
add_new_info()
elif num == "2":
# 删除学生
del_info()
elif num == "3":
# 修改学生
modify_info()
elif num == "4":
# 查询学生
search_info()
elif num == "5":
# 遍历所有的信息
print_all_info()
elif num == "6":
# 退出系统
exit_flag = input("亲,你确定要退出么?~~~~(>_<)~~~~(yes or no) ")
if exit_flag == "yes":
break
else:
print("输入有误,请重新输入......")
# 程序的开始
main()