Python_03_项目实践


目录:

框架搭建

# 登录系统,显示欢迎界面
while True:
    print("**************************************")
    print("欢迎使用【名片管理系统】V1.0")
    print("")
    print("1、新建名片")
    print("2、显示全部")
    print("3、查询名片")
    print("")
    print("**************************************")
    # 提醒用户进行选择
    action_str = input("请输入要执行的操作:")  # 没有使用int进行数字转换,你永远想象不到用户会输入什么
    # 三种选项
    print("你选择的操作是 %s" % action_str)
    if action_str in ["1", "2", "3"]:  # 使用in来针对列表判断,避免使用or拼接复杂的逻辑条件
        pass  # 用作占位符,保持程序结构的完整性
    # 退出
    elif action_str == "0":
        print("欢迎再次使用【名片管理系统】V1.0")
        break
    # 错误选项
    else:
        print("请输入正常的按钮")

文档字符串

def my_function():
    """Do nothing, but document it.  # 简短摘要

    No, really, it doesn't do anything.  # 当有多行时,第二行应为空白行
    """
    pass

函数注解

函数注解可以对参数的要求类型进行注解,对函数返回值进行注解;只是对做一个辅助性的说明,并不强制进行类型检查。一些第三方工具(PyCharm)会对已定义的函数注解进行检查标记提示等,在编写代码时同样也可以通过编写一个装饰器,来进行一些检查。

def f(ham: str, eggs: str = 'eggss') -> str:  # 形参标注的定义方式是在形参后面加':',后面加一个表达式('str'or'int'or'bool')
    print("Annotations:", f.__annotations__)  # 标注以字典形式存放在函数的__annotations__属性中
    print("Arguments:", ham, eggs)
    return ham + ' and ' + eggs  # 返回值标注的定义方式是加组合符号->,后面跟一个表达式(明显最常用的就是str)

print(f('spam'))

TODO注释

#后跟上TODO,用于标记需要去做的工作,该标签会使注释变绿,且能直接通过点击来跳转到该注释。

变量名统一修改(可以通过选中变量名进行重构重命名)

return作用:如果return后面没有任何内容,表示会返回到调用函数的位置,且不返回任何结果,继续执行下方的代码。

哈希

python中内置hash()函数;

  • 接收不可变类型的数据作为参数;
  • 返回结果为一个整数;

哈希是一种算法,作用为提取数据的特征码,根据同一算法对数据进行加密

在python中,设置字典的键值对时,会首先对key进行bash来决定如何在内存中保存字典的数据,以方便后续对字典的增删改查操作;

  • 键值对的key必须是不可变类型数据;
  • 键值对的value可以是任意类型的数据;

引用

引用的概念

⭐变量和数据是分开存储的;

数据保存在内存中的一个位置;

变量中保存着数据在内存中的地址;

变量中记录数据的地址,就叫做引用

使用id()函数可以查看变量中保存数据所在的内存地址;

不可变类型的数据:字符串、整数、元组;

可变类型的数据:列表、字典;

可变类型的数据变化,只能通过方法来实现;

如果给一个可变类型的变量,赋值一个新的数据,引用会发生改变

  • 变量不再对之前的数据引用;
  • 变量改为对新赋值的数据的引用;

变量的引用

变量和数据都是保存在内存中的。在python中函数的参数传递以及返回值都是靠引用传递的。

变量

局部变量

局部变量的生命周期是指变量从被创建被系统回收的过程;

局部变量只有在函数执行时才会被创建;

全局变量

函数不能直接修改全局变量的引用

  • 全局变量是在函数外部定义的变量,所有函数内部都可以使用这个变量(不推荐使用全局变量,可变范围太大,导致程序不好维护);
  • 在函数内部,可以通过全局变量的引用获取对应的数据
  • 但是,不允许直接修改全局变量的引用,可以使用赋值语句修改全局变量的值

修改

使用global关键字在函数中修改全局变量。

