☰
Python(二)—— 数据存储与运算、数据逻辑处理、数据容器
2026/10/22 13:04:07 网站建设 项目流程

一、数据存储与运算

1.字面量与变量

(1)字面量

指程序中,直接书写的固定值,就称为字面量(就是前端里const的那些静态变量)

这里主要需要注意,布尔值的首字母大写(布尔值实际上就是数字类型0和1,如果输出False-1的话,就是0-1=-1)

(2)变量

程序中用来存储单个数据的容器,通常会把经常发生变化的数据存储在变量中。

变量指的是存储这个数据的容器,而不是指存储在里面的数值

而且python是动态类型语言,也就是一个变量可以接收不同类型的值,但是开发当中,一般一个变量还是接受一种类型的值。

# 变量 num = 111 print(num)

也不用let、const、int啥的了,直接写

before = 20.7 incr = 50 # 可以直接写成: before,incr = 20.7,50

这是连续定义多个变量并连续赋值

2.数据类型

(1)标识符

标识符是python中为变量、类、函数等元素所起的名字,规则:

  • 只能包含字母、数字和下划线
  • 不能以数字开头
  • 不能使用关键字
  • 严格区分大小写

(2)获取变量类型

查看数据类型用type(),变量本身没有数据类型,type()这个就用来看变量里的数据的类型的

或者用isinstance(数据,类型),返回True就是对的

a="hello world" print(type(a)) #输出了:<class 'str'>

(3)字符串的三种定义方式

  • 双引号""
  • 单引号''
  • 三引号(用于多行)
str0 = """ 啦啦啦 我最开心 祝你也开心 """ print(str0) #三个单引号也可以 '''

(4)转义字符

str1 = 'It\'s a apple' print(str1)

(5)字符串格式化

a.拼接方式+str()转换

字符串拼接用+号,非字符串类型的就要先转换成字符串的,转换字符串方法:str()

b.占位符

用%占位符,之前学c语言也差不多是这样的,但是感觉没有c的那种顺手,老想加逗号

python这里的话就是前面' '是原始字符串,后面%之后的都是要填充进去的变量

a = 'tt' print('大家好我是%s' %a) b = '人生苦短' c = '我学python' print('%s,%s' %(b,c))

%s是不管什么类型都自动转为字符串放进去

%d整数

%f浮点数

c. f{变量}(最推荐!)
b = '人生苦短' c = '我学python' print(f'大家好,{b},{c}')

这种的话就更类似vue里的{{ }}了

3.输入与输出

input是输入,print是输出

s=input("请输入你的名字")

然后名字就到了s变量里去,注意无论输入的是什么类型的数据,获取到的数据永远都是字符串类型的

输入的内容如果想转为数字类型的话就int(),可以直接这样:

num = int(input("请输入数字:"))

但是为了防止用户输入的是小数用int转换报错的话直接都转为浮点类型

num = float(input("请输入数字:"))

4.运算符

(1)算术运算符

算术运算符的优先级 ** > * > // > % > + -(括号优先级最高)

(2)比较运算符

现在知道为啥大一c语言老师说学会了c其他的都好说了(起码在python这里是这样的)

注意除法的运算结果是小数,也就是:

num = 850 num /= 10 # 85.0

浮点数再和其他整数进行运算的时候结果都会是浮点数

(3)比较运算符

(4)逻辑运算符

二、数据的逻辑处理

1.if条件判断

if xxx :

elif xxx :

else :

这块把()改成了冒号:,并且只有四个空格才是属于之前花括号的内容(Python里用空格表示层级关系)

(我的想法是不如花括号)

num = 685 if num > 600: print("我就去上985") print("清华也行") else: print("我就去211") print("这句会输出吗")

2.模式匹配match语句

match 条件 : case pattern_1: # 执行块 case pattern_2 | pattern_3: # 执行块 case _: # 通配符,相当于默认情况 # 执行块

match里如果想用与 或的话

或用 |

与用 case xx if yyy:

其中yyy里还可以正常用and 和 or

3.循环

(1)while循环

a = 1 while a < 10: a += 1 print(f"a:{a}") else: print("结束拉")

(2)for循环

for循环的循环变量由迭代器自动赋值,while则是由你自己初始化和更新,容易死循环,for就不容易

s = 'hello-world' for i in s: print(f"{i}") else: print("结束咯")

while关注的是循环的条件

for关注的是遍历的每一个元素

但是python里的for里的条件只能是for 元素 in 某个集合:

所以就不能写条件之类的,假如说我要找0-100之间的数还得先找出这个集合,可以用range()

需要注意range里不包含end!

(3)嵌套循环

打印一个10个*宽,5个*高的长方形

x = range(0,10) y = range(0,5) for i in y: for j in x: print('*', end='') else: print("\n")

注意print('*')默认end='\n'

ai帮我改进了一下,利用默认\n其实可以不写else,我上面那个打印的其实是换行了两次

for i in range(0, 5): for j in range(0, 10): print('*', end='') print() # 每行结束换行
打印9*9乘法表
for i in range(0,10): for j in range(1,i+1): print(f"{i}*{j}={i*j} ", end='') print()

