如何统计一篇文章中出现频率最高的 5 个单词? Counter
#统计单词出现的个数,使用 collections 中的 Counter 统计类
import re
from collections import Counter
f = open("../05操作类题目/filetest.txt").read()
res = re.split(r'\W+', f)
print(res)
c = Counter(res)
print(c.most_common(5)) # [('sgdg', 3), ('dsgdsgdshellogsdgdsg', 3), ('wdewfwefds', 1), ('dsghellosdgs', 1), ('sdgsgrewhellogrwgrhjfnsdg', 1)]
列表[1,2,3,4,5],编写代码提取出大于 10 的数,最终输出 [16,25]
# 使用 map() 函数输出[1,4,9,16,25],使用列表推导式提取出大于 10 的数,最终输出 [16,25]
print([x for x in list(map(lambda x: x*x, range(1, 6))) if x > 10])
"""
map 映射函数按规律生成列表或集合
map 函数接收两个参数,一个函数名,一个可迭代对象,一般传入的一个列表对象,列表中的每个元素都按照传入函数的规则生成一个新的列表。
最后的返回值是一个 map 对象。map 对象是一个可迭代对象,可以使用 for 循环取出元素
"""
# 不用map 纯列表推导式
print([x*x for x in range(1,6) if x*x > 10])
# 一个列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],以该列表为基础每个数字乘以10
# 用map函数实现
print([x for x in list(map(lambda x:x*10, range(10)))]) # [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
# 不用map 纯列表推导式
print([x*10 for x in range(10)]) # [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
filter 过滤函数如何使用?如何过滤奇数偶数平方根数?
filter() 函数按照函数的规则过滤掉符合的元素,返回过滤后的新对象。
- 函数接收两个参数,第一个为函数,第二个为序列。
- 序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
# 实例1:过滤出列表中的所有奇数
# 定义得到奇数的方法,满足条件的就返回会布尔值True
# filter中满足判断条件为True的就加入到新列表中
# 函数
def is_odd(n):
return n%2 == 1
print(list(filter(is_odd, range(10)))) # [1, 3, 5, 7, 9]
# lambda
print(list(filter(lambda x: x%2==1, range(10)))) # [1, 3, 5, 7, 9]
# 实例2:过滤出列表中的所有偶数
# 函数
def is_even(n):
return n%2 == 0
print(list(filter(is_even, range(10)))) # [0, 2, 4, 6, 8]
# lambda
print(list(filter(lambda x: x%2==0, range(10)))) # [0, 2, 4, 6, 8]
# 实例3:过滤出1~100中平方根是整数的数:1,4,9......81,100
import math
# 函数
def is_sqr(n):
return math.sqrt(n) % 1 == 0
print(list(filter(is_sqr, range(1, 101)))) # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
# lambda
print(list(filter(lambda x:(math.sqrt(x) % 1) == 0, range(1, 101)))) # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
# sorted()排序函数
"""
sorted(__iterable, key, reverse)
第一个参数__iterable代表是一个可迭代对象
第二个参数keyda代表传入排序的规则,一般使用lambda表达式
第三个参数reverse,默认是False,可以传入 True 代表倒序排列
"""
a = [
{'username':'x', 'age':18},
{'username':'y', 'age':20},
{'username':'z', 'age':10},
]
# 按照年龄排序 reverse=True代表倒序排列
print(sorted(a, key=lambda x:x['age'], reverse=True)) # [{'username': 'y', 'age': 20}, {'username': 'x', 'age': 18}, {'username': 'z', 'age': 10}]
# 传入索引值,用于排序
students = [('john', 'A', 15), ('jane', 'B', 12), ('dave','B', 10)]
b = sorted(students,key=lambda x: x[2])
print(b) # [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 25)]
# bool型排序
print(sorted([True, False])) # [False, True]
# 多规则复杂排序 lambda 表达式传入的规则可以传入一个元组包含多个规则,规则中进行判断,不满足的就是 False,排在最后
s = "abC234568XYZdsf23"
# 排序规则: 小写<大写<奇数<偶数
print("".join(sorted(s, key=lambda x:(x.isdigit(), x.isupper(), x.isdigit() and int(x) % 2==0, x)))) # abdfsCXYZ33522468
"""
原理:先比较元组的第一个值,FALSE<TRUE,如果相等就比较元组的下一个值,以此类推。
False排在后面
1.x.isdigit()的作用是把字母放在前边,数字放在后边.
2.x.isdigit() and int(x) % 2 == 0的作用是保证奇数在前,偶数在后。
3.x.isupper()的作用是在前面基础上,保证字母小写在前大写在后.
4.最后的x表示在前面基础上,对所有类别数字或字母排序。
同时满足上面的规则
"""
list1=[7, -8, 5, 4, 0, -2, -5]
# 要求1.正数在前负数在后 2.整数从小到大 3.负数从大到小
# 先按照正负排先后,再按照大小排先后
print(sorted(list1, key=lambda x:(x<0, abs(x))))
"""
x<0,表示负数在后面,正数在前面
abs(x)表示按绝对值,小的前面,大的在后面
"""
# 字典根据键从小到大排序
info = {'name': 'Gage', 'age': 25, 'sex': 'man'}
print(sorted(info.items(), key=lambda x:x[0])) # [('age', 25), ('name', 'Gage'), ('sex', 'man')]
如何对生成器类型的对象实现类似于列表切片的功能
l = [1,2,3,4,5,6,7,8,9]
# 对列表l进行切片
print(l[1:3]) # [2, 3] 左闭右开
# 其实主要是考察Python标准库的itertools模快,该模块提供了操作生成器的一些方法。 对于生成器类型我们使用islice方法来实现切片的功能
from itertools import islice
# 先使用item()函数来生成迭代器
d = iter(range(1, 10))
for i in islice(d,1,3): # islice()方法第一个参数是迭代器,第二个参数是起始位置索引,第三个参数是结束位置索引 注意:不支持负数索引
print(i)
# 2
# 3
# 也可以下面这样写
print([i for i in islice(d,1,3)]) # [2, 3]
生成器(Generator)
- 生成器就是可以生成值的函数
- 当一个函数有了yield关键字就成了生成器
- 可以挂起执行并保存当前执行的状态
def testa():
yield 'hello'
yield 'world'
print(type(testa()))
print(next(testa()))
print(next(testa()))
# <class 'generator'>
# hello
# hello
"""
通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。
而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
在Python中,这种一边循环一边计算的机制,称为生成器(Generator)
"""
# 将列表推导式[for i in range(10)]改成生成器
# 把列表生产式的中括号,改为小括号我们就实现了生产器的功能
print((for i in range(10))) # <generator object <genexpr> at 0x10d9e5890>
print([i for i in range(10)]) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
基于生成器实现协程
使用send()发送 throw抛出异常
def coro():
hello = yield 'hello' # yield关键字在=右边作为表达式 可以被send值
yield hello
c = coro()
print(type(c)) # generator
print(next(c)) # 'hello'
print(c.send('world')) # 'world'
c.send(None) # next(c) 会抛出异常
协程注意点
- 协程需要使用send(None)或者next(coroutine)来预激活(prime)才能启动
- 在yield处协程会暂停执行
- 单独的yield value会产出值给调方
- 可以通过coroutine.send(value)来给协程发送值,发送的值会赋值给yield表达式左边的变量value = yield
- 协程执行完后(没有遇到下一个yield)语句会抛出StopIteration异常
协程装饰器
避免每次都要使用send预激活它
from functools import wraps
def coroutine(func): # 这样就不用每次用send(None)启动了
"""向前执行到第一个yield表达式 预激活func"""
@wraps(func)
def primer(*args, **kwargs): # 1
gen = func(*args, **kwargs): # 2
next(gen) # 3
return gen # 4
return primer
lambda 匿名函数如何使用
lambda表达式用于定义一个匿名函数,一般用于定义一个小型函数
- lambda 是一个单一的参数表达式,内部没有类似 def 函数的语句
# # lambda 函数实现两个数相加
add = lambda x,y:x+y
print(add(1,2)) # 3
func = lambda x: x * x - x
res = func(5)
print(res)
type 和 help 函数有什么作用
type() 函数实际上是一个类,而不是一个函数。
- 在较早的 Python 中,type 用于创建一个动态类。
- 但是如今 type 函数使用最多的功能,用来查看一个变量属于什么类型。
help() 函数就是名称一样,它是是一个帮助函数,
- 使用该函数可以查看一个函数有什么功能,该函数有的属性,以及该函数的各种信息。
reduce()方法
reduce() 函数会对参数序列中元素进行累积。函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:
- 用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,
- 得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。
"""
在 Python3 中,reduce() 函数已经被从全局名字空间里移除了,它现在被放置在 fucntools 模块里,
如果想要使用它,则需要通过引入 functools 模块来调用 reduce() 函数:
"""
from functools import reduce
# 求和[0,1,2,3,4]
# 函数
def add(x,y):
return x+y
print(reduce(add, range(5))) # 10
# lambda
print(reduce(lambda x,y:x+y, range(5))) # 10
enumerate 为元素添加下标索引
"""
索引和内容构成一个元祖tuple,然后所有tuple元素组成一个元祖列表
索引位于元祖元素第一个位置,对应索引的值位于元祖元素第二个位置
"""
numbers = ['a', 'b', 'c', 'd', 'e']
print(enumerate(numbers)) # <enumerate object at 0x10e690880>
print(list(enumerate(numbers))) # [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e')]
# 添加起始索引位置
new_numbers = list(enumerate(numbers, start=999))
print(new_numbers) # [(999, 'a'), (1000, 'b'), (1001, 'c'), (1002, 'd'), (1003, 'e')]