小编Cur*_*urd的帖子

在Python中匹配组

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,匹配对象创建).

python regex

45
推荐指数
3
解决办法
10万
查看次数

setjmp/longjmp和局部变量

我的问题针对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)

c

22
推荐指数
2
解决办法
6541
查看次数

为什么不能重新启动Java Thread对象?

我知道不可能重新启动使用过的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)

java multithreading

14
推荐指数
2
解决办法
5836
查看次数

为什么这个shell脚本将自己称为python脚本?

显然,这个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代码的开头删除了吗?

python android sh

12
推荐指数
1
解决办法
633
查看次数

C中的散列算法将16个字节值映射到2个字节值

我正在研究一个带有微控制器的电子项目,该微控制器用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.

任何想法/意见都会非常感激.

提前致谢.

c algorithm hashmap

8
推荐指数
1
解决办法
1554
查看次数

如何找到包含一组模N的最小区间?

首先是导致我遇到问题的实际应用:

给定一组v[i]在[0,360]度范围内的角度测量值,包含全部的最小间隔是多少v[i]?

注意:间隔可能在两侧,大约在0附近.

问题的抽象描述:

对于一个给定值的v[i],有什么价值cd,使得

  • 为了所有人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是值的数量)?

language-agnostic algorithm

3
推荐指数
1
解决办法
1820
查看次数

在 PostScript 中:如何将一些堆栈元素(在运行时计算)放入可以分配给名称的过程中?

运行前已知值 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)

postscript

2
推荐指数
1
解决办法
227
查看次数