三、数据容器

1.定义

一份可以容纳多个数据的数据类型(容器),其中每一个数据都可以是任意数据类型

2.分类

  • 列表list
  • 字符串str
  • 元组tuple
  • 集合set
  • 字典dict

这些类型不只是定义,在type()输出的时候也会输出这些单词的

3.列表list

(1)定义

列表是用方括号括起来的,s=[元素1,元素2,元素3,元素4、、、]

本质是Array,js里的数组本质是Object

(2)特点

  • 可以存储不同类型的数据(但是实际项目中一般存储的都是同一种类型的数据)
  • 元素有序,可以重复,可以任意修改

有序那么就可以用s[0] s[1]这种获取元素,同时python还为我们提供了反向索引,就是s[-1]指的是倒数第一项,s[-2]是倒数第二项

容器中元素按特定顺序排列的,可以通过索引访问的容器类型称之为序列,列表就是个序列

(3)删和改(这里的删和改是对整个list的,不是对里面的某个元素)

改

直接用索引拿到那个元素然后赋值就可以了

s[1] = 'hi'

但是如果数组长度为5,我访问了s[10]的话就会报错,索引超出了范围

删

用del删除指定项

del s[2]

(4)切片

定义:切片就是截取某一部分进行操作,list、str、元组都支持切片(序列类型都支持切片)

语法:序列数据[开始索引:结束索引:步长]

这里很像那个range,我本来还觉得为啥不用一样的语法,这样想就明白了:

range是在生成一个整数序列(可迭代对象),其实是在调用函数,穿参用逗号隔开

但是切片是对一个已经存在的序列做“取子段”操作,用方括号更像是“隔开”的动作

