我在这个有用的问答中看到了人们可以使用的,reload(whatever_module)或者在Python 3中imp.reload(whatever_module).
我的问题是,如果我说from whatever_module import *要导入怎么办?然后我whatever_module在使用时无需参考reload().你们是否会因为将整个模块投入全局命名空间而对我大喊大叫?:)
我正在使用ply并注意到存储在t.lex.lexmatch中的令牌重新匹配与使用re模块以通常方式定义的sre_pattern之间存在奇怪的差异.小组(x)似乎是1.
我已经定义了一个简单的词法分析器来说明我所看到的行为:
import ply.lex as lex
tokens = ('CHAR',)
def t_CHAR(t):
r'.'
t.value = t.lexer.lexmatch
return t
l = lex.lex()
Run Code Online (Sandbox Code Playgroud)
(我收到关于t_error的警告但暂时忽略它.)现在我将一些输入提供给词法分析器并获取一个令牌:
l.input('hello')
l.token()
Run Code Online (Sandbox Code Playgroud)
我得到了LexToken(CHAR,<_sre.SRE_Match object at 0x100fb1eb8>,1,0).我想看一下匹配对象:
m = _.value
Run Code Online (Sandbox Code Playgroud)
所以现在我看看这些小组:
m.group()=> 'h'正如我所料.
m.group(0)=> 'h'正如我所料.
m.group(1)=> 'h',但我希望它没有这样一个群体.
将此与手动创建这样的正则表达式进行比较:
import re
p = re.compile(r'.')
m2 = p.match('hello')
Run Code Online (Sandbox Code Playgroud)
这给了不同的群体:
m2.group()= 'h'正如我所料.
m2.group(0)= 'h'正如我所料.
m2.group(1)IndexError: no such group按照我的预期给出.
有谁知道为什么存在这种差异?
我发现自己使用这两个自定义生成器,并认为"必须有一个itertools函数或者已经做到这一点的东西!但是没有发现任何东西.我错过了什么吗?谢谢!
def gothru(iters):
for i in iters:
for j in i:
yield j
def overnover(fn,startval):
val = startval
while True:
val = fn(val)
yield val
Run Code Online (Sandbox Code Playgroud)
编辑:我后来想象如何overnover用于生成斐波纳契序列,我意识到它需要被推广以允许函数有多个参数
def overnover(fn,*args):
while True:
args = fn(*args)
return args
Run Code Online (Sandbox Code Playgroud)
然后你可以这样做:
fibInfo = overnover(lambda x,y: (x+y, x), 1, 1)
Run Code Online (Sandbox Code Playgroud)
- >(2,1)......(3,2)...(5,3)...(8,5)......然后:
fib = imap(lambda x:x[0], fibInfo)
Run Code Online (Sandbox Code Playgroud)
- > 2 ... 3 ... 5 ... 8 ......
多谢你们!
我最近一直在玩vim宏(目前在MacVim中),有时我喜欢用例如明确地将宏分配到寄存器中:let @a='(macro keystrokes)'.这通常工作正常,但我发现了一种奇怪的行为,其中任何时候我分配一个以Carriage Return/^ M结尾的字符串值,vim会在将它放入寄存器之前自动将Endfeed/^ J添加到结尾,这会影响执行宏!
示例:假设我记录了一个进入插入模式的简单宏,键入"hey",退出插入模式,然后按两次Enter键向下走2行.我通过输入qaihey<Escape><Enter><Enter>q将其记录到寄存器@a中,它将以下内容存储在@a中:
ihey^[^M^M
Run Code Online (Sandbox Code Playgroud)
到目前为止@a一切都那么好,并且通过键入来执行宏只是它应该是什么.我可以将这个相同的宏放入寄存器@a的另一个非常好的方法是将整个事物(ihey<Ctrl-V><Escape><Ctrl-V><Enter><Ctrl-V><Enter>)输入缓冲区,然后用它进行操作"ay- 最终结果是相同的.但这是奇怪的事情 - 假设我只想使用let语句将该字符串直接分配到@a :
:let @a='ihey^[^M^M'
Run Code Online (Sandbox Code Playgroud)
现在,如果我输入:reg要查看它所显示的值,那么^J由于某种原因,最后会有额外的值:
"8 ...
"9 ...
"a ihey^[^M^M^J
"b ...
Run Code Online (Sandbox Code Playgroud)
有额外的^J原因导致它在执行宏时会减少额外的行,所以它实际上改变了行为.
有谁知道为什么要添加这个额外的角色?任何人都知道我怎么能得到一个^M以寄存器(或任何变量)结尾的字符串值,而不需要额外^J添加?