嵌入式Python基础1-2

news2024/11/25 3:21:11

嵌入式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)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Collection与数据结构] PriorityQueue与堆

1. 优先级队列 1.1 概念 前面介绍过队列&#xff0c;队列是一种先进先出(FIFO)的数据结构&#xff0c;但有些情况下&#xff0c;操作的数据可能带有优先级&#xff0c;一般出队列时&#xff0c;可能需要优先级高的元素先出队列&#xff0c;该中场景下&#xff0c;使用队列显然…

持续更新。。。

1、JAVA面试指南 https://javaguide.cn/ 简历优化&#xff1a;突出与应聘职位相关的项目经验、技术栈、技能证书和专业成就。确保简历中的技术关键词与JD&#xff08;Job Description&#xff09;相符。 自我评估&#xff1a;对照目标职位要求&#xff0c;梳理自身Java技能树&…

mac安装nvm管理node(手残流,git下载)

1. 准备 首先电脑里得有brew、git、vscode&#xff0c;看这里安装brew、git&#xff0c;看这里安装vscode。 我本人比较low&#xff0c;mac命令也记不熟&#xff0c;本篇就是git下载nvm&#xff0c;vscode看配置&#xff0c;省心不动脑子就可以了。 2. 清理node 如果mac里没…

Xshell正版免费使用(学生党)

话不多说&#xff0c;上链接 https://www.xshell.com/zh/free-for-home-school/

Introducing Meta Llama 3: The most capable openly available LLM to date

要点 今天&#xff0c;我们推出 Meta Llama 3&#xff0c;这是我们最先进的开源大型语言模型的下一代。Llama 3型号将很快在AWS&#xff0c;Databricks&#xff0c;Google Cloud&#xff0c;Hugging Face&#xff0c;Kaggle&#xff0c;IBM WatsonX&#xff0c;Microsoft Azur…

Linux学习:文件描述符fd

目录 1. 引子2. C语言文件接口2.1 文件的打开与关闭的操作2.2 文件写入读取操作2.3 当前路径 3. 文件I/O操作与系统调用3.1 程序默认打开的文件流3.2 操作系统访问文件的系统调用接口3.2.1 文件打开与关闭操作3.2.2 写入与读取操作 4. 什么是文件描述符fd4.1 进程与文件的关系4…

【笔记】Telephony SIM SPN及运营商名称显示数据来源介绍

来源介绍 网络名称显示 来源及优先级&#xff08;高到低&#xff09; SourceCommentEnhanced Operator Name String(Eons) 名称信息存放&#xff1a; EF_PNN(PLMN Network Name, fid: 6FC5) &#xff1a;LAC和EF_PNN中的Record Identifier EF_OPL(Operator PLMN List, fid: 6FC…

RBA认证是什么?RBA认证的流程是怎么样的

RBA认证&#xff0c;即“责任商业联盟”认证&#xff0c;英文全称是Responsible Business Alliance。这是一个为电子行业或以电子为主要组成部分的行业及其供应链制定的社会责任审核标准。该标准旨在确保工作环境的安全、工人受到尊重并富有尊严、商业营运合乎环保性质并遵守道…

【AI】如何让局域网PC能够访问langchain框架的AI服务

【背景】 在单位内部成功运行了langchain服务&#xff0c;但是发现本地可以用默认8000端口访问&#xff0c;但是局域网内其它机器却无法访问服务页面。 【分析】 首先查看项目文件夹中的server.py。由于这个server.py的存在&#xff0c;我一开始以为langchain整套框架的服务…

哪些因素影响了PCB电路板切割精度?

PCB电路板切割是电子制造过程中一个至关重要的环节&#xff0c;其精度对后续工序的质量和效率具有决定性影响。因此&#xff0c;了解影响PCB电路板切割精度的原因&#xff0c;对于提高电子产品的质量和生产效率具有重要意义。 1. PCB分板机稳定性 PCB分板机的性能直接影响到切…

