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)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

 程序:员工信息表

对这个员工信息文件,实现增删改查操作

  1. 可进行模糊查询,语法至少支持下面3种:

    1.   select name,age from staff_table where age > 22

    2.   select  * from staff_table where dept = "IT"

    3.       select  * from staff_table where enroll_date like "2013"

    4. 查到的信息,打印后,最后面还要显示查到的条数 

  2. 可创建新员工纪录,以phone做唯一键,staff_id需自增
  3. 可删除指定员工信息纪录,输入员工id,即可删除

  4. 可修改员工信息,语法如下:

    1.   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])

  

 

posted @ 2017-07-09 20:48  Nick-Peggy  阅读(310)  评论(0)    收藏  举报