# global关键字会告诉解释器后面的变量是一个全局变量,此时再使用赋值语句时,就不会再创建局部变量
def demo():
    global num  # 若希望修改全局变量的值,需要先使用global声明一下变量,然后才能重新为函数赋值
    num = 100
    num_list = [4, 5, 6]
    print(num)
    print(num_list)
num = 99
num_list = [1, 2, 3]
demo()
print(num)
print(num_list)
# 输出结果
100
[4, 5, 6]
100
[1, 2, 3]

+=的坑

python中,列表变量+=本质上是在执行列表变量的extend方法,不会修改变量的引用。但是如果是数字等变量,会对变量进行相加并赋值

def demo(num, num_list):   # +=这个使用方法是pyhton的一个坑,需注意
    num = 100
    num_list = [4, 5, 6]
    num += num  # 等价于num = num + num
    num_list += num_list   # 等价于 num_list.extent(num_list)
    print(num)  # 对应200
    print(num_list)  # 对应[4, 5, 6, 4, 5, 6]

num = 99
num_list = [1, 2, 3]
demo(num, num_list)
print(num)  # 对应99
print(num_list)  # [1, 2, 3]
# 输出结果
200
[4, 5, 6, 4, 5, 6]
99
[1, 2, 3]

参数

缺省参数

  • 定义函数时,可以给某个参数指定默认值;调用函数时,如果没有传入缺省参数的值,则使用定义函数时指定的参数默认值;习惯将常用的值设置为参数的缺省值,从而简化函数的调用;
  • 注意事项

有默认值的参数需要放在形参的最后面,否则调用形参时有歧义;例如传入参数时中间的参数是默认值,但是后面的形参却需要参数,python无法识别该参数是对应默认值的还是需要参数的形参;

对于有默认值的形参,可以单独对形参指定参数,以保障其它形参使用默认参数;

def demo(num, num_list=100):  # 在定义函数的形参加上=<默认值>

多值参数

存在一个函数能够处理的参数个数是不确定的,可使用多值参数来解决;

  • 参数名前加一个*,可以接收元组;
  • 参数名前加两个*,可以接收字典;
def demo(num, *args, **kwargs):
    print(num)
    print(args)
    print(kwargs)
demo(1, 2, 3, 4, name="小明", age=18)  # 注意缺省参数是写进形参,多值参数是写进实参
# 输出结果
1
(2, 3, 4)
{name="小明", age=18}

案例⭐

def sum_number(*args):  # 1.定义函数;
    num = 0  # 2。定义变量;
    for n in args:  # 5.函数框架搭建完成,补全for语句;
        num += n
    return num  # 3.返回值;
print(sum_number(1, 2, 3))  # 4.添加实参执行脚本;

多值参数的拆包

def demo(*args, **kwargs):  # 这里是多值参数用法
    print(args)
    print(kwargs)
gl_nums = (1, 2, 3)
gl_xiaoming = {"name":"小明", "age":18}
demo(*gl_nums, **gl_xiaomig)  # 等价于demo(1, 2, 3, "name":"小明", "age": 18)
# 这里是拆包用法,主要作用是简化元组变量/字典变量的传递

位置参数/关键字参数

def combined_example(pos_only, /, standard, *, kwd_only):
    print(pos_only, standard, kwd_only)
# 仅限位置形参应放置在/前面
# 仅限关键字形参应放在*后面
combined_example(1, 2, 3)  # 报错,kwd_only是仅关键字形参
combined_example(1, standard=2, kwd_only=3)
combined_example(1, 2, kwd_only=3)
combined_example(pos_only=1, standard=2, kwd_only=3)  # 报错,pos_only是仅位置形参,不能用关键字
# 仅限位置形参的名称可以在**kwds中使用,而不产生歧义

递归

函数内部调用自己的操作叫做递归。

代码特点

  1. 函数内部的代码是相同的,只是针对参数不同,处理的结果不同
  2. 参数满足一个条件时,函数不再执行

示例代码

def sum_numbers(num):
    if num == 1:
        return 1  # 代码出口
    temp = sum_numbers(num - 1)  # 假设sum_numbers能完成num - 1的累加
    return temp + num  # 函数内部的核心算法:两个数字的累加
print(sum_numbers(5))