中国AIGC最值得关注企业产品榜单揭晓!首份应用全景图谱发布

组委会 发自 凹非寺 量子位 | 公众号 QbitAI “你好&#xff0c;新应用&#xff01;” 站在大模型落地元年&#xff0c;是时候喊出这句话了。 从软件APP、智能终端乃至具身智能等等&#xff0c;AIGC开始席卷一切。 大模型玩家、互联网巨头、终端厂商、垂直场景玩家纷纷入场…

web测试基础知识

目录 web系统的基础 web概念(worldwideweb) 网络结构 发展 架构 B/S C/S P2P 工作原理 静态页面 动态页面 web客户端技术 浏览器的核心--渲染引擎 web服务器端技术 web服务器 应用服务器 集群环境 数据库 案例-URL 协议类型 主机名 端口 IP地址 分类 …

Ubuntu 安装 Harbor

一、安装 docker 原文参考传送门 1st 卸载系统自带的 docker 应用 for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done 2nd 设置Docker 的apt源 # Add Dockers official GPG key: sudo…

翻译《The Old New Thing》 - Some reasons not to do anything scary in your DllMain

Some reasons not to do anything scary in your DllMain - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20040127-00/?p40873 Raymond Chen 2004年01月27日 简介 这篇文章讨论了为什么不应该在DLL的DllMain函数中执行复杂的操作 正文 众所…

SAP DMS创建文档根目录操作简介

前面我们已经对DMS的后台进行了系统的配置,本文开始我们对DMS的前台操作进行说明 1、CV01N创建文档 注意:EDIPUBLICROOTFOLDER为根目录的凭证号,不允许更改。 输入好后回车。进入下图所示: 点击文档浏览器,进入下一屏如下图: 注意:点击创建新的私人文件夹按创建是创…

使用CSS3 + Vue3 + js-tool-big-box工具,实现炫酷五一倒计时动效

时间过得真是飞速&#xff0c;很快又要到一年一度的五一劳动节啦&#xff0c;今年五天假&#xff0c;做好准备了吗&#xff1f;今天我们用CSS3 Vue3 一个前端工具库 js-tool-big-box来实现一个炫酷的五一倒计时动效吧。 目录 1 先制作一个CSS3样式 2 Vue3功能提前准备 3…

基于DEAP数据集的四种机器学习方法的情绪分类

在机器学习领域&#xff0c;KNN&#xff08;K-Nearest Neighbors&#xff09;、SVM&#xff08;Support Vector Machine&#xff09;、决策树&#xff08;Decision Tree&#xff09;和随机森林&#xff08;Random Forest&#xff09;是常见且广泛应用的算法。 介绍 1. KNN&am…

windows本地提权--令牌窃取烂土豆UAC

免责声明:本文仅做技术交流与学习,请知法守法,不要乱搞破坏等等... 目录 一.令牌窃取 操作: 1-生成-->上传后门后,让msf上线 2-执行命令 二.烂土豆(MS16-075) 操作: 1-先让MSF上线 2-上传烂土豆 3-执行命令 三.UAC(用户账户控制) 1-MSF模块提权 2-UACME 项目(yy…

Kafak详解(1)

简介 消息队列 为什么要有消息队列 图-1 消息队列的使用 消息队列 1)消息Message&#xff1a;网络中的两台计算机或者两个通讯设备之间传递的数据。例如说&#xff1a;文本、音乐、视频等内容。 2)队列Queue&#xff1a;一种特殊的线性表(数据元素首尾相接)&#xff0c;特…

应对电网挑战!lonQ与橡树岭国家实验室利用量子技术改善关键基础设施

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨浪味仙 排版丨沛贤 深度好文&#xff1a;1800字丨6分钟阅读 摘要&#xff1a;美国电网正在面临需求增加和能源扩散的挑战&#xff0c;对能够应对优化和安全挑战的创新解决方案有着迫切需求…