Python中是否有一种方法可以访问匹配组而无需明确创建匹配对象(或另一种方式来美化下面的示例)?
这是一个澄清我的问题动机的例子:
遵循perl代码
if ($statement =~ /I love (\w+)/) {
print "He loves $1\n";
}
elsif ($statement =~ /Ich liebe (\w+)/) {
print "Er liebt $1\n";
}
elsif ($statement =~ /Je t\'aime (\w+)/) {
print "Il aime $1\n";
}
Run Code Online (Sandbox Code Playgroud)
翻译成Python
m = re.search("I love (\w+)", statement)
if m:
print "He loves",m.group(1)
else:
m = re.search("Ich liebe (\w+)", statement)
if m:
print "Er liebt",m.group(1)
else:
m = re.search("Je t'aime (\w+)", statement)
if m:
print "Il aime",m.group(1)
Run Code Online (Sandbox Code Playgroud)
看起来很尴尬(if-else-cascade,匹配对象创建).
我的问题针对setjmp/longjmp关于局部变量的行为.
示例代码:
jmp_buf env;
void abc()
{
int error;
...
if(error)
longjmp(env);
}
void xyz() {
int v1; // non-volatile; changed between setjmp and longjmp
int v2; // non-volatile; not changed between setjmp and longjmp
volatile int v3; // volatile; changed between setjmp and longjmp
volatile int v4; // volatile; not changed between setjmp and longjmp
...
if(setjmp(env)) {
// error handling
...
return;
}
v1++; // change v1
v3++; // change v3
abc();
}
int main(...) {
xyz();
} …
Run Code Online (Sandbox Code Playgroud) 我知道不可能重新启动使用过的Java Thread对象,但是我没有找到解释为什么不允许这样做的原因.即使保证线程已经完成(参见下面的示例代码).
我不明白为什么start()
(或者至少是restart()
)方法不能以某种方式将Thread对象的内部状态(无论它们是什么)重置为新建Thread对象时的相同值.
示例代码:
class ThreadExample {
public static void main(String[] args){
Thread myThread = new Thread(){
public void run() {
for(int i=0; i<3; i++) {
try{ sleep(100); }catch(InterruptedException ie){}
System.out.print(i+", ");
}
System.out.println("done.");
}
};
myThread.start();
try{ Thread.sleep(500); }catch(InterruptedException ie){}
System.out.println("Now myThread.run() should be done.");
myThread.start(); // <-- causes java.lang.IllegalThreadStateException
} // main
} // class
Run Code Online (Sandbox Code Playgroud) 显然,这个shell脚本将自己称为Python脚本:
#!/bin/sh
## repo default configuration
##
REPO_URL='git://android.git.kernel.org/tools/repo.git'
REPO_REV='stable'
magic='--calling-python-from-/bin/sh--'
"""exec" python -E "$0" "$@" """#$magic"
if __name__ == '__main__':
import sys
if sys.argv[-1] == '#%s' % magic:
del sys.argv[-1]
del magic
:
:
Run Code Online (Sandbox Code Playgroud)
(整个脚本:https://android.googlesource.com/tools/repo/+/v1.0/repo)
谁能解释一下
这样称呼的目的是什么?
为什么不在#!/usr/bin/env python
第一行,所以它从一开始就被解释为Python脚本?
添加那个魔术最后命令行参数的目的,后来在Python代码的开头删除了吗?
我正在研究一个带有微控制器的电子项目,该微控制器用C编程.
我需要将一些ID及其相关信息存储在闪存(SD)中.这些ID长度为16个字节,因此有2 ^ 128个可能的值.虽然它们是16个字节,但只使用50000(唯一)值.在物理上不可能将所有可能的(2 ^ 128)ID存储在SD中.
我只能存储50000个已使用的值但是我必须遍历所有(最坏的)它们才能找到我需要的值.此外,必须为它们中的每一个计算16字节值的比较,这使得它非常慢.
所以我想我需要某种(hash?)函数将2 ^ 128值映射到50000(映射16字节到2字节).很明显,一些原始值将映射到相同的值/索引.我的想法是,当我得到一个ID时,我应用一个哈希函数,它给出了一个介于0和~50000之间(0-65535)的索引.使用该索引,我可以直接访问存储ID及其相关信息的SD扇区.正如我已经指出的那样,该索引将引用内存的位置,其中各种ID将共存,因为一些不同的ID被映射到相同的索引值.我必须找到正确的ID,但它只需要几个比较而不是50000个原始ID.
任何想法/意见都会非常感激.
提前致谢.
首先是导致我遇到问题的实际应用:
给定一组v[i]
在[0,360]度范围内的角度测量值,包含全部的最小间隔是多少v[i]?
注意:间隔可能在两侧,大约在0附近.
问题的抽象描述:
对于一个给定值的v[i]
,有什么价值c
和d
,使得
i
:dist(v[i],c) <= d
和d
尽可能小dist(x,y) = abs(((x-y + N/2 + N) mod N) - N/2)
?这在开放(无限)规模上是微不足道的,其中dist(x,y) = abs(x-y)
:
calculate max and min of all v[i]
c = (max + min)/2;
d = (max - min)/2;
Run Code Online (Sandbox Code Playgroud)
但是,对于有限尺度(模N)和上面给出的距离定义,找到c和d的最佳方法是什么?
有没有办法做到这一点O(n)(如果n是值的数量)?
运行前已知值 10 和 20 的示例,以便更好地理解以下实际问题:
/point1 { 10 20 } def
将数字 10 和 20 放入(匿名)过程中,然后将其分配给名称point1
(因此它不再是匿名的)。然后point
可以使用name ,即每当解释器找到它时,它就会执行{ 10 20 }
,即 10 和 20 将被压入堆栈。
执行前后堆栈def
:
Stacke before: Stack after:
{ 10 20 } -
/point1
Dict before: Dict after:
- point1 --> { 10 20 }
Run Code Online (Sandbox Code Playgroud)
现在实际的问题是:假设将在运行时计算两个值 10 和 20 。如何将它们(或任意数量的n
栈顶元素)分配给给定的名称以便以后使用?
Stacke before: Stack after:
<y> -
<x>
/<name>
Dict before: Dict after:
- <name> --> { …
Run Code Online (Sandbox Code Playgroud)