框架搭建
# 登录系统,显示欢迎界面
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中使用,而不产生歧义
递归
函数内部调用自己的操作叫做递归。
代码特点
- 函数内部的代码是相同的,只是针对参数不同,处理的结果不同;
- 当参数满足一个条件时,函数不再执行;
示例代码
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))