python语言程序设计(MOOC 嵩天)第六章 学习笔记(0221)

第六章 组合数据类型

前课复习

数据类型及操作:
整数类型的无限范围及四种进制表示
浮点数类型的近似无限范围、小尾数及科学记数法
二元操作符、二元增强赋值操作符
系列函数

字符串类型及操作:
递增递减与索引切片
操作符及函数

程序的分支结构:
单分支 if 二分支 if-else 及紧凑形式
多分支 if-elif-else 及条件之间的关系
分支中条件判断的相关操作符
异常处理 try-except-else-finally

程序的循环:
for in 的遍历循环
while 的无限循环
continue 和break 保留字
循环 else 的高级用法

函数的定义和使用:
def 定义函数 lamba定义匿名函数
可选参数-赋初值、可变参数- *b、名称传递
return 返回任意多个结果
global 声明全局变量

代码复用和函数递归:
模块化设计的松耦合、紧耦合
函数递归的基例和链条
函数递归的实现-- 函数+分支结构

6.1 集合类型及操作

6.1.1集合类型定义

集合是多个元素的无序组合
集合定义与数学一致
集合元素之间无序且唯一
集合元素不可更改,不能为可变数据类型
集合用 {} 表示,元素之间用逗号分隔
建立集合类型使用 {} 或 set {}
建立空集合必须使用 set {}

6.1.2 集合操作符

六个基本操作符:
S | T 并,返回新集合,包括在集合S、集合T中所有元素
S - T 减,返回新集合,包括在集合S但不在集合T的所有元素
S & T 交,返回新集合,包括同时在集合S、集合T中的元素
S ^ T 补,返回新集合,包括集合S、集合T中的非相同元素
S < 或 <= T,返回True or False ,判断S是否为T的子集
S > 或 >= T,返回True or False ,判断S是否包含T
增强赋值操作符:
S |= T 并,更新集合S,包括在集合S、集合T中所有元素
S -= T 减,更新集合S,包括在集合S但不在集合T的所有元素
S &= T 交,更新集合S,包括同时在集合S、集合T中的元素
S ^= T 补,更新集合S,包括集合S、集合T中的非相同元素

6.1.3 集合的处理方法

S.add(x) 在集合S中加入元素x,若x已经存在不报错
S.discard(x) 在集合S中删除元素x,若本没有x不报错
S.remove(x) 在集合S中删除元素x,若本没有x报错Key Error
S.clear() 移除S中所有元素
S.pop()在S中随机取出并删除一个元素,若S本为空则Key Error
S.copy 返回一个S集合的副本
len(s) 返回集合S元素的个数
x in S 判断元素x是否在集合S中,返回True or False
x not in S 判断元素x是否不在集合S中,返回True or False
set(x) 将未知类型的x转变为集合类型

eg:执行pop函数,不断取出元素直至空,error时执行pass

try:
	while True:
		print (A.pop(),end="")
except:
	pass

6.1.4 集合类型应用类型

包含关系、数据去重

6.2 序列类型及操作

元组、列表

6.2.1 序列类型定义

序列是具有先后顺序的一组元素
序列是一维元素向量,内部元素可以相同,元素类型可以不同
#类似数学元素序列
元素间由序号进行引导,可以通过下标访问序列的特定元素
序列类型是一个基类类型:字符串、元组、列表
在序列类型中,元素存在正向递增、反向递减的序号索引关系

6.2.2 序列处理函数及方法

python语言程序设计(MOOC 嵩天)第六章 学习笔记(0221)_第1张图片
六个操作符:
x in s : 若x是序列s的元素,返回True,否则返回False
x not in s : 如果x是序列s的元素,返回False,否则返回True
s + t : 连接两个序列s和t
sn or ns : 将序列s复制n次
s [j] : 索引,返回序列s中的第i个元素
s [i:j] or s [i:j:k] :切片,返回序列s中第i到j,以k为步长的元素
子序列
python语言程序设计(MOOC 嵩天)第六章 学习笔记(0221)_第2张图片
函数和方法:
len(s) :返回序列s的长度
min(s) : 返回序列s中的最小元素,前提是元素可比较
max(s) :返回序列s中的最小元素,前提是元素可比较
s.index(x) or s.index(x;i;j) :返回s中从i到j位置第一次出现x的位置
s.count(x) :返回序列s中出现元素x的次数

6.2.3 元组类型及操作

元组是序列类型的一种扩展,一旦创建就不能修改
使用()或 tuple()创建,元素间逗号分隔
元组类型将元素进行有序排列,使用括号进行组织
元组类型继承了序列类型的所有通用操作
元组类型创建后无法修改,因此没有特殊操作

6.2.4 列表类型及操作

元组是序列类型的一种扩展,创建后可以随意修改
使用 [] 或 list()真正创建列表,元素间逗号分隔
#使用 = 赋值,给列表起一个第二名称,两个名称指向同一列表
列表中各元素类型可以不同,且没有长度限制
python语言程序设计(MOOC 嵩天)第六章 学习笔记(0221)_第3张图片
基本操作:
ls [i] = x:替换列表ls第i元素为x
ls [i:j:k] = lt:用列表lt替换ls切片后所对应元素子列表
del ls [i]:删除列表ls中第i元素
del ls [i:j:k]:删除列表ls中第i到第j以k为步长的元素
ls += lt:更新列表ls,将列表lt中元素增加到列表ls中
ls *= n:更新列表ls,将其中元素重复n次
python语言程序设计(MOOC 嵩天)第六章 学习笔记(0221)_第4张图片
加强函数操作:
ls.append(x):在列表ls最后增加一个元素x
ls.clear():删除列表ls中所有元素
ls.copy():生成一个新列表,赋值ls中所有元素
ls.insert(i,x):在列表ls中第i位置增加元素x
ls.pop(i):将列表ls中第i位置元素取出并删除该元素
ls.remove(x):将列表ls中出现的第一个元素x删除
ls.reverse():将列表ls中的元素反转

