函数篇:定义与调用、分类、返回值、参数

2022.3.16笔记总结

  • 函数的定义与调用
  • 函数的分类
  • 函数的返回值
  • 函数的参数

一、函数的的定义与调用

定义函数:

def func():
    '''这里是注释'''
    循环体代码
    return 返回值

调用函数:

函数名()

func()  # 即可调用

注意:

1、函数必须先定义才能调用

2、函数在定义阶段只检测语法不执行代码,调用时才执行

3、函数名可以当作变量名,指向的时内存中函数体代码所在的位置

二、函数的分类

1、内置函数:

python解释器中提前定义好的可以直接调用的函数,一打开python解释器就可以直接调用

eg:len(),print()等

2、自定义函数:

即程序员自己编写的函数

2.1无参函数:

在函数定义阶段括号内没有参数的函数

def func():  # 定义无参函数
    print('666')  # 666
func()  # 无参函数调用时括号内无需写参数

2.2有参函数:

在函数定义阶段括号内有参数的函数

def func(a,b):  # 定义函数时有参数
    print(a,b)  # 1,2
func(1,2)  # 调用时也需要传参数

2.3空函数:

函数定义时函数体代码用pass或者...代替

def run():  
    pass  # 函数体代码用pass代替
def study():  # 先构思主题功能
    pass
def eat():
    pass

由此可见,空函数并非一无是处,写一些比较复杂的代码时可以先构思并搭好框架,也不一定一定能用到。

三、函数的返回值

1、返回值的概念:

函数的返回值就是在调用函数之后返回的结果

def func():
    print('666')
res = func()  # 666 返回值需要用一个变量名指向

2、如何获取返回值

变量名 = 函数调用

res = func()

3、如何操作返回值

3.1return关键字

函数体代码后面跟return关键字,return后面空一格然后写需要返回的值,那么函数调用就会返回return后面的内容

def func():
    a = 6
    b = 7
    c = a * b 
    return c  # return后面是函数调用会返回的数据
res = func()
print(res)  # 42

3.2有return关键字但是后面没有内容

当函数调用时函数体代码结束后有return但是后面没有内容,默认返回值为None

def func():
    a = 6
    b = 7
    c = a * b 
    return   # return后面没有内容
res = func()
print(res)  # None

3.3没有return关键字

函数体代码后没有return则默认返回值为None

3.4return后面有多个值

当return后面有多个值并用逗号隔开则会自动组成元组作为返回值返回

def func():
    a = 6
    b = 7
    c = a * b 
    return a,b,c  # return后面为多个单个元素
res = func()
print(res)  # 结果为tupl(6,7,42)

3.5return的作用

return的作用,不仅是返回return后面的内容,当函数体代码运行到return时会自动结束函数运行,相当于循环体代码里面的break

qSWn9U.jpg

四、函数的参数

1、函数参数的分类

第一类:定义阶段括号里面写的参数,称之为形式参数,简称形参

第二类:调用阶段括号里面写的参数,称之为实际参数,简称实参

2、形参与实参的关系

关系1:形参类似于是变量名,实参类似于是变量名的值

关系2:形参是函数定义时定义的,实参时函数调用时获取的,实参用于向形参传值,函数调用时形成绑定关系,函数运行结束后解除绑定

def func(a,b):  # 括号内的a,b就是形参,在函数体中可能会用到的参数
    c = a + b
    return c
res = func(1,2)  # 括号内的1,2就是实参
print(res)  # 3

注意:实参可以是变量名、具体值、函数返回值等多种形式

3、位置参数

3.1位置形参:

在函数定义阶段在括号内从左往右依次填写的变量名

def func(a,b):
    pass

3.2位置实参:

在函数调用阶段括号内从左往右传入的实际数据

def func(a,b):
    pass
func(1,2)

3.3位置参数的特征

特征1:位置形参和实参都是按照从左往右的顺序依次绑定关系的

特征2:位置形参有几个,位置形参就必须传入几个数据

def func(a,b,c,d,e,f):
    pass
func(1,2,3,4,5,6)  # 位置实参需与位置形参数量一一对应才能调用

4、关键字参数(实参)

概念:

关键字参数一般指关键字实参,是在函数调用阶段知名道姓地向形参传值的一种参数

def func(a,b,c):
    pass
func(b=2,a=1,c=4)  # 调用1,关键字参数可以不按照顺序
func(1,c=4,b=2)  # 调用2,位置参数需要在关键字参数前
注意:
1.指定给某个参数传值,可以不按照顺序但是不能重复传值
2.位置参数必须放在关键字参数前面

5、默认参数(形参)

概念:

默认参数一般是指形参中指定某一参数在函数定义时就已经赋值了的参数

def func(a,b,c=4):  # 函数定义时c赋值为4
    pass
func(1,2)  # 参数c不写调用函数运行时默认为4
func(1,2,3)  # 参数c传入与函数赋值不同,使用新传入的值

6、可变长参数(重要)

6.1概念:

函数在定义阶段可以接收多个实参且不会报错的参数

6.2*args和**kwargs:

*a:用于接收多余位置参数,该参数以后的值都会被接收并组成元组赋值给a(a可以是任意变量,一般使用args)

