Day04 Python中的生成器

一、生成器

1.生成器本质上就是一个迭代器
2.定义方式

  • 2.1 生成器表达式:类似于列表推导式

    列表推导式

 for i in range(3):
    print(i*10)

 li = [i*10 for i in range(3)]
 print(li)#0 10 20
  • 把列表推导式的[]改成()
li2 = (i*10 for i in range(3))  # 生成器表达式
print(li2)    #<generator object <genexpr> at 0x000002105DD1B548>
print(next(li2))#0
print(next(li2))#10
print(next(li2))#20
print(next(li2))报错,i的范围只取到2
  • 2.2 生成器函数:python中, 使用了yield的函数被称为生成器(generator)
    • 1.普通函数,返回值用return; 生成器函数使用yield语句
    • 2.yield语句一次返回一个结果,在每个结果中间,挂起函数,以便下次从它离开的地方继续执行
    • 3.yield效果使函数中断,并保存中断的状态
def funa(val):
    li = []
    li.append(val)
    print('这是列表:', li)

funa('a')#这是列表: ['a']
funa('b')#这是列表: ['b']
funa('c')#这是列表: ['c']

二、生成器函数

def funb():
    print('---开始了----')
    yield 2   # 返回一个2,并暂停函数
    yield 3
    yield 4

fb = funb()  # 调用生成器函数,返回的是一个生成器对象
print(fb)#<generator object funb at 0x000001F322C26F68>
print(next(fb))
print(next(fb))
print(next(fb))
print(next(fb))#报错,因为上面yield只有2,3,4

for i in fb:
    print(i)# 2 3 4

举例一

根据n的值来决定列表的长度 n = len(res)

def test(n):
    res = []  # 空列表
    for i in range(n):
        res.append(i)
    print('列表:', res)#列表: [0, 1, 2, 3]

test(4)  # n = 4


def test(n):
    res = []  # 空列表
    a = 0
    while a < n:
        res.append(a)
        a += 1
    print('列表:', res)#列表: [0, 1, 2, 3]

test(4)


生成器函数
def test2(n):
    a = 0
    while a < n:
        yield a
        a += 1


for i in test2(10):# n=10
    print(i)# 0 1 2 3 4 5 6 7 8 9

举例二
处理文件, 用户指定要查找的文件和内容
将文件中要查的内容的每一行都打印出来

  • 1.写一个函数, 参数是文件和内容
  • 2.文件操作 – open()函数
  • 3.查找内容 – 判断内容是否在那一行
  • 4.找到后输出
def check(fname, content):  # fname代表文件名, content代表内容
    with open(fname, encoding='utf-8') as file:
        for i in file:
            # print(i, end='')
            if content in i:
                # print(i)
                yield i

ch = check('we.txt', '小猫')
print(next(ch))#小猫1
print(next(ch))#小猫2
print(next(ch))#报错:StopIteration,因为we.txt文件中含有小猫关键字的只有小猫1,小猫2,所以输出第3次会报错


 with open('we.txt', encoding='utf-8') as f:
   for i in f:
         print(i)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是使用 TensorFlow 2.8.4 的双向 LSTM 生成莎士比亚风格诗句的代码: ```python import tensorflow as tf import numpy as np import requests # 下载莎士比亚全集作为训练数据 url = 'https://cs.stanford.edu/people/karpathy/char-rnn/shakespeare_input.txt' text = requests.get(url).content.decode('utf-8') # 构建字符表和字符到数字的映射 chars = sorted(list(set(text))) char_to_num = dict((c, i) for i, c in enumerate(chars)) # 将输入文本转换为数字序列 input_data = [] for i in range(0, len(text) - 40, 3): sequence = text[i:i+40] input_data.append([char_to_num[char] for char in sequence]) # 对输入数据进行归一化 input_data = np.array(input_data) input_data = input_data / float(len(chars)) # 构建双向 LSTM 模型 model = tf.keras.Sequential([ tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(512)), tf.keras.layers.Dense(len(chars), activation='softmax') ]) # 编译模型 model.compile(loss='categorical_crossentropy', optimizer='adam') # 定义生成器函数,用于生成新的诗句 def generate_text(model, start_string, num_generate=100): input_eval = [char_to_num[char] for char in start_string] input_eval = tf.expand_dims(input_eval, 0) text_generated = [] temperature = 0.5 model.reset_states() for i in range(num_generate): predictions = model(input_eval) predictions = tf.squeeze(predictions, 0) predictions = predictions / temperature predicted_id = tf.random.categorical(predictions, num_samples=1)[-1,0].numpy() input_eval = tf.expand_dims([predicted_id], 0) text_generated.append(chars[predicted_id]) return (start_string + ''.join(text_generated)) # 加载之前训练好的模型 model.load_weights('shakespeare_model.h5') # 生成新的诗句 generated_text = generate_text(model, start_string='shall i compare thee to a summer\'s day?\n', num_generate=200) print(generated_text) ``` 该代码会首先下载莎士比亚的全集作为训练数据,然后构建字符表和字符到数字的映射,并将输入文本转换为数字序列。接着,它会构建一个双向 LSTM 模型,并编译模型。最后,它会定义一个生成器函数 `generate_text()`,用于生成新的诗句。该函数会接收一个起始字符串和生成的诗句长度,并返回生成的诗句。最后,它会加载之前训练好的模型,并生成新的诗句。 请注意,生成的诗句可能并不是完全符合莎士比亚的风格,因为模型的训练数据仅限于莎士比亚的全集。如果想要生成更加符合莎士比亚风格的诗句,可以使用更多的训练数据,并调整模型的参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值