嵌入式Python基础1-2 条件语句 if elif else 随机数random eval while循环 for循环 水仙花数 循环else list 列表常用方法 增删改查 加排序 append remove pop index() 升序sort()降序 sort(reverse=True) 反转 reverse() 元组 组包 解包(解构) 元组交换数据 函数 函数定义 函数调用 递归 局部变量 全局变量 global
一、条件控制语句
程序满足特定的条件才能执行特定的代码,条件控制语句使用if
关键字,if
语句的结构如下:
1. if 语句
if语句格式:
if 条件:
条件成立时,要做的事情
……
判断年龄
需求:
- 定义一个整数变量记录年龄
- 判断是否满 18 岁 (>=)
- 如果满 18 岁,允许进网吧嗨皮
代码如下:
age = int(input('请输入你的年纪:'))
# if判断
if age >= 18:
print('允许进网吧嗨皮')
2. if...else...语句
有些情况我们希望满足条件执行相应的代码,不满足条件执行其他的代码,这就需要用到if else
语句
if ... else...
语句格式
if 要判断的条件:
条件成立时,要做的事情
……
else:
条件不成立时,要做的事情
……
判断年龄
需求:
- 输入用户年龄
- 判断是否满 18 岁 (>=)
- 如果满 18 岁,允许进网吧嗨皮
- 否则(未满 18 岁),提示回家写作业
代码如下:
age = int(input('请输入你的年纪:'))
# if判断
if age > =18:
print('允许进网吧嗨皮')
else:
print('回家写作业')
3. if ...elif... else语句
一对 if 和 else 可以让代码执行出 两种不同的结果
但开发中,可能希望 并列的执行出多种结果,这时就可以使用 elif
if ...elif... else
格式
if 条件1:
条件1满足执行的代码
……
elif 条件2:
条件2满足时,执行的代码
……
elif 条件3:
条件3满足时,执行的代码
……
else:
以上条件都不满足时,执行的代码
……
节日活动判定
需求:
- 定义
holiday_name
字符串变量记录节日名称 - 如果是 情人节,应该 买玫瑰/看电影
- 如果是 平安夜,应该 买苹果/吃大餐
- 如果是 生日,应该 买蛋糕
- 其他的日子,每天都是节日……
代码:
holiday_name = input('请输入节日名称')
if holiday_name == '情人节':
print('买玫瑰/看电影')
elif holiday_name == '平安夜':
print('买苹果/吃大餐')
elif holiday_name == '生日':
print('买蛋糕')
else:
print('每天都是节日,每天一个红包')
4. 火车站安检-if嵌套
在开发中,使用 if 进行条件判断,如果希望 在条件成立的执行语句中 再 增加条件判断,就可以使用 if 的嵌套
if 的嵌套 的应用场景是:在之前条件满足的前提下,再增加额外的判断
if 的嵌套 的语法格式,除了缩进之外 和之前的没有区别
需求:
- 定义布尔型变量
has_ticket
表示是否有车票- 定义整型变量
knife_length
表示刀的长度,单位:厘米- 首先检查是否有车票,如果有,才允许进行 安检
- 安检时,需要检查刀的长度,
- 判断是否超过 20 厘米
- 如果超过 20 厘米,提示刀的长度,不允许上车
- 如果不超过 20 厘米,安检通过
- 如果没有车票,不允许进门
# 1. 定义布尔型变量 has_ticket 表示是否有车票
has_ticket = eval(input("请输入是否有车票:"))
# 2. 定义整型变量 knife_length 表示刀的长度,单位:厘米
knife_length = int(input("请输入刀的长度:"))
if has_ticket:
if knife_length > 20:
print("不能进站,刀太长了")
else:
print("可以进站")
else:
print("不能进站,没有车票")
5. 练习-石头剪刀布
需求:
- 从控制台输入要出的拳 —— 石头(1)/剪刀(2)/布(3)
- 电脑 随机 出拳 —— 先假定电脑只会出石头,完成整体代码功能
- 比较胜负并输出结果
分析:
可以先将问题简化,假设电脑出一个固定的比如石头
完善程序后再添加电脑随机出拳功能
1. 基础代码实现(电脑固定出石头)
2. 随机数实现(电脑出的石头随机实现即可)
电脑固定出石头1:
# 1.我们出拳 定义变量保存用户输入
my = int(input('请输入出拳:'))
# 2.电脑随机出拳 (假定电脑出石头)
com = 1
# 3.判断胜负
if (my==3 and com==1):
# 用户胜利
print('用户胜利,my=%d,com=%d'%(my,com))
elif my==com:
print('平局,决战到天亮')
else:
print('电脑胜利,my=%d,com=%d'%(my,com))
电脑随机出1、2、3:
# python生成随机数 random
import random
# 1.我们出拳 定义变量保存用户输入
my = int(input('请输入出拳:'))
# 2.电脑随机出拳 (假定电脑出石头)
# 指定开始 结束 包含开始包含结束
com = random.randint(1,3)
# 3.判断胜负
if (my==1 and com==2) or (my==2 and com ==3) or (my==3 and com==1):
# 用户胜利
print('用户胜利,my=%d,com=%d'%(my,com))
elif my==com:
print('平局,决战到天亮,my=%d,com=%d'%(my,com))
else:
print('电脑胜利,my=%d,com=%d'%(my,com))
随机数
获取一个范围在[1,3]的随机数:
import random
computer = random.randint(1, 3)
扩展知识:eval
eval()
函数的作用是将一个字符串当作Python代码进行解析和执行。它接受一个字符串作为参数,并将该字符串解析为一个表达式,并返回表达式的计算结果。
result = eval('2 + 3 * 4') # 14
x = 5
eval('x = x + 1')
print(x) # 6
需要注意的是,由于eval()
函数的功能是执行字符串中的代码,它可能会带来一些安全风险。如果接受用户输入作为eval()
函数的参数,请确保对输入进行验证和过滤,以防止恶意代码执行或潜在的安全漏洞。在使用eval()
函数时要谨慎,并确保只执行可信任的代码。
二、while循环
1. 程序的三种执行流程
程序的执行流程有三种,分别是:顺序执行、分支执行、循环执行
- 顺序 —— 从上向下,顺序执行代码
- 分支 —— 根据条件判断,决定执行代码的分支
- 循环 —— 让 特定代码 重复 执行
2. while循环
循环的作用是让指定的代码重复的执行while
循环最常用的应用场景就是 让执行的代码 按照 指定的次数 重复 执行
2.1. 基本语法
应用场景:
需求:
跟媳妇承认错误,说一万遍"媳妇儿,我错了"
print("媳妇儿,我错了")
print("媳妇儿,我错了")
print("媳妇儿,我错了")
...(还有99997遍)...
循环代码的实现:
# 1.定义循环变量
i = 1
# 2.使用while判断条件
while i <= 10000:
# 要重复执行的代码
print('媳妇儿,我错了')
# 3.修改循环变量
i += 1
2.2. 循环变量和死循环
对于上面的代码i
就是循环变量,循环变量的主要作用是控制循环什么时候停下来。
一般情况下,程序中的计数是从0开始的,所以上面的代码通常我们可以写成下面这种:
# 1.定义循环变量
i = 0
# 2.使用while判断条件
while i < 10000:
# 要重复执行的代码
print('媳妇儿,我错了')
# 3.修改循环变量
i += 1
死循环指的是程序持续执行,无法终止。原因通常是忘记在循环内部修改循环变量的值
比如:
# 1.定义循环变量
i = 0
# 2.使用while判断条件
while i < 10000:
# 要重复执行的代码
print('媳妇儿,我错了')
和正常代码相比,在循环内部忘记修改循环变量,循环条件一直满足,循环就会一直执行。死循环在程序中也有一定的使用场景,可以保证程序不会停止。
比如:QQ的服务器要保证能一直接收到消息,通常内部会有死循环支持。再比如,做界面开发时,为了保证界面能一直显示,内部也通常会维护一个死循环
死循环最简单的写法如下:
while True:
pass
其中pass
是Python的空语句,只是为了保证语法的完整,并没有实际意义。
2.3. 练习-打印直角三角形
根据用户输入的数值n
,打印n
行三角形
2.3.1. 正直角三角形
*
**
***
****
*****
代码:
n = int(input("请输入打印的行数: "))
i = 1
while i <= n:
print("*" * i)
i += 1
2.3.2. 倒直角三角形
*****
****
***
**
*
代码:
n = int(input("请输入打印的行数: "))
while n >= 0:
print("*" * n)
n -= 1
3. 嵌套循环
while 嵌套就是:while 里面还有 while
while循环嵌套的格式如下:
代码如下:
# 外层循环
i = 0
while i < 5:
# 内层循环
j = 0
while j < 3:
print(j)
j += 1
i += 1
4. 练习-九九乘法表
4.1. 正序九九乘法表
思路分析:
- 打印星星
- 使用嵌套循环打印阶梯星星
- 将星星替换成乘法口诀公式
使用嵌套循环打印星星:
row = 1
while row < 10:
# 这一行,需要操作n次 定义循环
# 列循环:操作的次数
col = 1
while col <= row:
# 不需要换行
print('*', end='') # 默认会有换行
col += 1
# 换行
print()
row += 1
输出结果:
*
**
***
****
*****
******
*******
********
*********
将星星替换成乘法口诀
规则:列号 x 行号 = 结果
row = 1
while row < 10:
# 这一行,需要操作n次 定义循环
# 列循环:操作的次数
col = 1
while col <= row:
# 不需要换行
# 列*行=数据
print('%d * %d = %d'%(col,row,col*row),end='\t') # 默认会有换行
col += 1
# 换行
print()
row += 1
输出结果:
4.2. 倒序九九乘法表
分析:
只需要将行号从9开始即可
代码:
row = 9
while row > 0:
# 这一行,需要操作n次 定义循环
# 列循环:操作的次数
col = 1
while col <= row:
# 不需要换行
# 列*行=数据
print('%d * %d = %d'%(col,row,col*row),end='\t') # 默认会有换行
col += 1
# 换行
print()
row -= 1
三、for循环
1. for循环
for
循环的主要作用是遍历数据(容器))中的元素。字符串、列表等高级数据类型都属于容器,都可以通过for
循环遍历
for
循环的语法格式如下:
for 临时变量 in 列表或字符串等可迭代对象:
执行的代码
使用for
循环遍历字符串中的所有字符
需求:
打印字符串'hello world'中每一个字符
代码如下:
str = 'hello world'
# ele普通变量 接收容器中的元素
for s in str:
print(s)
2. in和not in
in
操作符用于判断元素是否存在于容器中,如果在容器中,返回 True
,否则返回 False
str = 'hello'
result = 'h' in str
print(result)
result = 'e' not in str
print(result)
结果:
True
False
3. range
range()
可创建一个整数列表。range()
相当于数学中的左闭右开区间(包含左,不包含右)
我们先看看数学中的区间:
全开全闭区间
- 开区间:
(1,10)
不包含1和10 - 闭区间:
[1,10]
包含1和10
半开半闭区间
- 左开右闭区间:
(1,10]
包含10不包含1 - 左闭右开区间:
[1,10)
包含1不包含10
range的定义
# 定义0到10的区间(包含0,不包含10)
arr = range(0, 10)
如果区间从0开始可以省略0
# 定义0到10的区间(包含0,不包含10)
arr = range(10)
倒序的区间定义
# 定义从10到1的区间,参数分别代表 start开始, stop结束, step步长
arr = range(10, 0, -1)
区间可以通过for进行遍历
# 定义0到10的区间(包含0,不包含10)
arr = range(0, 10)
# 遍历区间
for ele in arr:
print(ele)
4. 练习-水仙花数
4.1. 需求
打印出所有"水仙花数",所谓"水仙花数"是指一个三位数[100, 1000)
,其各位数字立方和等于该数本身。
例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
4.2. 分析
- 遍历所有的三位数
- 求 百位 十位个位 立方和
- 判断并打印
4.3. 实现
for ele in range(100, 1000):
# 百位
hun = ele // 100
# 十位
ten = ele // 10 % 10
# 个位
single = ele % 10
# 判断立方和
if (hun**3 + ten**3 + single**3) == ele:
print(ele)
5. break和continue
break
和continue
是专门在循环中使用的关键字
- break:某一条件满足时,不再执行循环体中后续代码,并退出循环
- continue:某一条件满足时,不再执行本次循环体中后续代码,但进入下一次循环判断
5.1. break
for i in range(5):
if i == 3:
break
print(i)
结果:
0
1
2
5.2. continue
for i in range(5):
if i == 3:
continue
print(i)
结果:
0
1
2
4
6. 循环结合else
循环也可以像if
语句一样结合else
。
else
中的语句会在循环正常执行完(即没有通过break
或其他异常情况中断循环)的情况下执行,while
循环也是如此
格式:
for 变量 in 容器:
循环体代码
else:
没有通过break退出循环, 循环结束后, 会执行的代码
for else,会执行else中的代码
str = 'hello world'
for ele in str:
print(ele)
else:
print('执行了else语句')
for else中执行了continue,会执行else中的代码
for ele in str:
if ele == 'l':
continue
print(ele)
else:
print('执行了else语句')
for else中执行了break,else语句不会执行
for ele in str:
if ele == 'l':
break
print(ele)
else:
print('else语句不会执行')
7. 练习-密码合法判断
7.1. 需求
判断登录密码
hhew2383dW_fkf&E@^
是否合法。
- 密码必须是数字、字母(大小写都可以)、和下划线,否则不合法
- 如果密码合法,就输出
"密码合法"
分析
- 定义容器,保存所有的数字 字母 _
- for循环遍历密码中每一个元素
- 判断每一个元素是否合法
- 如果不合法,执行break
7.2. 提示
字母数字下划线字符串
container = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_'
7.3. 实现
password = 'hhew2383dW_fkfE'
# 2.定义容器:保存所有的数字 字母 _
container = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_'
# 1.for循环遍历密码中每一个元素
for ele in password:
# 2.判断每一个元素是否合法
# 每一个元素 是否在容器中 @
if ele not in container:
print('密码不合法,不可包含%s' % ele)
break
else:
# 如果执行了break,就不会再执行else,密码合法就不会执行
print('密码合法')
四、list列表
1. 高级数据类型
Python中的数据类型可以分为:数字型(基本数据类型)和非数字型(高级数据类型)
- 数字型包含:整型
int
、浮点型float
、布尔型bool
、复数型complex
- 非数字型包含:字符串
str
、列表list
、元组tuple
、集合set
、字典dict
高级数据类型的特点
- 都是一个序列 sequence,也可以理解为 容器
- 获取某一个元素
数据集[index]
(集合除外,无序的)- 通过
for
循环遍历- 都可以计算长度、最大/最小值、比较、删除
- 连接 + 和 重复 *
- 切片,获取容器一部分
2. 列表
列表 是 Python 中使用 最频繁 的数据类型,专门用于存储 一串 数据,存储的数据 称为 元素
列表的类型是:list
2.1. 列表的定义
列表用[]
定义,元素之间用逗号,
分隔
namesList = ['林青霞','张曼玉','胡慧中']
2.2. 访问列表的元素
查找列表中元素是按照列表索引进行查找的。索引 就是元素在 列表 中的位置编号,又可以被称为 下标
索引是从0开始的,例如:第一个元素,索引就为0
namesList = ['林青霞','张曼玉','胡慧中']
# 获取第二个人
name = namesList[1]
print(name)
2.3. 遍历列表
可以通过for遍历列表中的元素
namesList = ['林青霞','张曼玉','胡慧中']
# 遍历列表
for name in namesList:
print(name)
2.4. 列表的操作
列表可以增加新的元素,删除元素,修改元素。还可以对列表进行排序等操作
增加元素
通过append
增加新元素
namesList = ['林青霞','张曼玉','胡慧中']
# 增加高圆圆
namesList.append('高圆圆')
print(namesList)
结果:
['林青霞', '张曼玉', '胡慧中', '高圆圆']
删除元素
通过pop
删除指定索引元素
namesList = ['林青霞','张曼玉','胡慧中']
# 删除张曼玉
namesList.pop(2)
print(namesList)
# ['林青霞','张曼玉']
结果:
['林青霞', '胡慧中']
通过remove
方法删除指定内容元素
namesList = ['林青霞','张曼玉','胡慧中']
# 删除张曼玉
namesList.remove('张曼玉')
print(namesList)
结果:
['林青霞', '胡慧中']
修改元素
通过 列表[索引]=新数据
修改元素
namesList = ['林青霞','张曼玉','胡慧中']
# 将张曼玉修改成高圆圆
namesList[1] = '高圆圆'
print(namesList)
结果:
['林青霞', '高圆圆', '胡慧中']
查询
通过 列表[索引]
获取元素
namesList = ['林青霞','张曼玉','胡慧中']
# 查找第二个元素
ele = namesList[1]
print(ele)
结果:
张曼玉
通过 列表.index(元素)
查找元素的索引
namesList = ['林青霞','张曼玉','胡慧中']
# 查找元素张曼玉的索引
index = namesList.index('张曼玉')
print(index)
结果:
1
2.5. 列表的排序
通过 列表.sort()
对列表进行升序排序
ageList = [90,10,30,20,50,70]
# 从大到小 降序排序
ageList.sort(reverse=True)
print(ageList)
结果:
[90, 70, 50, 30, 20, 10]
通过 列表.sort(reverse=True)
对列表进行降序排序
ageList = [90,10,30,20,50,70]
# 从大到小 降序排序
ageList.sort(reverse=True)
print(ageList)
结果:
[90, 70, 50, 30, 20, 10]
通过 列表.reverse()
对列表进行反转
ageList = [90,10,30,20,50,70]
# reverse 将列表进行反转
ageList.reverse()
print(ageList)
结果:
[70, 50, 20, 30, 10, 90]
2.6. 列表的嵌套
列表中的元素可以是列表类型的数据,就称为列表的嵌套
嵌套列表的定义:
students = [
['林青霞','狄龙','郑少秋'],
['张曼玉','梁朝伟']
]
查询元素
# 查询郑少秋
student = students[0][2]
修改元素
# 修改张曼玉位高圆圆
students[1][0] = '高圆圆'
3. 练习-办公室分配
需求
一个学校,有3个办公室,现在有8位老师等待工位的分配
['袁腾飞', '罗永浩', '俞敏洪', '李永乐', '王芳芳', '马云', '李彦宏', '马化腾']
请编写程序:
- 完成随机的分配
- 打印办公室信息 (每个办公室中的人数,及分别是谁)
分析
1. 定义3个办公室的列表:列表嵌套
2. 声明8位老师到列表中
3. 遍历老师的列表
4. 随机存放到办公室中
提示:获取随机数
import random
index = random.randint(0, 2) # 获取0、1、2中的任意一个
实现
import random
# 1.3个办公室(办公室:列表) 列表嵌套
classroomList = [[], [], []]
# 2.8位老师 列表中保存
teachers = ['袁腾飞', '罗永浩', '俞敏洪', '李永乐', '王芳芳', '马云', '李彦宏', '马化腾']
# 3.遍历老师的列表
for teacher in teachers:
# 随机办公室的角标 Ctrl+P查看提示
# Ctrl+Alt+V 提取变量
index = random.randint(0, 2)
# 4.随机存放到办公室中
classroom = classroomList[index]
classroom.append(teacher)
print(classroomList)
五、tuple元组
1.元组简介
Python的元组与列表类似,也是容器的一种,不同之处在于元组的元素不能修改
- 用于存储 一串 数据,元素之间使用 , 分隔
- 元组的索引从
0
开始- 元组的类型:tuple
2. 元组的定义
元组用 ()
定义
names_tuple = ('林青霞','张曼玉','胡慧中')
注意:一个元素的元组定义需要在元素后加上,
# 错误定义方式 ❌
names_tuple = ('林青霞')
# 正确定义方式 ✅
names_tuple = ('林青霞',)
3.元组的特点和作用
元组作为一种高级数据类型,具备如下的特点
自动组包
t
的类型是元组类型,这就是元组的自动组包特征
t = '林青霞','张曼玉','王祖贤'
自动解包
# 定义元组
t = ('林青霞','张曼玉','王祖贤')
# 变量赋值
name1,name2,name3 = t
元组t
会自动解包分别赋值给name1
、name2
、name3
三个变量
注意:左边变量的个数一定要和元组的元素个数保持一致
交换数据
交换数据在其它语言中的实现如下:
a = 10
b = 20
# 交换a和b
tmp = a
a = b
b = tmp
可以利用元组的组包和解包特点,,速交换两个数据
a = 10
b = 20
# 交换a和b
a,b = b,a
上述交换,首先右边会进行自动组包,组成新的元组(20,10)
左边会把元组解包,元素分别赋值给a
和b
,最终实现交换的功能
让列表不可修改
有时我们传递列表数据给别人使用,希望别人不要修改列表
可以把列表转换成元组,这样就变成了不可变的数据
lst = [10, 20, 30]
# 将列表转换成元组
tp = tuple(lst)
# 不可执行如下类似操作
tp[0] = 111
tp.append(222)
如果运行执行会报出如下错误:TypeError: 'tuple' object does not support item assignment
六、函数基础
函数(function)是程序非常重要的组成部分,是计算机执行命令的单元;
所谓函数,就是把 具有独立功能的代码块 组织为一个整体,在需要的时候 调用;
使用函数可以提高编写的效率以及代码的重用
1. 函数的定义和调用
函数的使用包含两个步骤:
- 定义函数 —— 在函数中编写代码,实现功能
- 调用函数 —— 执行编写的代码
1.1. 函数的定义格式
def 函数名():
函数封装的代码
def
是英文define
的缩写;
函数名的命名规则和变量的命名规则要保持一致
1.2. 函数的调用格式
函数名()
1.3. 第一个函数
需求
- 编写一个打招呼 say_hello 的函数,封装三行打招呼的代码
- 在函数下方调用打招呼的代码
实现
# 定义函数
def say_hello():
print('hello world')
print('hello world')
print('hello world')
# 调用函数
say_hello()
2. 函数的文档注释
函数名并不能完全表示出函数的含义,定义函数的时候就需要给函数加上注释。
函数的注释就是文档注释,以后可以根据此内容查看函数使用说明,或用于生成API文档。
注释的规则和格式如下:
- 注释应该定义在函数的下方
- 使用三对引号注释
- 调用函数时, 鼠标悬浮在函数名上可以查看函数的说明信息
def say_hello2():
"""
这是给林青霞打招呼的方法
:return:
"""
print('hello 林青霞')
3. 函数的参数
函数的参数,可以传递数据给函数内部
参数的作用是增加函数的 通用性
3.1. 参数的定义和调用
# 定义函数
def 函数名(参数1, 参数2):
函数代码
# 调用函数
函数名(参数1, 参数2)
3.2. 参数的使用
需求
定义函数,传递a和b,求a和b的和
实现
def sum(a,b):
"""
这个函数是求两个数据的和
:param a: 第一个数据
:param b: 第二个数据
:return: a和b的和
"""
result = a + b
print(result)
# 调用
sum(10,20)
4. 函数的返回值
- 开发中,有时会希望一个函数执行结束后,告诉调用者一个结果,以便调用者对结果做后续处理
- 返回值是函数给调用方提供的结果
- 函数中使用
return
关键字返回结果- 调用函数一方,可以通过变量来接收函数的返回结果
函数返回值
需求
定义函数返回两个数最大值
实现
# 定义函数
def my_max(a,b):
if a > b:
return a
else:
return b
# 调用函数
max_value = my_max(10,20)
5. 函数多返回值
函数可以返回多个结果
def calc(a, b):
'''
求a+b以及a-b的结果
:param a:
:param b:
:return: 结果的元组
'''
sum = a + b
sub = a-b
return sum, sub
上面函数同时返回了两个数的和以及两个数的差
返回的结果会自动组包成为一个元组数据,接收的时候可以分别接收sum、sub
# 分别接收和以及差
sum, sub = calc(10, 20)
6. 函数的四种类型
函数按照是否有参数以及返回值可以将函数分成四种类型
6.1. 无参无返回值
def say_hello():
print('hello')
6.2. 无参有返回值
import random
def get_temp():
return random.randint(0,100)
6.3. 有参无返回值
def say_hello(name):
print('hello %s'%name)
6.4. 有参有返回值
def sum(a, b):
return a + b
7. 函数的形参和实参
7.1. 形参
全称为形式参数
。是在定义函数的时候使用的参数,用来接收调用该函数时传入的参数
def sum(a, b):
return a + b
a
和b
属于形参,形参在函数调用的时候才赋值
7.2. 实参
全称为实际参数
,是在调用时传递给函数的参数
sum(10, 20)
调用sum
函数时传入的10
和20
即是实参
7.3. 形参作用域
作用域指的是变量的可用范围
- 形参的作用域只在函数内,超出函数就不能再使用了
- 作用域可以减少不同函数的命名冲突
8. 局部变量和全局变量
8.1. 局部变量
- 局部变量,指的是在函数内部定义的变量
- 局部变量的目的是存储需要临时保存的数据
def func1():
# 局部变量
b = 20
print('hello%d' % b)
注意:
- 不同的函数,可以定义相同名字的局部变量
- 局部变量的作用域只在函数内部
8.2. 全局变量
全局变量是在整个py文件中声明,全局范围内都可以访问
# 全局变量
m = 10
n = 20
def func():
# 函数内访问全局变量
print(m)
8.3. 函数内修改全局变量
如果要在函数内部修改全局变量 需要首先使用global关键字将声明全局变量
# 定义全局变量
m = 10
def func():
# 使用global声明全局变量
global m
# 将m修改成20
m = 30
print("函数内部 m=", m)
七、综合练习--名片管理系统
1. 需求
- 程序启动,显示名片管理系统欢迎界面,并显示功能菜单
- 用户用数字选择不同的功能:
新建名片、显示名片、查询名片、退出系统
- 用户名片需要记录用户的
姓名、电话、QQ、邮件
- 显示名片可以列举出所有已经保存的名片
- 如果查询到指定的名片,用户可以选择
修改
、删除
名片
2. 菜单功能
菜单需要多次输出,所以可以放在死循环中,如果退出程序直接break
循环即可
while True:
print('*' * 50)
print('欢迎使用[名片管理系统]V1.0')
print()
print('1.新建名片')
print('2.显示名片')
print('3.查询名片')
print()
print('0.退出系统')
print('*' * 50)
3. 输入处理
输入不同的数字代表不同的操作
while True:
# ...
type = int(input('请输入执行的操作:'))
if type == 1:
# 新建名片
elif type == 2:
# 显示全部
elif type == 3:
# 搜索名片
elif type == 0:
break
4. 新建名片
1、定义列表保存所有的名片
cardList = [] # 名片数据列表 [姓名,电话,qq,email]
名片包含四个属性,可以再通过列表按照姓名、电话、qq、email
的顺序保存
2、定义createCard
创建名片函数
def createCard():
'''
创建新名片
:return:
'''
print('您选择的功能是: 1')
print('功能: 新建名片')
name = input('请输入姓名:')
phone = input('请输入电话:')
qq = input('请输入QQ:')
email = input('请输入邮箱:')
# 每一个名片是列表数据
# [姓名,电话,qq,email]
card = [name,phone,qq,email]
# 添加到列表中
cardList.append(card)
3、在循环中调用
while True:
...
type = int(input('请输入执行的操作:'))
if type == 1:
# 新建名片
createCard()
...
5. 显示全部
1、定义显示所有名片的showAll函数
def showAll():
'''
显示所有的名片
:return:
'''
print('您选择的功能: 2')
print('功能提示: 显示全部')
# 表头
print('姓名\t电话\tQQ\t邮件')
print('-'*50)
# 找到所有的名片并打印
for card in cardList:
# name = card[0]
# phone = card[1]
# qq = card[2]
# email = card[3]
print('%s\t%s\t%s\t%s' % tuple(card))
print('-'*50)
2、调用
while True:
#...
type = int(input('请输入执行的操作:'))
#...
elif type == 2:
showAll()
6. 查询名片
6.1. 搜索名片
1、定义searchCard
函数
def searchCard():
'''
查询名片
:return:
'''
print('您选择的功能是: 3')
print('功能: 查询名片')
name = input('请输入查询的姓名:')
# 查询名片
for card in cardList:
# 判断当前card的名字和name是否相同
if card[0]==name:
# 找到了
# 执行其它的操作
handleCard(card)
# 退出当前的循环
break
else:
print('没有找到对应的用户:%s'%name)
其中handleCard
函数是对搜索的结果进行处理,后面实现
2、调用
while True:
...
type = int(input('请输入执行的操作:'))
...
elif type == 3:
searchCard()
6.2. 操作名片
handleCard
函数是对搜索的名片操作
def handleCard(card):
'''
处理名片
:param card:
:return:
'''
while True:
type = int(input('请输入对名片的操作: 1.修改/ 2.删除/ 0.返回上一级:'))
# 根据不同的type做判断
if type==1:
# 修改
modifyCard(card)
# 跳出循环
break
elif type==2:
# 删除
deleteCard(card)
break
elif type==0:
# 返回上一级
break
else:
print('输入错误,请重新输入')
输入1进行修改,对应
modifyCard
函数输入2进行删除,对应
deleteCard
函数
修改名片modifyCard
def modifyCard(card):
'''
修改名片
:param card:
:return:
'''
# 修改名片
card[0] = input('请输入姓名:')
card[1] = input('请输入电话:')
card[2] = input('请输入QQ:')
card[3] = input('请输入邮箱:')
删除名片deleteCard
def deleteCard(card):
'''
删除名片
:param card: 名片列表
:return:
'''
cardList.remove(card)