6.2.5 序列类型应用场景

数据表示
元组:用于数据不改变的场景,更多用于固定搭配场景
#如:return
列表:最常用的序列类型

列表遍历:
for item in ls:
<语句块>
元组遍历:
for item in tp:
<语句块>

#使用元组对某个数据进行保护
#程序之间的接口由元组类型的数据进行传递

6.3 基本统计值计算

获取多个数据:从控制台获取多个不确定数据
分隔多个函数:模块化设计
充分利用函数:充分使用python的内置函数

原文代码:

#获得输入
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)))

存在问题:
问题1:计算方差时,对len(numbers)进行-1操作
关于方差的定义存在问题,关键差异在于总体和标准
python语言程序设计(MOOC 嵩天)第六章 学习笔记(0221)_第5张图片
问题2:计算中位数,sorted返回新的列表,没有对numbers进行修改,所以求取中位数时使用的旧版本numbers
修改后:

#获得输入
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),0.5)	#开平方
#计算中位数,//整数除法
def median(numbers):
    numbers.sort()	#对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)))		
#格式化输出

6.4 字典类型及操作

6.4.1 字典类型的定义

映射是一种键-索引和值-数据之间的对应关系
序列类型由0~N的整数作为数据的默认索引
映射类型由用户为数据定义索引
字典类型是数组组织与表达的新型态

字典类型是映射的体现:
键值对:键是数据索引的扩展
字典:键值对的集合,键值对之间无序
字典:{} or dict() 创建,键值对用冒号表示,元素之间逗号分隔

6.4.2 字典类型操作函数及处理方法

python语言程序设计(MOOC 嵩天)第六章 学习笔记(0221)_第6张图片
del d[k]:删除字典d中键k对应的数据值
k in d:判断键k是否在字典d中,在则返回True,否则False
d.keys():返回字典d中所有的键信息
d.values():返回字典d中所有的值信息
d.items():返回字典d中所有键值对信息
python语言程序设计(MOOC 嵩天)第六章 学习笔记(0221)_第7张图片
d.get(k,):键k存在,则返回相应值,不在则返回default
d.pop(k,):键k存在,则取出相应值,不在则返回default
d.popitem():随机从字典中取出一个键值对,以元组形式返回
d.clear():删除所有键值对
len(d):返回字典d中元素的个数

6.4.3 字典类型的应用场景

映射的表达:如数据统计
最主要作用:表达键值对数据,进而操作
根据键对字典进行遍历:for k in d~

6.5 jieba库的使用

6.5.1 jieba库的基本介绍

jieba:优秀的中文分词第三方库
通过中文词库进行识别分词
计算汉字之间构成词语的关联概率

6.5.2 jieba库的使用说明

精确模式:把文本精确的切分开,不存在冗余单词(常用)
全模式:把文本中所有可能的词语都扫描出来,存在冗余
搜索引擎模式:在精确模式下,对长词再次分割

jieba.lcuts(s):精确模式下,返回一个列表类型的分词结果
jieba.lcuts(s,cut_all=True):全模式,返回列表类型结果(冗余)
jieba.lcut_for_search(s):搜索引擎模式,返回列表结果(冗余)
jieba.add_word(w):向字典中增加新词w

6.6 文本词频统计

6.6.1 英文–Hamlet词频统计

(1)英文文本分词程序

#CalHamletV1.py
#获得归一化文本
def getText():
    txt = open("hamlet.text","r").read()		#打开并读取文件
    txt = txt.lower()		#将所有字母变为小写
    for ch in '!"#$&()*+,-./:;<=>?@[\\]^_{|}`~':
        txt = txt.replace(ch," ")		#遇到特殊符号,用空格替代
    return txt
hamlet = getText()
words = hamletTxt.split()		#根据空格切割为列表格式
counts = {}					#建立空词典
for word in words:		#如果键word在词典中,则get值并赋值+1
    counts[word] = counts.get(word,0)+1		#如果键word不在词典中,则返回0并赋值+1
items = list(counts.items())	#将所有键值对取出并以列表格式保存
items.sort(key=lambda x:x[1],reverse=True) #按照第二位,大到小排序
for i in range(10):		#输出次数最多的前10位
    word,count = item[i]
    print("{0:<10}{1:>5}".format(word,count))	#格式化输出

(2)中文文本分词程序

#CalThreeKingdomsV1
import jieba
txt = open("threekingdoms.txt","r",encoding="utf-8").read()
excludes = {"将军","却说","荆州","二人","不可","不能","如此"}
words = jieba.lcut(txt)
counts = {}
for word in words:
    if len(word) == 1:
        continue
    elif word == "诸葛亮" or word == "孔明曰":
        rword = "孔明"	#三者都视为孔明
    elif word == "关公" or word == "云长":
        rword = "关羽"
    elif word == "玄德" or word == "玄德曰":
        rword = "刘备"
    elif word == "孟德" or word == "丞相曰":
        rword = "曹操"
    else:
        rword = word
    counts[word] = counts.get(word,0)+1
for word in excludes:	#遇到excludes中的元素,删除这个键
    del counts[word]
items = list(counts.items())
items.sort(key=lambda x:x[1],reverse=True)
for i in range(10):
    word,count = item[i]
    print("{0:<10}{1:>5}".format(word,count))

你可能感兴趣的:(python基础)