递归
函数+分支结构
递归链条
递归基例
#汉诺塔问题
count ==0
def hanoi(n,src,dst,mid):
global count
if n==1:
print("{}:{}->{}".format(1,src,dst))
count +=1
else:
hanoi(n-1,src,mid,dst)
print("{}:{}->{}".format(1,src,dst))
count+=1
hanoi(n-1,mid,dst,src)
科赫雪花
import turtle as t
def koch(size,n):
if n == 0:
t.fd(size)
else:
for angle in [0,60,-120,60]:
t.left(angle)
koch(size/3,n-1)
def main():
t.setup(600,600)
t.penup()
t.goto(-200,100)
t.pendown()
t.pensize(2)
level =3
koch(400,level)
t.right(120)
koch(400,level)
t.right(120)
koch(400,level)
t.hideturtle()
main()
集合类型
{}不使用来定义集合,默认是字典类型
set()
不包含相同元素
集合操作符
操作符 | 描述 |
---|---|
S|T | 包括在S,T中的所有 |
S-T | 包含在S但不在T中的 |
S&T | 同时在S,T中的元素 |
S^T | 返回S和T中非相同元素 |
S<=T | 返回布尔值,子集 |
增强操作符 | 描述 |
---|---|
S|=T | 更新S,包括在S,T中的所有远古三 |
…… |
集合处理方法
操作函数或方法 | |
---|---|
S.add(x) | 如果x不在S中,增加 |
S.discard(x) | 不在不报错 |
S,remove(x) | 不在集合中返回异常 |
S.clear | 移除所有 |
S.pop() | 随即返回一个元素,更新S,若为空报错 |
S.copy | 返回副本 |
len(S) | 长度 |
x (not)in S | 判断返回布尔值 |
set(X) | 转化为集合类型 |
for item in A:
print(item,end="")
try:
while True:
print(A.pop(),end='')
except:
pass
集合类型应用---->数据去重
序列
一维元素向量,有先后关系
- 字符串
- 元组
- 列表
操作符 | 描述 |
---|---|
x(not) in s | 返回布尔值 |
s+t | 连接两个序列 |
sn 或ns | 将序列s复制n次 |
s[i] | 索引,返回s中的第i个元素 |
s[i:j:k] | 切片 |
函数 | 描述 |
---|---|
len(s) | |
min(s) | 元素需要可比较 |
max(s) | 返回最大元素 |
s.index(x)或 s.index(x,i,j) | 返回第一次出现x的位置 |
s.count(x) | 返回x出现的总次数 |
元祖
一旦被创建不能被修改
() tuple()
列表
可以被随意修改
[] list()
函数或方法 | 描述 |
---|---|
ls[i]=x | 替换第i个元素为x |
ls[i:j:k]=lt | 用列表lt替换ls切片后所对应元素子列表 |
del ls[i] | 删除 |
del ls[i:j:k] | 删除 |
ls +=lt | 更新,将lt增加到ls中 |
ls*=n | s更新,其元素重复n次 |
ls.append(x) | 在列表最后增加元素 |
ls.clear() | 删除所有 |
ls.copy() | 生产一个新列表,赋值ls中所有元素 |
ls.insert(i,x) | 在第i个位置增加元素 |
ls.pop(i) | 取出i位置的元素 |
ls.remove() | 出现的第一个x元素删除 |
ls.reverse() | 元素反转 |
sort方法
list.sort(cmp=None, key=None, reverse=False)
- cmp – 可选参数, 如果指定了该参数会使用该参数的方法进行排序。
- key --主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
- reverse-- 排序规则,reverse = True 降序, reverse = False 升序(默认)
基本统计值计算(描述统计分析)
- 总个数:len()
- 求和:for … in
- 平均值
- 方差
- 中位数:排序
def getNum():
nums=[]
iNumStr = input("请输入数字(回车退出)")
while iNumStr != '':
nums.append(eval(iNumStr))
iNumStr =input("请输入数字(回车退出)")
return nums
def mean(numbers):
s = 0.0
for n in numbers:
s+=n
return s/len(numbers)
def dev(numbers,mean):
sdev=0.0
for n in numbers:
sdev = sdev + (n-mean)**2
return pow(sdev/(len(numbers)-1),0.5)
def midN(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
def main():
n = getNum()
m = mean(n)
print("输入的列表为{},共{}个".format(n,len(n)))
print("平均值:{:.2f},方差:{:.2f},中位数:{}.".format(m,dev(n,m),midN(n)))
字典
{} dict()
键值对之间无序
函数或方法 | 描述 |
---|---|
del d[k] | 删除字典d中k对应的数据值 |
k in d | k是索引 |
d.keys() | 可以用for in遍历 |
d.values() | |
d.items() | 返回所有键值对信息 |
d.get(k,<\default>) | k存在,则返回相应值,不存在返回default值 |
d.pop(k,<\default>) | |
d.popitem | 随机从字典中取出键值对,以元组形式返回 |
d.clear() | |
len(d) |
jieba
- 精确模式:把文本精确的切分开,不存在冗余单词
- 全模式:把所有可能的词语扫描出来,存在冗余
- 搜索引擎模式:在精确模式的基础上,长词再次切分
函数 | 描述 |
---|---|
jieba.lcut(s) | 精确模式,返回列表 |
jieba.lcut(s,cut_all=True) | 全模式 |
jieba.lcut_for_search(s) | 搜索引擎模式 |
jieba.add_word(w) | 增加新词 |
词频统计
#sgyyV1
import jieba
def getText():
txt = open('threekingdoms.txt','r',encoding='utf-8').read()
for ch in '[’!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~]+,。!?“”《》:、. ;':
txt = txt.replace(ch,'')
return txt
threeTxt = getText()
words = jieba.lcut(threeTxt)
counts={}
for word in words:
if len(word) == 1:
continue
else:
counts[word] = counts.get(word,0)+1
items = list(counts.items())
items.sort(key=lambda x:x[1],reverse=True)
for i in range(15):
word,count =items[i]
print("{0:<10}{1:>5}".format(word,count))
#hamlet
def getText():
txt = open('hamlet.txt','r').read()
txt = txt.lower()
for ch in '!"#$%&*+,-./:;<=>?@[\\]^_‘’`{|}~':
txt = txt.replace(ch,' ')
return txt
hamletTxt = getText()
words = hamletTxt.split()
counts ={}#字典类型
for word in words:
counts[word] = counts.get(word,0)+1
items = list(counts.items())#转换成列表
items.sort(key=lambda x:x[1],reverse=True) #按照第二个元素,从大到小
for i in range(10):#前十个
word,count=items[i]
print("{0:<10}{1:>5}".format(word,count))
#sgyyV2
import jieba
def getText():
txt = open('threekingdoms.txt','r',encoding='utf-8').read()
for ch in '[’!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~]+,。!?“”《》:、. ;':
txt = txt.replace(ch,'')
return txt
threeTxt = getText()
excludes ={"将军","却说","荆州","二人","不可","不能","如此","如何",'商议','天下','大喜','次日','军马','左右','引兵'}#不断运行后添加
words = jieba.lcut(threeTxt)
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[rword] = counts.get(rword,0)+1
for word in excludes:
del counts[word]
items = list(counts.items())
items.sort(key=lambda x:x[1],reverse=True)
for i in range(20):
word,count =items[i]
print("{0:<10}{1:>5}".format(word,count))