集合类型及操作
集合类型定义
首先,什么是组合数据类型,组合数据类型就是一组数据,表达一个或多个含义
集合是多个元素的无序组合
集合类型与数学中的集合概念一致
集合元素之间无序,每个元素唯一,不存在相同元素
集合元素不可更改,不能是可变数据类型 为什么?
因为,集合类型要求集合中每个元素都要是唯一的,如果我们修改了一个数据类型,改变之后导致它跟集合类型中的元素重合了,那么就会报错了
集合用大括号 {} 表示,元素间用逗号分隔
建立集合类型用 {} 或 set()
建立空集合类型,必须使用set()
使用set()方法,它会使得每一个字符单独拆分变成集合中的一个元素,如果有相同的元素,那么多出去元素就被删除,因为在集合中是没有顺序的,无序的,所有它生成整理后的元素是无序的
集合操作符
4个增强运算符
增强符就是修改了修改了S中的集合,不使用增加符就没有修改S中的元素,只是返回一个结果
集合处理方法
将集合中的每个元素打印出来,直到集合为空退出循环
A=set("python")
try:
while True:
print(A.pop())
except:
pass
数据去重:集合类型所有元素无重复
利用了集合无重复元素的特点
还可以将集合转换为列表
序列类型及操作
序列是具有先后关系的一组元素
序列是一维元素向量,元素类型可以不同
元素间由序号引导,通过下标访问序列的特定元素
序列是一个基类类型
由序列扩展出来的字符类型,元组类型,列表类型,都十分的常用
序列处理函数及方法
元组类型定义
元组是序列类型的一种扩展
元组是一种序列类型,一旦创建就不能被修改
使用小括号 () 或 tuple() 创建,元素间用逗号 , 分隔
可以使用或不使用小括号
元组继承序列类型的全部通用操作
元组继承了序列类型的全部通用操作
元组因为创建后不能修改,因此没有特殊操作
使用或不使用小括号
列表类型及操作
列表是序列类型的一种扩展,十分常用
列表是一种序列类型,创建后可以随意被修改
使用方括号 [] 或list() 创建,元素间用逗号 , 分隔
列表中各元素类型可以不同,无长度限制
就是指针指向了这个内存地址
# 定义空列表lt lt=[] # 向lt新增5个元素 lt+=[1,2,3,4,5] # 修改lt中第2个元素 lt[2]=6 # 向lt中第2个位置增加一个元素 lt.insert(2,7) # 从lt中第1个位置删除一个元素 del lt[1] # 删除lt中第1-3位置元素 del lt[1:4] # 判断lt中是否包含数字0 0 in lt # 向lt新增数字0 lt.append(0) # 返回数字0所在lt中的索引 lt.index(0) # lt的长度 # len(lt) # lt中最大元素 max(lt) # 清空lt lt.clear()
序列类型应用场景
数据表示:元组 和 列表
元组用于元素不改变的应用场景,更多用于固定搭配场景
列表更加灵活,它是最常用的序列类型
最主要作用:表示一组有序数据,进而操作它们
基本统计值计算实例
#!/usr/bin/env python
# -- coding: utf-8 --
# @Time : 2023/3/28 17:44
# @File : 基本统计值计算实例.py
def getNum(): #获取用户不定长度的输入
nums = []
iNumStr = input("请输入数字(回车退出): ")
while iNumStr != "":
nums.append(eval(iNumStr))
iNumStr = input("请输入数字(回车退出): ")
return nums
def mean(numbers): #计算平均值
s = 0.0
for num in numbers:
s = s + num
return s / len(numbers)
def dev(numbers, mean): #计算方差
sdev = 0.0
for num in numbers:
sdev = sdev + (num - mean)**2
return pow(sdev / (len(numbers)-1), 0.5)
def median(numbers): #计算中位数
sorted(numbers)
size = len(numbers)
if size % 2 == 0:
med = (numbers[size//2-1] + numbers[size//2])/2
else:
med = numbers[size//2]
return med
n = getNum() #主体函数
m = mean(n)
print("平均值:{},方差:{:.2},中位数:{}.".format(m, dev(n,m),median(n)))
这段代码实现了一个基本的统计值计算实例,包括获取用户输入的数字,计算平均值、方差和中位数,并输出结果。
具体实现过程如下:
-
定义了一个函数
getNum()
,用于获取用户不定长度的输入,并将输入的数字存储在一个列表中。 -
定义了一个函数
mean(numbers)
,用于计算平均值。遍历列表中的每个数字,累加总和,最后除以数字个数得到平均值。 -
定义了一个函数
dev(numbers, mean)
,用于计算方差。遍历列表中的每个数字,计算它与平均值之间的差的平方,然后累加总和。最后除以数字个数减一,再开平方根即可得到方差。 -
定义了一个函数
median(numbers)
,用于计算中位数。先对列表进行排序,然后根据列表长度的奇偶性,取中间位置或者中间两个位置的数字,进行平均计算即可得到中位数。 -
主体函数中,调用
getNum()
获取用户输入的数字,然后分别调用mean()
、dev()
和median()
进行计算,并将结果格式化输出。
需要注意的是,这段代码存在一些潜在的问题,例如:
-
在
median()
函数中,虽然使用了sorted()
函数进行排序,但是并没有将排序结果赋值给原列表,因此排序是无效的。 -
在输出结果时,使用了字符串格式化,并使用了浮点数的精度控制,但是由于浮点数的精度问题,可能会导致结果不准确。
-
在输入数字时,使用了
eval()
函数进行求值,可能存在安全风险,应该使用更加安全的方式进行输入。
下面是对这段代码的优化:
-
在
median()
函数中,将排序结果赋值给原列表,以便使用排序后的列表进行中位数计算。 -
在输出结果时,使用了
format()
方法进行字符串格式化,并使用了:.2f
控制浮点数的精度,避免了浮点数精度问题。 -
在输入数字时,使用了
try-except
结构进行异常处理,避免了使用eval()
函数带来的安全风险。 -
对代码进行了注释,增加了可读性。
下面是优化后的代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2023/3/28 17:44
# @File : 基本统计值计算实例.py
def getNum():
"""
获取用户输入的数字,返回一个列表
"""
nums = []
while True:
try:
iNumStr = input("请输入数字(回车退出): ")
if iNumStr == "":
break
nums.append(float(iNumStr))
except:
print("输入错误,请重新输入!")
return nums
def mean(numbers):
"""
计算平均值
"""
s = 0.0
for num in numbers:
s += num
return s / len(numbers)
def dev(numbers, mean):
"""
计算方差
"""
sdev = 0.0
for num in numbers:
sdev += (num - mean) ** 2
return (sdev / (len(numbers) - 1)) ** 0.5
def median(numbers):
"""
计算中位数
"""
numbers.sort()
size = len(numbers)
if size % 2 == 0:
med = (numbers[size // 2 - 1] + numbers[size // 2]) / 2
else:
med = numbers[size // 2]
return med
if __name__ == '__main__':
n = getNum()
m = mean(n)
d = dev(n, m)
md = median(n)
print("平均值:{:.2f}, 方差:{:.2f}, 中位数:{:.2f}.".format(m, d, md))
这样,代码就更加安全、可读、易用了。