我有一个函数,在最简单的情况下,它可以在一个可迭代的项目上运行.
def foo(items):
for item in items:
# do stuff
Run Code Online (Sandbox Code Playgroud)
有时候,我不想直接传递一个可迭代的项目,而是一个提供获取可迭代的方法的对象:
def foo(obj):
for item in obj.iteritems():
# do same stuff as above
Run Code Online (Sandbox Code Playgroud)
我可以像这样合并这两种情况:
def foo(obj):
try:
items = obj.iteritems()
except ValueError:
items = obj
for item in items:
# do stuff
Run Code Online (Sandbox Code Playgroud)
这很好用.现在我得到第三个用例,如下所示:
def foo(objs):
for item in itertools.chain.from_iterable(obj.iteritems() for obj in objs):
# do same stuff again
Run Code Online (Sandbox Code Playgroud)
我仍然可以使用这种try-except方法,因为接口是不兼容的.但是,嵌套的try catch会变得非常难看.当我想添加第四个用例时更是如此.有没有办法解决这个问题而不嵌套try-blocks?
请考虑以下代码:
from numpy import log2
import matplotlib.pyplot as plt
xdata = [log2(x)*(10/log2(10)) for x in range(1,11)]
ydata = range(10)
plt.plot(xdata, ydata)
plt.show()
Run Code Online (Sandbox Code Playgroud)
这会产生以下情节:
我的问题是,我该如何修改它,以便绘图与输入的数据完全相同,显示为一条直线?这基本上需要适当地缩放x轴,但我无法想象如何做到这一点.这样做的原因是我显示的函数在开始时变化很小,但在有效间隔结束时开始更多地波动,所以我希望在结束时有更高的水平分辨率.如果有人可以为我的方法提出替代解决方案,请随意这样做!
请考虑以下代码:
#include <sstream>
#include <iostream>
class Foo : public std::stringstream {
public:
~Foo() { std::cout << str(); }
};
int main()
{
Foo foo;
foo << "Test1" << std::endl;
Foo() << "Test2" << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我执行此操作时,它给了我:
004177FC
Test1
Run Code Online (Sandbox Code Playgroud)
我不明白为什么第二个例子给我带来胡言乱语.临时应该存在直到整个表达式被评估,那么为什么它与第一个例子的行为不一样?
#include <iostream>
#include <vector>
using namespace std;
class Base
{
public:
void Display( void )
{
cout<<"Base display"<<endl;
}
int Display( int a )
{
cout<<"Base int display"<<endl;
return 0;
}
};
class Derived : public Base
{
public:
void Display( void )
{
cout<<"Derived display"<<endl;
}
};
void main()
{
Derived obj;
obj.Display();
obj.Display( 10 );
}
Run Code Online (Sandbox Code Playgroud)
$test1.cpp: In function ‘int main()’:
test1.cpp:35: error: no matching function for call to ‘Derived::Display(int)’
test1.cpp:24: note: candidates are: void Derived::Display()
Run Code Online (Sandbox Code Playgroud)
在评论时obj.Display(10) …
在试图找到这个问题的答案时,我写了这个小测试程序:
#include <iostream>
#include <fstream>
#include <vector>
#include <iterator>
#include <algorithm>
void writeFile() {
int data[] = {0,1,2,3,4,5,6,7,8,9,1000};
std::basic_ofstream<int> file("test.data", std::ios::binary);
std::copy(data, data+11, std::ostreambuf_iterator<int>(file));
}
void readFile() {
std::basic_ifstream<int> file("test.data", std::ios::binary);
std::vector<int> data(std::istreambuf_iterator<int>(file),
(std::istreambuf_iterator<int>()));
std::copy(data.begin(), data.end(),
std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
}
int main()
{
writeFile();
readFile();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它按预期工作,将数据写入文件,并在读取文件后,正确打印:
0 1 2 3 4 5 6 7 8 9 1000
Run Code Online (Sandbox Code Playgroud)
但是,我不确定是否存在任何陷阱(除了字节问题,在处理二进制数据时总会有这些问题)?这是允许的吗?
我想知道如何删除字符串之间不需要的空格.例如:
>>> a = "Hello world"
Run Code Online (Sandbox Code Playgroud)
我想打印它删除多余的中间空格.
你好,世界
我正在使用std::transforman std::back_inserter来追加元素std::deque.现在转换可能会失败,并且boost::optional在某些情况下将返回无效对象(比如未初始化或空指针).我想过滤掉附加的无效对象.
我想过使用boost::filter_iterator,但不知道如何呈现end()过滤范围的参数.
文档boost::filter_iterator建议输出过滤是可能的.如果我只是专注operator ==于std::back_insert_iterator在这种情况下总是返回false?
除此之外,如果我想追加初始化boost::optional或指针的值,我可以链接boost::filter_iterator和boost::indirect_iterator?
我试图避免推出我自己的transform_valid带有可选extractor功能的函数.
甚至可以filter_iterator用作输出迭代器吗?
我目前正在开发一个将数据存储在SQLite数据库中的应用程序.数据库将具有更多的读取访问权限(事实上,它将被填充一次数据,然后几乎只会进行读取).因此,读取性能非常重要.我目前正在开发的模式很可能在将来发生变化,并添加了额外的列和表.我对数据库一般没有太多经验.我的问题是,特别是在SQLite中,更改架构时是否有任何陷阱需要考虑?是否有任何模式或最佳做法可以提前计划此类案例?
如何修改此代码以生成3个列表,每个列表包含5个元素,而不是现在; 3个列表包含5/10/15个元素?
import random
y = []
def autoSolve():
for i in range(5):
z = random.randrange(1, 10)
y.append(z)
print(y, end="")
for i in range(3):
print("number", i + 1,)
autoSolve()
print()
Run Code Online (Sandbox Code Playgroud) 我该如何使用该remove功能<algorithm>?(或任何其他操作,我想用向量使用它,我试图cdef extern声明它,但我还没有模板功能,我认为)