python学习之jieba库和yield生成器以及迭代器
一、jieba库的三种模式和函数
首先得安装jieba库
在官网https://pypi.org/project/jieba/
#files下载源文件,保存在python子文件夹Scripts文件夹里面
打开命令行,进入到下载的jieba库源文件的setup.py文件的上一级文件目录下
输入命令python setup.py install等待安装即可
import jieba text = ("test.txt","r",encoding = "utf-8")#注意,这里的编码方式一定要是utf-8,否则读取文本会出错 #精确模式,这个会最准确的将文本中的词语切割出来,没有冗余 words1 = jieba.lcut(text) #全模式,会将所有可能出现的词语列举出来,有冗余 words2 = jieba.lcut(text,cut_all = True) #搜索引擎模式,在精确模式上,再次对词语进行拆分 words3 = jieba.lcut_for_search(text)
#jieba库的函数,向jieba库的分词词库里面增加切割的词语
jieba.add_words(string)
#例如 words1 = jieba.lcut("中国是一个伟大的国家") #输出words1:['中国', '是', '一个', '伟大', '的', '国家'] words2 = jieba.lcut("中国是一个伟大的国家",cut_all = True) #输出words2:['中国', '国是', '一个', '伟大', '的', '国家'] words3 = jieba.lcut_for_search("中华人民共和国是伟大的") #输出words3:['中华', '华人', '人民', '共和', '共和国', '中华人民共和国', '是', '伟大', '的']
jieba.lcut("中国是一个美丽的国家")
#输出:['中国', '是', '一个', '美丽', '的', '国家']
jieba.add_words("美丽的国家")
jieba.lcut("中国是一个美丽的国家")
#再次输出:['中国', '是', '一个', '美丽的国家']
二、yield生成器
#yield生成器generator所创建的是一个算法,只有通过next()方法调用才会输出结果,而它在调用到最后一个就会停止调用,所以这需要一个变量来接收 #创建生成器的方法有很多 #方法一: L = [x*x for x in range(10)]#这是普通的列表 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]#这是输出 d = (x*x for x in range(10))#将中括号改成小括号就可以创建一个生成器 <generator object <genexpr> at 0x0000018E70E38B10>#这是直接输入d的结果 0 1 4 ... 以上是依次调用next(d)输出的结果,这是不是很麻烦,因为手动调用需要很多次,所以现实中都用for循环调用,因为generator所返回的是一个可迭代的对象 for i in d: print(i) #方法二: #可以在函数中使用yield生成器,这样该函数就变成了一个生成器 #例如斐波拉契数列,max是要输出的个数,n用来计算 def fib(max): n,a,b = 0,0,1 while (n < max): print(b) a,b = b,a+b n += 1 fib(5)#直接调用,会直接输出结果 #使用yield生成器创建斐波那契数列函数生成器 def fib(max): n,a,b = 0,0,1 while (n < max): yield b a,b = b,a+b n += 1 fib(5)#不会输出数列,而是输出fib的类型:<generator object fib at 0x0000018E756B01B0> next(fib(5))#正确的调用方式 #方法三,yield生成器与函数的关系,函数在执行到yield语句时就会返回,再次调用函数时会从上次yield语句的下一句开始执行 def ofo(): print("step 1") yield 1 print("step 2") yield 2 print("step 3") yield 3 o = ofo()#o用来接收generator算法 o.next()#这个输出方法在python3中不适用 next(o)#这个才是正确的调用方法 #参考网站:https://www.liaoxuefeng.com/wiki/897692888725344/92302968513862
三、迭代器
#只要是可迭代的,无论是否有下标,都可以迭代;任何实现了next()方法的都可以被称为迭代器 #字典的迭代,默认情况下字典迭代的是key,如果要迭代value,可以用for value in dict.values();如果要迭代键和值,可以用for keys,values in dict.items();迭代key,可以用for key in dict() for keys,values in {'a':1,"b":2,"c",3}.items(): print(keys,values) #输出 a 1 b 2 c 3 #列表的迭代 for i in [1,2,3,4,5,6]: print(i) #输出 1 2 3 ... #字符串的迭代 for i in 'ABC': print(i) #输出 A B C #集合的迭代 s = set([1,2,3])#创建一个集合 for x in s: print(x) #输出 1 2 3 #如何判断对象是否可迭代Iterable?通常是通过collections模块的Iterable类型来判断该对象是否可迭代 from collections import Iterable isinstance('abc',Iterable) #True isinstance(123,Iterable) #False,整数不能迭代 isinstance([1,2,3],Iterable) #True #for循环的本质就是通过不断调用next()函数实现的 for x in [1,2,3]: pass #创建一个可迭代Iterato的对象,使用iter()方法 #完全等价于 it = iter([1,2,3]) while True: try: x = next(it)#通过next()方法获取下一个值 except StopIteration:#到达结尾时引发异常StopIteration就退出循环 break
四、python如何去掉标点符号
#方法一 string.replace('需要被替换的一个标点符号','用来替换的标点符号') string.replace('?',' ')#将问号用空格来替换 #方法二 for i in "各种标点符号": string.replace(i,' ')#将各种标点符号用空格来替换 for i in ",.?:;!": string.replace(i,' ')