特点:

  • 不包含结束索引处对应的元素,开始索引未指定默认0,结束未指定默认结束位置,步长默认1(这块跟range一样)(如果省略的话就比如 s[:::]
  • 索引正反向都可以
s = ['a','b','c','d','e','f'] print(s[0:5:2])

但是这个最多写俩冒号,s[:]和s[::]表示整个序列的浅拷贝(内层地址依旧共享),不能写s[:::]

s[1:]和s[:5]分别是指定起终点,s[::2]指定步长

(5)常用方法

让用户输入10个数存到list中,并输出最大、最小、平均数
i = 0 s = [] sum0 = 0 while i < 10: j = int(input("请输入数字!")) sum0 += j s.append(j) i += 1 s.sort() print(s[0]) print(s[-1]) print(sum0/10)

合并数组并去重
s1 = [33,22,7,8,5,14,65,73,22] s2 = [22,56,3,5,89,7,1] s0 = [] for i in s1: if i in s0: print('这个数已经有了') else: s0.append(i) print(s0) for i in s2: if i in s0: print('这个数已经有了2') else: s0.append(i) print(s0)

我本来不知道一个数在一个数组里已经有了应该怎么判断,原来用in就行(用not也行,就可以省略else)

4.字符串str

(1)定义

字符串是字符的容器,一个字符串可以放任意数量的字符

(2)特点

  • 不可变性(无法修改)、有序、可迭代(就是可以用for循环之类的)
  • 每个元素也有对应的下标
  • 正常索引和反向都可以

我纳闷能通过下标获取到为什么还不能改?

设定就是可以get不能set修改,因为字符串是python里最常用的字典键,所以他必须不可变才能可靠的做键

(3)切片

语法:序列数据[开始索引:结束索引:步长]

和list的一样

(4)常用方法

验证邮箱格式是否正确,至少包含一个@和至少一个.

email0 = input('请输入邮箱') if email0.count('@') == 1 and email0.find('.'): print('邮箱正确') else: print('邮箱错误')

5.元组tuple

(1)定义

元组是不可变的序列,类似list,但是元组创建后不可修改

元组名称 = (元素1,元素2,元素3、、)

定义空元组:元组名称 = () 或元组名称 = tuple()

(已经有list那种可以存储各种类型的数据之后为什么还需要元组呢?因为有些场景想只读不能改,就用到元组)

(2)特点

  • 可以存储不同类型的元素(类似list)
  • 元素可以重复、有序、不可修改(支持索引访问、切片)(类似str)

(3)基本操作

count()某个元素出现的次数

index()查询某个元素第一次出现的索引位置

但是注意如果元组里只有一个元素的时候,还有另一种含义是表达式的括号,那时候type就不一定是tuple了

t = (100) # 这种就是int类型

需要加逗号区分开 t = (100,)

(4)组包和解包

a.组包:将元素合并到一个容器(元组、列表)中

b.解包:将容器(元组、列表)解开为独立的元素,分别赋值给多个变量

a = (1,2,3,4,5,6) b,*c,d = a print(b,c,d)

类似解构赋值,*表示我要收集的所有元素

三个变量换值

a = 100 b = 200 c = 300 s = (a,b,c) d,e,f = s a = f b = d c = e print(a,b,c)

算成绩

students = ( ("s001","王林",85,92,78), ("s002","十三",78,85,82), ("s003","王卓",96,88,87) ) total = [] pingjun = [] yuwen = [] shuxue = [] yingyu = [] for i in students: total.append(i[2]+i[3]+i[4]) avg = ((i[2]+i[3]+i[4]) / 3) pingjun.append(avg) if avg > 90: print(f"当前学生超过90了,平均分:{avg},名字叫:{i[1]},学号:{i[0]}") # 3. yuwen.append(i[2]) shuxue.append(i[3]) yingyu.append(i[4]) print(total,pingjun) # 1. yuwen.sort() shuxue.sort() yingyu.sort() print(yuwen[0],yuwen[2],(yuwen[0]+yuwen[1]+yuwen[2])/3) # 2.依次

还可以用解包,for i in students:

改成 for id,name,chinese,math,english in students:

这种就把那些数据都解包了,就不需要再用下脚标的方式去拿了

6.集合set

(1)定义

集合set是一种无序的、不可重复、可修改的数据容器(自动去重,可以去存储身份证、手机号那些数据)

# 集合 s1 = {'a','b','c','d'} # 空集合 s1 = set()

注意这里的空集合不能用s1 = {},{}表示的是空字典

(2)特点

  • 无序的(不能通过索引访问元素)
  • 不可重复(存储了重复的也可以自动去重)
  • 可修改的

(3)方法

统计学生选课情况

# 选修足球学生名单 football_set = {"王林", "曾牛", "徐立国", "遁天", "天运子", "韩立", "厉飞雨", "乌丑", "紫灵"} # 选修篮球学生名单 basketball_set = {"张铁", "墨居仁", "王林", "姜老道", "曾牛", "王蝉", "韩立", "天运子", "李化元", "厉飞雨", "云露"} # 选修法语学生名单 french_set = {"许木", "王卓", "十三", "虎咆", "姜老道", "天运子", "红蝶", "厉飞雨", "韩立", "曾牛"} # 选修艺术学生名单 art_set = {"遁天", "天运子", "韩立", "虎咆", "姜老道", "紫灵"} # 1 s1 = french_set.intersection(art_set) s2 = football_set.intersection(basketball_set) # 2 s3 = s1.intersection(s2) # 3 football_set.difference(basketball_set) # 4 all_students_list = [] for s in football_set: all_students_list.append(s) for i in basketball_set: all_students_list.append(i) for j in french_set: all_students_list.append(j) for t in art_set: all_students_list.append(t) for i in all_students_list: print(f"{i}{all_students_list.count(i)}")

其实好多方法想用的时候发现已经有点串了

有内置的方法max()、min() 、len()、sum()

7.字典dict

(1)定义

使用键值对来存储数据,每一个键都对应一个值,通过键(key)可以找到对应的值(value)

s1 = {key:value,key1:value1,key2:value2} # 空字典 s1 = {} s1 = dict()

(2)特点

  • 键值对(key:value)存储
  • 键(key)不能重复
  • 可修改

注意value可以是任意类型的,但是key必须是不可变类型的,dict、list、set这种就不行

(3)常用操作

增和改都是一样的,因为字典的本质是哈希表

dict1["aa"]这种就是先去找key “aa",有的话就直接改value,没有的话就新找一块空地把这个键值对塞进去

这里的pop删除:

d = {"list": [1, 2],"strr":"hello"}

像这种数据被pop删除key之后,如果对应的value之前没有变量指向的话就会被python回收掉

如果被pop之前也被其他变量指向过的话还会存在其他变量里

如果pop的同时你用一个新变量接住了的话 a = d.pop("strr")的话就用a指向了“hello”

del也是,del之前有其他变量指向删除键值对的话,del之后键值对也没有消失,还被那个变量指向,除非全部删除

购物车系统

# 购物车 k = "true" shop_cart = {} while k == "true": i = input(""" 请选择你要进行的操作! 1.添加购物车 2.修改购物车 3.删除购物车 4.查询购物车 5.退出购物车 """) match i: case "1": shop_cart[input("请输入商品名称:")] = { "price": input("请输入商品价格:"), "num": input("请输入商品数量:") } case "2": name1 = input("请输入要修改的商品名称:") if name1 not in shop_cart: # 这里我本来写的if not shop_cart[name1],但是这种没有的话直接崩溃了,所以还是用in print("您输入的商品不存在购物车内") else: shop_cart[name1] = { "price": input("请输入商品价格:"), "num": input("请输入商品数量:") } case "3": name2 = input("请输入要删除的商品名称:") if name2 not in shop_cart: # 这里我本来写的if not shop_cart[name1],但是这种没有的话直接崩溃了,所以还是用in print("您输入的商品不存在购物车内") else: del shop_cart[name2] case "4": name3 = input("请输入要查询的商品名称:") if name3 not in shop_cart: # 这里我本来写的if not shop_cart[name1],但是这种没有的话直接崩溃了,所以还是用in print("您输入的商品不存在购物车内") else: print(f"商品价格:{shop_cart[name3]['price']},商品数量:{shop_cart[name3]['num']}") case "5": k = "false" print("退出成功!")

好像我大一的时候做的大作业,当时都写不出来还是网上找的,想穿越回去当计算机大神

三、数据容器对比

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询