Python之高级特性<2>--(词频统计练习、生成式、生成器、闭包)

一、词频统计练习

"""
技能需求:
    1. 文件操作
    2. 字符串的分割操作
    3. 字典操作
功能需求:词频统计
    1. 读取song.txt文件   with open(filename) as f: content=f.read()
    2. 分析文件中的每一个单词,统计每个单词出现的次数。{"hello":2, "python":1, "java":1}
    - 分析文件中的每一个单词
    content = "hello python hello java"
    words = content.split()
    - 统计每个单词出现的次数- {"hello":2, "python":1, "java":1}
    # words = ['hello', 'python', 'hello', 'java']
    3. 获取出现次数最多的5个单词

"""
# 1. 加载文件中所有的单词
with open('doc/song.txt') as f:
    words = f.read().split()
# 2. 统计
from collections import  Counter
counter = Counter(words)
result = counter.most_common(5)
print(result)

# # 2. 统计
# result = {}
# for word in words:
#     if word in result:
#         # result[word] = result[word] + 1
#         result[word] += 1
#     else:
#         result[word] = 1
#
# # *小拓展: 友好打印信息
# import pprint
# pprint.pprint(result)

执行结果如下所示:
在这里插入图片描述

二、生成式与生成器

1.生成式

# 需求: 生成100个验证码(4个字母组成的验证码)
import  string
import  random
codes = []
for count in range(100):
    code = "".join(random.sample(string.ascii_letters, 4))
    codes.append(code)
print(codes)

# 列表生成式优化版
codes = ["".join(random.sample(string.ascii_letters, 4)) for i in range(100)]
print(codes)

# 需求: 找出1-100之间可以被3整除的数。
nums = []
for num in range(1, 101):
    if num % 3 == 0:
        nums.append(num)
print(nums)
# 优化版
nums = [num for num in range(1, 101) if num % 3 == 0]
print(nums)

# 集合生成式
result = {i**2 for i in range(10)}
print(result)

# 字典生成式
result = {i:i**2 for i in range(10)}
print(result)

执行结果如下所示:
在这里插入图片描述

2.生成器

# 生成器实现的第一种方法: 将生成式改写成生成器
nums = (i**2 for i in range(10000))

# 生成器实现的第2种方法:yield关键字
#   return: 函数遇到return就返回,return后面的代码并不会执行。
#   yield:遇到yield则停止执行代码, 当再次调用next方法时,会从上次停止的地方继续执行,遇到yield停止。。。。
def login():
    print('step 1')   # 'step 1'
    yield 1           # output 1
    print('step 2')
    yield  2
    print('step 3')
    yield 3
# 如果函数里面有yield关键字,函数的返回值就是一个生成器
g = login()
print(next(g))
print(next(g))

执行结果如下所示:
在这里插入图片描述

三、闭包

# import  time
# start_time = time.time()  # 时间戳:19701.1到现在经历的秒数
# time.sleep(2)
# end_time = time.time()    # 时间戳:19701.1到现在经历的秒数
# print(end_time-start_time)


# 闭包:
#   1. 函数里面嵌套函数
#   2. 外部函数的返回值是内部函数的引用
#   3. 内部函数可以使用外部函数的变量
def timeit(name):
    def wrapper():
        print('wrapper ' + name)
    print('timeit')
    return wrapper

in_fun = timeit(name='westos')  # wrapper函数, in_fun实质上就是wrapper函数
in_fun()

执行如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值