Step3- Python基础3 函数、递归、内置函数
1.函数基本语法及特性
Python中函数的定义方法:
def test(x): #定义函数的关键字,()内可定义形参
"""The function definitions""" #文档描述
x += 1 #逻辑语句
return x #定义返回值
2.函数参数与局部变量
形参变量,parameter,只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量
实参,argument,可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值
实参有两种赋值方式:
def add(x,y):
return x + y
add(1,2) #positional argument 位置参数,与形参按顺序一一对应
add(x=1,y=2) #keyword argument 关键字参数,无视顺序
add(y=2,x=1)
add(x=1,2) #写法错误,位置参数不能在关键字参数之后
add(1,y=2) #这种可以
默认参数写法:
def stu_register(name, age, country="CN", course="C++"):
print("----注册学生信息------")
print("姓名:", name)
print("age:", age)
print("国籍:", country)
print("课程:", course)
stu_register("王山炮", 22, "C", "python_devops")
stu_register("张叫春", 21, "C", "linux")
stu_register("刘老根", 25, "C", "linux")
关键参数:
正常情况下,给函数传参数要按顺序,不想按顺序就可以用关键参数,只需指定参数名即可,但是,关键参数必须放在位置参数之后!
stu_register(name='alex',age=22)
非固定参数
若你的函数在定义时不确定用户想传入多少个参数,就可以使用非固定参数
def stu_register(name,age,*args): # *args 会把多传入的参数变成一个元组形式
print(name,age,args)
stu_register("Alex",22)
#输出
#Alex 22 () #后面这个()就是args,只是因为没传值,所以为空
stu_register("Jack",32,"CN","Python")
#输出
# Jack 32 ('CN', 'Python')
另一种方式为**kwargs
def stu_register(name,age,*args,**kwargs): # **kwargs 会把多传入的参数变成一个字典形式
print(name,age,args,kwargs)
stu_register("Alex",22)
#输出
#Alex 22 () {}#后面这个{}就是kwargs,只是因为没传值,所以为空
stu_register("Jack",32,"CN","Python",sex="Male",province="ShanDong")
#输出
# Jack 32 ('CN', 'Python') {'province': 'ShanDong', 'sex': 'Male'}
全局变量与局部变量
name = "Alex Li"
def change_name(name):
print("before change:",name)
name = "金角大王,一个有Tesla的男人"
print("after change", name)
change_name(name)
print("在外面看看name改了么?",name)
输出
before change: Alex Li after change 金角大王,一个有Tesla的男人 在外面看看name改了么? Alex Li
在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量
全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序
当全局变量与局部变量同名时:
在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用
切记不要在函数中改全局变量!!会很麻烦!!
3.返回值
要想获取函数的执行结果,就可以用return语句把结果返回
注意:
1.函数在执行过程中只要遇到return语句,就会停止执行并返回结果,so 也可以理解为 return 语句代表着函数的结果
2.如果未在函数中指定return,那这个函数的返回值为None
4.递归
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数
def calc(n):
print(n)
if int(n/2) ==0:
return n
return calc(int(n/2))
calc(10)
输出:
10
5
2
1
递归特性:
1. 必须有一个明确的结束条件
2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
程序:员工信息表
对这个员工信息文件,实现增删改查操作
-
可进行模糊查询,语法至少支持下面3种:
-
select name,age from staff_table where age > 22
-
select * from staff_table where dept = "IT"
-
select * from staff_table where enroll_date like "2013"
-
查到的信息,打印后,最后面还要显示查到的条数
-
- 可创建新员工纪录,以phone做唯一键,staff_id需自增
-
可删除指定员工信息纪录,输入员工id,即可删除
-
可修改员工信息,语法如下:
-
UPDATE staff_table SET dept="Market" WHERE where dept = "IT"
-
代码:
info = {
"1": {
"name": "Alex Li",
"age": 22,
"phone": 13651054608,
"dept": "IT",
"enroll_date": "2013-04-01",
},
"2": {
"name": "Jack Wang",
"age": 30,
"phone": 13304320533,
"dept": "HR",
"enroll_date": "2015-05-03",
},
"3": {
"name": "Rain Liu",
"age": 25,
"phone": 1383235322,
"dept": "Sales",
"enroll_date": "2016-04-22",
},
"4": {
"name": "Mack Cao",
"age": 40,
"phone": 1356145343,
"dept": "HR",
"enroll_date": "2009-03-01",
},
}
def age_search(a):
count = 0
for i in info:
if info[i]["age"] > a:
print(info[i]["name"], info[i]["age"])
count += 1
if count == 0:
print("没有相关任何信息!")
else:
print("总共查到了%s条信息" % count)
def dept_search(b):
count = 0
for i in info:
if info[i]["dept"] == b:
print(info[i]["name"], info[i]["dept"])
count += 1
if count == 0:
print("没有相关任何信息!")
else:
print("总共查到了%s条信息" % count)
def enroll_date_search(c):
count = 0
for i in info:
if c in info[i]["enroll_date"]:
print(info[i]["name"], info[i]["enroll_date"])
count += 1
if count == 0:
print("没有相关任何信息!")
else:
print("总共查到了%s条信息" % count)
def add_info(a):
for i in info:
if a == i:
print("已有该员工编号!")
return 0
info[a] = {}
info[a]["name"] = input("name:")
info[a]["age"] = input("age:")
info[a]["phone"] = input("phone:")
info[a]["dept"] = input("dept:")
info[a]["enroll_date"] = input("enroll_date:")
print("创建成功!")
for i in info:
print(info[i])
return 1
def delete_info(id):
count = 0
for i in info:
if id == i:
del info[id]
print("删除成功!")
count = 1
if count == 0:
print("没有此员工!")
def update_info(x):
count = 0
for i in info:
if x == i:
y = input("类别:")
z = input("内容:")
info[x][y] = z
count = 1
if count == 0:
print("没有此员工!")
while True:
print("请选择你的选项:\n1 模糊查询\n2 创建新员工记录\n3 删除员工记录\n4 修改员工记录")
user_choice = int(input())
if user_choice == 1:
while True:
print("1 年龄查询")
print("2 部门查询")
print("3 入职时间查询")
search_choice = int(input("输入查询内容:"))
if search_choice == 1:
age_search(int(input("请输入年龄:")))
elif search_choice == 2:
dept_search(input("请输入部门:"))
elif search_choice == 3:
enroll_date_search(input("请输入入职时间:"))
else:
break
elif user_choice == 2:
while True:
if add_info(input("staff_id:")) == 0:
continue
else:
break
elif user_choice == 3:
delete_info(input("staff_id:"))
elif user_choice == 4:
update_info(input("staff_id:"))
else:
break
for i in info:
print(info[i])
浙公网安备 33010602011771号