小编skg*_*nga的帖子

python生成器垃圾收集

我认为我的问题与有关,但并不完全相似.考虑以下代码:

def countdown(n):
    try:
        while n > 0:
            yield n
            n -= 1
    finally:
        print('In the finally block')

def main():
    for n in countdown(10):
        if n == 5:
            break
        print('Counting... ', n)
    print('Finished counting')

main()
Run Code Online (Sandbox Code Playgroud)

此代码的输出是:

Counting...  10      
Counting...  9       
Counting...  8       
Counting...  7       
Counting...  6       
In the finally block 
Finished counting  
Run Code Online (Sandbox Code Playgroud)

是否保证在"完成计数"之前打印"在最后一个块中"这一行?或者这是因为cPython实现细节,当引用计数达到0时,对象将被垃圾收集.

另外我对如何好奇finally的块countdown执行发电机?例如,如果我将代码更改main

def main():
    c = countdown(10)
    for n in c:
        if n == 5:
            break
        print('Counting... ', n)
    print('Finished …
Run Code Online (Sandbox Code Playgroud)

python generator python-internals

27
推荐指数
2
解决办法
1315
查看次数

Haskell - 守卫案件陈述

我正在通过了解你是一本哈斯克书,在第8章中有一段代码看起来像这样

data LockerState = Taken | Free deriving (Eq, Show)
type Code = String
type LockerMap = Map.Map Int (LockerState, Code)

lookup' :: Int -> LockerMap -> Either String Code
lookup' num_ map_ =
   case (Map.lookup num_ map_) of
      Nothing -> Left $ "LockerNumber doesn't exist!"
      Just (state, code) -> if state == Taken
                              then Left $ "LockerNumber already taken!"
                              else Right $ code
Run Code Online (Sandbox Code Playgroud)

这有效.但是,我想将if/else块转换为保护语句,如下所示:

lookup' :: Int -> LockerMap -> Either String Code
lookup' num_ map_ = …
Run Code Online (Sandbox Code Playgroud)

haskell pattern-guards

19
推荐指数
1
解决办法
1万
查看次数

string和string_view的索引操作符([])之间的区别

C++17string_view当我们只需要查看底层字符序列时,我们已经让我们优化了我们不必要地分配内存的场景.智慧是,你几乎可以随时更换const std::string&使用std::string_view.请考虑以下示例:

char foo(const std::string& str)
{
    return str[0];
}
Run Code Online (Sandbox Code Playgroud)

以上是所有值的有效函数std::string.但是,如果我们将其更改为:

char foo(std::string_view sv)
{
    return sv[0];
}
Run Code Online (Sandbox Code Playgroud)

我们已经为大小为0的字符串触发了Undefined Behavior!最后有一个注释:

与std :: basic_string :: operator []不同,std :: basic_string_view :: operator [](size())具有未定义的行为,而不是返回CharT().

有谁知道为什么索引操作符的行为是不协调的?

c++ c++17

6
推荐指数
1
解决办法
209
查看次数

为生成器定义的“in”

为什么要in为生成器定义运算符?

>>> def foo():
...     yield 42
... 
>>> 
>>> f = foo()
>>> 10 in f
False
Run Code Online (Sandbox Code Playgroud)

可能的用例有哪些?

我知道range(...)对象__contains__定义了一个函数,这样我们就可以做这样的事情:

>>> r = range(10)
>>> 4 in r
True
>>> r.__contains__
<method-wrapper '__contains__' of range object at 0x7f82bd51cc00>
Run Code Online (Sandbox Code Playgroud)

f上面没有__contains__方法。

python python-3.8

6
推荐指数
1
解决办法
457
查看次数

额外的圆括号 - 代码无法编译

所以,我有一个返回布尔值的函数

bool func_true()
{
    // do some stuff
    return true;
}
Run Code Online (Sandbox Code Playgroud)

现在实际代码就像这样调用它

if (auto err = func_true())
{
    // some stuff
    std::cout << std::boolalpha << err << '\n';
}
Run Code Online (Sandbox Code Playgroud)

一切都很好,直到这一点.如果我在我的呼叫周围放置一个额外的圆括号,则编译失败:

if ((auto err = func_true())) // doesn't compile!
{
    std::cout << std::boolalpha << err << '\n';
}
Run Code Online (Sandbox Code Playgroud)

GCC错误:

error: expected primary-expression before 'auto'
 if ((auto err = func_true()))
      ^~~~
Run Code Online (Sandbox Code Playgroud)

http://coliru.stacked-crooked.com/a/812424bfdb66eec3

这是一个gcc bug,还是我做了一些愚蠢的错误?

c++ c++11

5
推荐指数
1
解决办法
221
查看次数

继承和属性打包

考虑一下C ++中的这段代码

struct Base
{
   std::int64_t x;
   std::int64_t y;
};
static_assert(sizeof(Base) == 16, "Base not of size 16!");

struct Derived : Base
{
   std::int32_t z;
}__attribute__((packed));
static_assert(sizeof(Derived) == 20, "Derived not of size 20!");
Run Code Online (Sandbox Code Playgroud)

clang认为此代码有效,因为gcc会导致第二个static_assert触发。(“不是大小为20的派生!)。如果我还添加了打包在Base中的属性,则在两个编译器中都可以。没有人知道哪个是正确的,为什么?

c++ g++ clang++

5
推荐指数
1
解决办法
959
查看次数

如何同时迭代两个 Boost Preprocessor 序列?

我想知道是否可以通过 Boost Preprocessor 序列完成以下操作。(大多数 SO 问题以及 Boost Preprocessor 示例仅讨论 1 个序列)

#define seq1 (a)(b)(c)
#define seq2 (1)(2)(3)

// Now iterate over both of them at the same time
Run Code Online (Sandbox Code Playgroud)

这是我的动机。我必须为很多类型定义几个函数,例如

void add(int val) { obj.AddInt(val); }
void add(double val) { obj.AddDouble(val); }
Run Code Online (Sandbox Code Playgroud)

我正在考虑定义两个序列,例如

#define types (int)(double)...
#define funcs (AddInt)(AddDouble)...
Run Code Online (Sandbox Code Playgroud)

然后为函数 add 编写一个宏,并迭代这两个序列。

c c++ boost c-preprocessor boost-preprocessor

5
推荐指数
1
解决办法
914
查看次数

与tuple / dictionary / class相比,namedtuple慢

我很好奇为什么namedtuple比python中的常规类慢。考虑以下:

In [1]: from collections import namedtuple

In [2]: Stock = namedtuple('Stock', 'name price shares')  

In [3]: s = Stock('AAPL', 750.34, 90)

In [4]: %%timeit 
   ...: value = s.price * s.shares
   ...:          
175 ns ± 1.17 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

In [5]: class Stock2:
   ...:     __slots__ = ('name', 'price', 'shares')
   ...:     def __init__(self, name, price, shares):
   ...:         self.name = name       
   ...:         self.price = price
   ...:         self.shares = shares

In [6]: s2 …
Run Code Online (Sandbox Code Playgroud)

python-3.x

5
推荐指数
1
解决办法
796
查看次数

Rust 函数的类型擦除

考虑这个 C++ 代码:

#include <iostream>
#include <functional>

using namespace std;

std::function<int(int, int)> foo(int c) {
  auto add = [] (int a, int b) { return a + b; };
  auto sub = [] (int a, int b) { return a - b; };
  if (c > 42) {
    return add;
  } else {
    return sub;
  }
}

int main() {
  cout << foo(100)(10, 20) << '\n';
}
Run Code Online (Sandbox Code Playgroud)

两个 lambdas (addsub) 都通过类型擦除std::function,然后在 main 中调用该函数。我想知道如何在 Rust …

c++ rust

5
推荐指数
1
解决办法
96
查看次数

编译器将 printf 更改为 puts

考虑以下代码:

#include <stdio.h>

void foo() {
    printf("Hello world\n");
}

void bar() {
    printf("Hello world");
}
Run Code Online (Sandbox Code Playgroud)

这两个函数产生的程序集是:

.LC0:
        .string "Hello world"
foo():
        mov     edi, OFFSET FLAT:.LC0
        jmp     puts
bar():
        mov     edi, OFFSET FLAT:.LC0
        xor     eax, eax
        jmp     printf

Run Code Online (Sandbox Code Playgroud)

现在我知道puts 和 printf之间的区别,但我发现这很有趣,因为 gcc 能够内省 const char* 并确定是调用 printf 还是 puts。

另一个有趣的事情是bar,编译器将返回寄存器 ( eax)清零,即使它是一个void函数。为什么它在那里而不是在里面foo

我假设编译器“内省了我的字符串”是否正确,或者对此有另一种解释?

c assembly gcc compiler-optimization

4
推荐指数
2
解决办法
231
查看次数

如何为代码区域而不是单个项目关闭 rustfmt?

#[rustfmt::skip]允许您在格式化时跳过“代码块”,但这需要skip在每个代码块{}而不是 Clang 样式on/off

考虑这个代码:

fn add(a : i32, b : i32) -> i32 { a + b }
fn sub(a : i32, b : i32) -> i32 { a - b }
Run Code Online (Sandbox Code Playgroud)

rustfmt 将其格式化为:

fn add(a: i32, b: i32) -> i32 {
    a + b
}
fn sub(a: i32, b: i32) -> i32 {
    a - b
}
Run Code Online (Sandbox Code Playgroud)

一个需要两个#[rustfmt::skip]属性而不是单个on/off.

单行函数有一个 rustfmt 选项,但此示例仅用于演示目的。我想控制该地区任何可能的 rustfmt 设置。

rust rustfmt

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

rdi 寄存器用于无参数函数的目的

考虑这个简单的函数:

struct Foo {
  int a;
  int b;
  int c;
  int d;
  int e;
  int f;
};

Foo foo() {
  Foo f;
  f.a = 1;
  f.b = 2;
  f.c = 3;
  f.d = 4;
  f.e = 5;
  f.f = 6;

  return f;
}
Run Code Online (Sandbox Code Playgroud)

它生成以下程序集:

0000000000400500 <foo()>:
  400500:       48 ba 01 00 00 00 02    movabs rdx,0x200000001
  400507:       00 00 00 
  40050a:       48 b9 03 00 00 00 04    movabs rcx,0x400000003
  400511:       00 00 00 
  400514:       48 be 05 00 00 …
Run Code Online (Sandbox Code Playgroud)

c++ assembly x86-64 abi calling-convention

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