嵌入式Python基础1-2

嵌入式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 条件:
    条件成立时,要做的事情
    ……

判断年龄

需求:

  1. 定义一个整数变量记录年龄
  2. 判断是否满 18 岁 (>=)
  3. 如果满 18 岁,允许进网吧嗨皮

代码如下:

age = int(input('请输入你的年纪:'))
# if判断
if age >= 18:
    print('允许进网吧嗨皮')

 2. if...else...语句

有些情况我们希望满足条件执行相应的代码,不满足条件执行其他的代码,这就需要用到if else语句

if ... else...语句格式

if 要判断的条件:
    条件成立时,要做的事情
    ……
else:
    条件不成立时,要做的事情
    ……

 

判断年龄

需求:

  1. 输入用户年龄
  2. 判断是否满 18 岁 (>=)
  3. 如果满 18 岁,允许进网吧嗨皮
  4. 否则(未满 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:
    以上条件都不满足时,执行的代码
    ……

节日活动判定

需求:

  1. 定义 holiday_name 字符串变量记录节日名称
  2. 如果是 情人节,应该 买玫瑰/看电影
  3. 如果是 平安夜,应该 买苹果/吃大餐
  4. 如果是 生日,应该 买蛋糕
  5. 其他的日子,每天都是节日……

代码:

holiday_name = input('请输入节日名称')
if holiday_name == '情人节':
    print('买玫瑰/看电影')
elif holiday_name == '平安夜':
    print('买苹果/吃大餐')
elif holiday_name == '生日':
    print('买蛋糕')
else:
    print('每天都是节日,每天一个红包')

 4. 火车站安检-if嵌套

在开发中,使用 if 进行条件判断,如果希望 在条件成立的执行语句中 再 增加条件判断,就可以使用 if 的嵌套
if 的嵌套 的应用场景是:在之前条件满足的前提下,再增加额外的判断
if 的嵌套 的语法格式,除了缩进之外 和之前的没有区别

需求:

  1. 定义布尔型变量 has_ticket 表示是否有车票
  2. 定义整型变量 knife_length 表示刀的长度,单位:厘米
  3. 首先检查是否有车票,如果有,才允许进行 安检
  4. 安检时,需要检查刀的长度,
  5. 判断是否超过 20 厘米
    1. 如果超过 20 厘米,提示刀的长度,不允许上车
    2. 如果不超过 20 厘米,安检通过
  1. 如果没有车票,不允许进门
# 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. 从控制台输入要出的拳 —— 石头(1)/剪刀(2)/布(3)
  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. 正序九九乘法表

思路分析:

  1. 打印星星
  2. 使用嵌套循环打印阶梯星星
  3. 将星星替换成乘法口诀公式

使用嵌套循环打印星星

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. 分析
  1. 遍历所有的三位数
  2. 求 百位 十位个位  立方和
  3. 判断并打印
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

breakcontinue是专门在循环中使用的关键字

  • 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@^是否合法。

  1. 密码必须是数字、字母(大小写都可以)、和下划线,否则不合法
  2. 如果密码合法,就输出"密码合法"

分析

  1. 定义容器,保存所有的数字 字母 _
  2. for循环遍历密码中每一个元素
  3. 判断每一个元素是否合法
  4. 如果不合法,执行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. 完成随机的分配
  2. 打印办公室信息 (每个办公室中的人数,及分别是谁)

分析

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会自动解包分别赋值给name1name2name3三个变量

注意:左边变量的个数一定要和元组的元素个数保持一致

交换数据

交换数据在其它语言中的实现如下:

a = 10
b = 20
# 交换a和b
tmp = a
a = b
b = tmp

 可以利用元组的组包和解包特点,,速交换两个数据

a = 10
b = 20
# 交换a和b
a,b = b,a

上述交换,首先右边会进行自动组包,组成新的元组(20,10)

左边会把元组解包,元素分别赋值给ab,最终实现交换的功能

让列表不可修改

有时我们传递列表数据给别人使用,希望别人不要修改列表

可以把列表转换成元组,这样就变成了不可变的数据

lst = [10, 20, 30]
# 将列表转换成元组
tp = tuple(lst)

# 不可执行如下类似操作
tp[0] = 111
tp.append(222)

 如果运行执行会报出如下错误:TypeError: 'tuple' object does not support item assignment

六、函数基础

函数(function)是程序非常重要的组成部分,是计算机执行命令的单元;

所谓函数,就是把 具有独立功能的代码块 组织为一个整体,在需要的时候 调用;

使用函数可以提高编写的效率以及代码的重用

1. 函数的定义和调用

函数的使用包含两个步骤:

  1. 定义函数 —— 在函数中编写代码,实现功能
  2. 调用函数 —— 执行编写的代码
1.1. 函数的定义格式
def 函数名():
    函数封装的代码

def是英文define的缩写;

函数名的命名规则和变量的命名规则要保持一致

1.2. 函数的调用格式
函数名()
1.3. 第一个函数

需求

  1. 编写一个打招呼 say_hello 的函数,封装三行打招呼的代码
  2. 在函数下方调用打招呼的代码

实现

# 定义函数
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

ab属于形参,形参在函数调用的时候才赋值

7.2. 实参

全称为实际参数,是在调用时传递给函数的参数

sum(10, 20)

调用sum函数时传入的1020即是实参

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. 需求

  1. 程序启动,显示名片管理系统欢迎界面,并显示功能菜单
  2. 用户用数字选择不同的功能:新建名片、显示名片、查询名片、退出系统
    1. 用户名片需要记录用户的 姓名、电话、QQ、邮件
    2. 显示名片可以列举出所有已经保存的名片
    3. 如果查询到指定的名片,用户可以选择 修改删除 名片

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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/567627.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ESP32开发

1、简介 1.1 种类 WIFI模块在PC上做为客户端、服务器&#xff0c;在STM32上做服务器的通讯。在物联网应用开发有重要作用&#xff0c;种类居多&#xff0c;如下图 红色方框的esp8266-01s型号的无限wifi模块就是本章学习的主要对象。 1.2 特点 小巧的尺寸&#xff1a;ESP-01…

SpanBert学习

SpanBERT: Improving Pre-training by Representing and Predicting Spans 核心点 提出了更好的 Span Mask 方案&#xff0c;也再次展示了随机遮盖连续一段字要比随机遮盖掉分散字好&#xff1b;通过加入 Span Boundary Objective (SBO) 训练目标&#xff0c;增强了 BERT 的性…

python自动生成SQL语句自动化

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python自动生成SQL语句自动化 在数据处理和管理中&#xff0c;SQL&#xff08;Structured …

WAF防范原理

目录 一、什么是WAF 二、纵深安全防御 WAF的组网模式 WAF配置全景 WAF端 服务器 攻击端 拦截SQL注入&#xff0c;XSS攻击&#xff0c;木马文件上传 要求&#xff1a; 使用WAF&#xff0c;通过配置策略要求能防御常见的web漏洞攻击&#xff08;要求至少能够防御SQL、XSS、文…

毕业设计注意事项

1.开题 根据学院发的开题报告模板完成&#xff0c;其中大纲部分可参考资料 2.毕设 根据资料中的毕设评价标准&#xff0c;对照工作量 3.论文 3.1 格式问题 非常重要&#xff0c;认真对比资料中我发的模板&#xff0c;格式有问题&#xff0c;答辩输一半&#xff01; 以word…

wireshark RTP分析参数

主要看丢弃和Delta&#xff0c; 丢弃就是丢掉的udp包&#xff0c;所占的比率 Delta是当前udp包接收到的时间减去上一个udp包接收到的时间 根据载荷可以知道正确的delta应该是多少&#xff0c;比如G711A&#xff0c;ptime20&#xff0c;那么delta理论上应该趋近于20. 这里的de…

C++面向对象程序设计 - 运算符重载

函数重载就是对一个已有的函数赋予新的含义&#xff0c;使之实现新的功能。因此一个函数名就可以用来代表不同功能的函数&#xff0c;也就是一名多用。运算符也可以重载&#xff0c;即运算符重载&#xff08;operator overloading&#xff09;。 一、运算符重载的方法 运算符重…

# IDEA2019 如何打开 Run Dashboard 运行仪表面板

IDEA2019 如何打开 Run Dashboard 运行仪表面板 段子手168 1、依次点击 IDEA 上面工具栏 —> 【View】 视图。 —> 【Tool Windows】 工具。 —> 【Run Dashboard】 运行仪表面板。 2、如果 【Tool Windows 】工具包 没有 【Run Dashboard】 运行仪表面板 项 依次…

【好书推荐7】《机器学习平台架构实战》

【好书推荐7】《机器学习平台架构实战》 写在最前面《机器学习平台架构实战》编辑推荐内容简介作者简介目  录前  言本书读者内容介绍充分利用本书下载示例代码文件下载彩色图像本书约定 &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2024每日百字篆刻时光&…

STM32系统参数和结构

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 文章目录 1. 基本参数 2. 片上资源&#xff08;外设&#xff09; 3. STM32系列命名规则 4. 系统结构 5. 引脚定义 6. 启动配置 7. 最小系统电路 8. 型号分类和缩写 1. 基本参数 STM32F103C8T6 系列&#…

达梦(DM)数据库表索引

达梦DM数据库表索引 表索引索引准则其他准则 创建索引显式地创建索引其他创建索引语句 使用索引重建索引删除索引 表索引 达梦数据库表索引相关内容比较多&#xff0c;常用的可能也就固定的一些&#xff0c;这里主要说一下常用的索引&#xff0c;从物理存储角度进行分类&#…

B008-方法参数传递可变参数工具类

目录 方法参数传递可变参数冒泡排序Arrays工具类Arrays工具类常用方法 方法参数传递 /*** java中只有值传递* 基本数据类型 传递的是具体的值* 引用数据类型 传递的是地址值*/ public class _01_ParamPass {public static void main(String[] args) {// 调用方法 getSumge…

网络变压器在网络分析仪上能通过测试,装上设备后网速达不到呢?

Hqst华轩盛(石门盈盛)电子导读&#xff1a;今天和大家一起探讨网络变压器在网络分析仪上能通过测试&#xff0c;装上设备后网通设备网速达不到的可能原因及其处理方式 一、出现这种情况可能有以下原因&#xff1a; 1.1. 设备兼容性问题&#xff1a;设备其它元器件与 网络…

Docker容器化技术:概述与安装

目录 一、云基础知识 1、常见的云服务厂商 2、云计算服务模式三种层次 3、什么是虚拟化 4、什么是虚拟机 5、虚拟化产品 5.1 仿真虚拟化产品 5.2 半虚拟化产品 5.3 全虚拟化产品 6、虚拟机架构 6.1 寄居架构 6.2 源生架构 二、认识容器 1、容器的概述 2、容器的…

【Netty】ByteBuf与拆包粘包

ByteBuf 在介绍ByteBuf之前先来一套基础的代码来演示ByteBuf的使用。 package blossom.project.netty;import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled;import java.nio.charset.StandardCharsets;/*** author: ZhangBlossom* date: 2023/12/14 13:37* con…

web学习

day02-01 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>js快速引入</title> <!-- 内部脚本--> <!-- <script>--> <!-- alert(Hello JS)--> <!-- <…

【linux】匿名管道|进程池

1.进程为什么要通信&#xff1f; 进程也是需要某种协同的&#xff0c;所以如何协同的前提条件(通信) 通信数据的类别&#xff1a; 1.通知就绪的 2.单纯的数据 3.控制相关的信息 2.进程如何通信&#xff1f; 进程间通信&#xff0c;成本会高一点 进程间通信的前提&#xff0c;先…

制氢机远程监控运维方案

制氢机远程监控运维方案 在当今能源转型的大背景下&#xff0c;氢能作为清洁、高效且可再生的能源载体&#xff0c;其重要性日益凸显。而制氢机作为氢能产业链中的关键设备&#xff0c;其稳定运行与高效运维对于保障氢气供应、推动氢能产业健康发展至关重要。在此背景下&#…

动态规划——切割钢条问题

一、动态规划 动态规划算法通常用于解决最优化问题&#xff08;寻求最优解&#xff09;。其思想与分治法类似&#xff0c;将待求解的问题分成若干个子问题&#xff0c;先求出子问题&#xff0c;再根据子问题的解求出原来问题中的解&#xff0c;与分支法不同的是&#xff0c;在动…

Oracle使用内部包自定义创建表空间和用户

如果之前有类似的表空间,可以使用dbms自动生成对应的表空间和数据文件 select dbms_metadata.get_ddl(TABLESPACE,ts.tablespace_name) from dba_tablespaces ts; 可以使用类似的 SQL> set echo off SQL> spool /data/logs/create_tablespace.log SQL> select dbms…