def func(a,b,*c):
    pass
func(1,2,3,4,5,6,7,8,9...)  # 1,2实参会被位置形参a,b接收,后面的数据都会被*c接收并组成元组c=(3,4,5,6,7,8,9...)

**b:用于接收多余关键字参数,该参数以后的值都会被接收并组成字典赋值给b(b可以是任意变量,一般使用kwargs)

def func(a,b,**c):    
    pass
func(a=1,b=2,d=3,e=4,f=5...)  # 关键字实参a=1,b=2会被位置形参a,b接收,后面的数据都会被*c接收并组成字典c=(d:3,e:4,f:5,...)

6.3*args和**kwargs联合使用

两者联合使用可以接收任意类型参数

def func(*args,**kwargs):
    print(args,kwargs)
func()  # () {}
func(1,2,3,4,name='jason',age=18)  # (1,2,3,4) {name:'jason',age:18}

因此用此方法,当不确定需要多少个实参时可以使用

6.4可变长参数补充说明

*和**不单单可以在形参中使用 还可以在实参中使用:

*可以将元组和列表打散成位置实参一一传入

**可以将字典打散后将键值对当成关键字实参一一传入

def func(*args,**kwargs):
    print(args,kwargs)
func(*[1,2,3,4,5,6])  # 等同于func(1,2,3,4,5,6)
func(**{'name':'jason','age':18})  # 等同于func(name='jason',age=18)

qSWyUP.png

作业

思考如何将周末大作业优化成函数版本?
# 员工信息有:员工工号,姓名,性别,年龄,薪资
# 我打算用字典套列表的方式储存员工信息{员工工号:[姓名,性别,年龄,薪资]}

i = {}  # 定义一个空字典用于储存员工信息,放置于全局名称空间
def storge():
    '''
    用空字典接收用户输入,用于存储员工信息
    :return: 返回存储的所有信息
    '''
    staffnum = input('添加员工编号>>>:')
    staffname = input('输入员工姓名>>>:')
    staffgender = input('输入员工性别>>>:')
    staffage = input('输入员工年龄>>>:')
    staffsalary = input('输入员工薪资>>>:')
    if staffnum in i:
        print('用户名已存在')
    else:
        i[staffnum] = [staffname, staffgender, staffage,staffsalary]
        print('存储成功!')
    return i  # 返回字典i以便程序使用


def delete(staffnum):
    '''
    用于删除员工信息,需要获取员工编号
    '''
    if staffnum not in i:
        print('该员工不存在!')
    else:
        i.pop(staffnum)
        return print('已删除该员工!')

def amend():
    '''
    用于修改员工信息,需要获取员工各项信息
    '''
    new_num = input('输入员工编号>>>:')
    new_name = input('输入新的员工姓名>>>:')
    new_gender = input('输入新的员工性别>>>:')
    new_age = input('输入新的员工年龄>>>:')
    new_salary = input('输入新的员工薪资>>>:')
    if new_num not in i:
        print('该员工不存在')
    else:
        i[new_num][0] = new_name
        i[new_num][1] = new_gender
        i[new_num][2] = new_age
        i[new_num][3] = new_salary
        return print('修改成功!')



staff_info = {}  # 定义一个空字典用于接收员工信息,放置于全局名称空间
while True:
    print("\t员工管理系统V1.0")
    print("-" * 35)
    print("1.添加新员工")
    print("2.删除员工")
    print("3.修改员工信息")
    print("4.查询员工信息")
    print("5.查询所有员工信息")
    print("6.退出系统")
    print("-" * 35)

    choice = input('请输入功能编号>>>:')  # 实现多功能使用员工系统
    if choice == '1':
        staff_info = storge()  # 执行storge函数,添加员工信息
    elif choice == '2':
        real_num = input('输入要删除的员工编号>>>:')
        delete(real_num)  # 执行delete函数删除员工信息
    elif choice == '3':
        amend()  # 执行amend函数,修改员工信息

    elif choice == '4':
        real_num = input('请输入员工编号查找>>>:')
        if real_num in staff_info:  # 判断员工编号存不存在
            print('''
            --------------------------
            员工编号:{0}
            员工姓名:{1}
            员工性别:{2}
            员工年龄:{3}
            员工薪资:{4}
            --------------------------
            '''.format(real_num, staff_info[real_num][0], staff_info[real_num][1], staff_info[real_num][2], staff_info[real_num][3],))
        else:
            print('该员工不存在!')
    elif choice == '5':
        for j in staff_info.keys():  # for循环获取员工字典k值,以便获取字典内员工信息
            print('''
            --------------------------
            员工编号:{0}
            员工姓名:{1}
            员工性别:{2}
            员工年龄:{3}
            员工薪资:{4}
            --------------------------
            '''.format(j,staff_info[j][0], staff_info[j][1], staff_info[j][2], staff_info[j][3],))

    elif choice == '6':  # 退出系统直接break退出while循环
        break
    else:
        print('错误指令,请重新输入!')
posted @ 2022-03-16 16:32  马氵寿  阅读(628)  评论(0)    收藏  举报