python学习记录03

本文探讨了递归的概念及其在解决汉诺塔问题中的应用,展示了如何通过递归函数实现汉诺塔的移动。此外,还介绍了科赫雪花的绘制过程,利用递归实现了分形艺术。同时,讲解了集合类型的特性,包括操作符和方法,以及集合在数据去重中的作用。最后,提到了Python中字典的操作,并简单介绍了jieba库在中文文本处理中的应用,如词频统计。文章深入浅出地阐述了递归和分治策略在编程实践中的重要性。
摘要由CSDN通过智能技术生成

递归

函数+分支结构
递归链条
递归基例

#汉诺塔问题
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*=ns更新,其元素重复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 dk是索引
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))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值