- 主题:python3时代一切皆generator之后如何流式处理字符串?
旧函数:
def escapeMarkdown(s):
out = ""
for c in s:
if c in r"\`*_{}[]<>()#+-.!|=":
out += "\\" + c
else:
out += c
return out
打算改为:
def escapeMarkdown(s):
for c in s:
if c in r"\`*_{}[]<>()#+-.!|=":
yield "\\" + c
else:
yield c
但是函数返回的对象是个generator
print这个返回结果的时候是这样的:
'<generator object escapeMarkdown at 0x7f88a3f81350>'
这可怎么搞?
如果把这个函数改成generator,调用它的地方居然全都需要改吗?
--
FROM 139.227.18.*
这么改是有什么特别的目的吗
【 在 JulyClyde 的大作中提到: 】
: 旧函数:
: def escapeMarkdown(s):
: out = ""
: ...................
--
FROM 123.123.202.*
你还得join,结果效果还不如原来的。
generator是延迟求值,你这里没这个需要。
【 在 JulyClyde 的大作中提到: 】
: 旧函数:
: def escapeMarkdown(s):
: out = ""
: ...................
--
FROM 114.246.239.*
【 在 milksea 的大作中提到: 】
: 你还得join,结果效果还不如原来的。
: generator是延迟求值,你这里没这个需要。
可以写的简单一些而已
generator不是iteratable吗?print之类的函数不能直接对着它一个字一个字往外读吗?
还是我理解错了?
--
FROM 139.227.18.*
我理解print只是把对象的__str__给打印出来吧
而且generator不是出一轮之后就没了吗
你这一print不是还要再生成一轮
【 在 JulyClyde 的大作中提到: 】
: 可以写的简单一些而已
: generator不是iteratable吗?print之类的函数不能直接对着它一个字一个字往外读吗?
: 还是我理解错了?
: ...................
--
FROM 123.123.202.*
生成器没有自带的__repr__和__str__,另外可能会是无限长的,直接print也不那么安全
【 在 JulyClyde 的大作中提到: 】
: 可以写的简单一些而已
: generator不是iteratable吗?print之类的函数不能直接对着它一个字一个字往外读吗?
: 还是我理解错了?
: ...................
--
FROM 123.123.153.113
【 在 JulyClyde 的大作中提到: 】
: 可以写的简单一些而已
: generator不是iteratable吗?print之类的函数不能直接对着它一个字一个字往外读吗?
: 还是我理解错了?
生成器函数的调用不是这么用的, 第一次其实只是返回了生成器对象, 对生成器对象的调用需要
调用它的send函数。
gen = escapeMarkdown('ax..y==3') #这个只是返回生成器。
gen.send(None) 这样写才是驱动生成器的调用。
想一直调用, 就一直调用send,其中, 参数这里是None就可以。
这个参数的作用, 用于下面的格式:
var = yield "\\" + c
也就是说, yield左侧可以给一个变量赋值, 这个值其实,就是send的参数带过来的。
由于第一次调用, 是从函数开头, 到碰到第一个yield, 这个时候不需要这个值,
因此规定第一次给的参数值是None,
第二次调用, 假设send(var2), 那么相当于yield携带var2回来, 执行var=var2
然后, 继续向下执行, 知道再次碰到 yield, 对yield右侧求值并返回。
针对你的这种情况, yield不存在左侧赋值, 因此, 全部使用None调用就可以了,
其实, 无论用什么值, 可能都是被忽略丢掉了,None就是明确说不需要左值。
--
FROM 115.171.154.*
【 在 xuanqing 的大作中提到: 】
: 我理解print只是把对象的__str__给打印出来吧
这就是问题啊……唉
它咋没把generator当作一个“和str类似可以一个字一个字读”的东西呢?
: 而且generator不是出一轮之后就没了吗
: 你这一print不是还要再生成一轮
我其实就只用一次啊
--
FROM 139.227.18.*
【 在 JulyClyde 的大作中提到: 】
: 标 题: Re: python3时代一切皆generator之后如何流式处理字符串?
: 发信站: 水木社区 (Thu Aug 29 10:45:11 2024), 站内
:
:
: 【 在 xuanqing 的大作中提到: 】
: : 我理解print只是把对象的__str__给打印出来吧
: 这就是问题啊……唉
: 它咋没把generator当作一个“和str类似可以一个字一个字读”的东西呢?
那这样和之前不就没什么区别了吗, 为啥还要改呢
: : 而且generator不是出一轮之后就没了吗
: : 你这一print不是还要再生成一轮
: 我其实就只用一次啊
你是要用来做串联处理吗
这么在意generator
:
: --
:
: ※ 来源:·水木社区 mysmth.net·[FROM: 139.227.18.*]
--
FROM 123.123.202.*
【 在 xuanqing 的大作中提到: 】
: 标 题: Re: python3时代一切皆generator之后如何流式处理字符串?
: 发信站: 水木社区 (Thu Aug 29 23:12:59 2024), 站内
:
:
: 【 在 JulyClyde 的大作中提到: 】
: : 标 题: Re: python3时代一切皆generator之后如何流式处理字符串?
: : 发信站: 水木社区 (Thu Aug 29 10:45:11 2024), 站内
: :
: :
: : 【 在 xuanqing 的大作中提到: 】
: : : 我理解print只是把对象的__str__给打印出来吧
: : 这就是问题啊……唉
: : 它咋没把generator当作一个“和str类似可以一个字一个字读”的东西呢?
: 那这样和之前不就没什么区别了吗, 为啥还要改呢
就是没打算改外边的读法啊
只想改里边的写法
: : : 而且generator不是出一轮之后就没了吗
: : : 你这一print不是还要再生成一轮
: : 我其实就只用一次啊
: 你是要用来做串联处理吗
: 这么在意generator
我不太喜欢那种
在里边把中间结果存起来,循环循环循环
最后一股脑扔出去的写法
觉得比较麻烦
一次生成一个然后扔出去,我这里能至少节省一层缩进
--
FROM 139.227.18.*