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,' ')
原文地址:https://www.cnblogs.com/BASE64/p/10956302.html