在C++中我需要迭代一定次数,但我不需要迭代变量.例如:
for( int x=0; x<10; ++x ) {
/* code goes here, i do not reference "x" in this code */
}
Run Code Online (Sandbox Code Playgroud)
我意识到我可以通过用lambda或命名函数替换"code goes here"来做到这一点,但这个问题特别针对for循环.
我希望C++ 11的基于范围的for循环有助于:
for( auto x : boost::irange(0,10) ) {
/* code goes here, i do not reference "x" in this code */
}
Run Code Online (Sandbox Code Playgroud)
但是上面给出了一个"未引用的局部变量",因为我从未明确引用x.
我想知道是否有一种更优雅的方式来编写上面的for循环,以便代码不会生成"未引用的局部变量"警告.
我发现自己经常在pdb中这样做:
import pprint
pprint.PrettyPrinter().pprint(variable_of_interest)
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法从pdb中打印变量?我正在寻找一些更容易输入的东西,理想情况下它总是在pdb中可用,所以我可以在我调试的任何时候使用它.
我正在编写一个C + 11函数,它将可调用作为参数,我希望将该参数默认为无操作函数.到目前为止,这是我最好的尝试:
const std::function<void()> noop= [](){};
void f( int x, int y, std::function<void()> fn= noop ) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
我想知道标准库是否为我提供了"noop"std函数,还是我需要像上面那样编写自己的函数?我也想知道是否有办法避免明确命名"noop"功能.例如:
void f( int x, int y, std::function<void()> fn= [](){} ) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
将不会编译(在Visual Studio 2012 Update 3中),也不会:
void f( int x, int y, std::function<void()> fn= std::function<void()>([](){}) ) { /* ... */ }
Run Code Online (Sandbox Code Playgroud) 我有一个C++背景,我正在学习Python.我正在编写需要从for循环中提取特定值的代码:
seventh_value = None # ** my question is about this line
for index in range(1, 10):
value = f(index)
# we have a special interest in the seventh value
if index == 7:
seventh_value = value
# (do other things with value here)
# make use of seventh_value here
Run Code Online (Sandbox Code Playgroud)
在C++中,我需要在for循环之前声明seven_value,以确保其范围不限于for循环.在Python中我不需要这样做.我的问题是省略初始赋值给seven_value是否是好的风格.
我知道如果循环没有迭代至少7次,那么我可以通过在循环之前分配到seventh_value来避免NameError.让我们假设很明显它会迭代至少7次(如上面我硬编码10次迭代的例子).
我也明白,可能还有其他方法可以从迭代中提取特定值.我真的只是想知道在循环之前引入变量是否是好的风格,如果它们将在循环之后使用.
我上面写的代码对我来说很清楚,但我认为我只是用C++眼睛看到它.
我有一个C++ 11应用程序,它具有生成数据的高优先级线程,以及一个消耗它的低优先级线程(在我的情况下,将其写入磁盘).我想确保高优先级的生产者线程永远不会被阻止,即它只使用无锁算法.
使用无锁队列,我可以从生产者线程将数据推送到队列,并从消费者线程中轮询它,从而实现上述目标.我想修改我的程序,以便消费者线程在非活动状态而不是轮询时阻塞.
似乎C++ 11条件变量可能对阻塞使用者线程很有用.有人能告诉我一个如何使用它的例子,同时避免消费者睡觉时数据仍在队列中吗?更具体地说,我想确保在生产者将最后一个项目推入队列后,消费者总是在某个有限的时间内被唤醒.生产者保持非阻塞也很重要.
我正在开发 Chrome 扩展程序,我想拥有该扩展程序:
我看到chrome.downloads API 允许我启动下载并打开文件,但是我是否可以读取文件的内容(不编写本机代码)?
我在OS X下的Sublime 2(v2.0.2)中使用SublimeREPL.我将Python文件发送到SublimeREPL窗口进行评估,我想不时清除SublimeREPL窗口.该窗口似乎是只读的,因此cmd-a,delete不起作用.
Python是否具有与其布尔运算符对应的扩充赋值语句?
例如,我可以这样写:
x = x + 1
Run Code Online (Sandbox Code Playgroud)
或这个:
x += 1
Run Code Online (Sandbox Code Playgroud)
有什么我可以写的代替这个:
x = x and y
Run Code Online (Sandbox Code Playgroud)
为避免两次写"x"?
请注意,我知道使用&=的语句,但我正在寻找一个当y是任何类型时都能工作的语句,而不仅仅是当y是布尔值时.
在 Python(2.7,在 Linux 上运行)中调试脚本时,我偶尔会注入 pdb.set_trace()(注意我实际上使用的是 ipdb),例如:
import ipdb as pdb
try:
do_something()
# I'd like to look at some local variables before running do_something_dangerous()
pdb.set_trace()
except:
pass
do_something_dangerous()
Run Code Online (Sandbox Code Playgroud)
我通常从 shell 运行我的脚本,例如
python my_script.py
Run Code Online (Sandbox Code Playgroud)
有时在我的调试会话期间,我意识到我不想运行 do_something_dangerous()。停止程序执行以便 do_something_dangerous() 不运行并且我可以退出到 shell 的最简单方法是什么?
据我了解,按 ctrl-d (或发出调试器的退出命令)将简单地退出 ipdb 并且程序将继续运行(在我上面的示例中)。按 ctrl-c 似乎会引发 KeyboardInterrupt,但我从未理解引发它的上下文。
我希望像 ctrl-q 这样的东西可以简单地取消整个过程,但我找不到任何东西。
我知道我的示例是人为设计的,但我的问题是当正在调试的代码设置为捕获异常时如何从 pdb 中止执行。这不是关于如何重组上面的代码使其工作!
我有一个Python项目列表(v2.7但v2/v3兼容解决方案会很好),例如:
a = [1,6,5,None,5,None,None,1]
Run Code Online (Sandbox Code Playgroud)
我想过滤掉None值,然后对结果列表做一些事情,例如:
b = [x for x in a if x is not None]
c = f(b)
Run Code Online (Sandbox Code Playgroud)
然后我想将None值放回原始索引中:
d = # ??? should give me [c[0],c[1],c[2],None,c[3],None,None,c[4]]
Run Code Online (Sandbox Code Playgroud)
我需要立即将整个过滤列表传递给函数f().我想知道是否有一种优雅的方式来做到这一点,因为到目前为止我所有的解决方案都很混乱.这是我迄今为止最干净的一个:
d = c
for i in range(len(a)):
if not a[i]:
d.insert(i, None)
Run Code Online (Sandbox Code Playgroud)
编辑:修复列表理解中的拼写错误.