自学python 进击之路 - 函数(二)

166 阅读6分钟

又是一的开始,也是学习的一天的开始

src=http___5b0988e595225.cdn.sohucs.com_images_20190916_32ce26032b124c3cb145a4231627373d.jpeg&refer=http___5b0988e595225.cdn.sohucs.jpg 今天继续函数的学习

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)

Snipaste_2021-05-20_20-28-15.png

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 

Snipaste_2021-05-24_14-40-54.png

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))

Snipaste_2021-05-24_14-43-42.png

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()

有什么更好的学习方法也介绍给我认识一下?