小编bat*_*rat的帖子

在Python中选择不同的switch-cases替换 - 字典或if-elif-else?

我最近阅读了建议不要在支持它的语言中使用switch-case语句的问题.就Python而言,我已经看到了许多交换机案例替换,例如:

  1. 使用字典(许多变体)
  2. 使用元组
  3. 使用函数装饰器(http://code.activestate.com/recipes/440499/)
  4. 使用多态(推荐的方法而不是类型检查对象)
  5. 使用if-elif-else梯形图
  6. 有人甚至推荐了访客模式(可能是外在的)

鉴于选择的种类繁多,我在确定如何处理特定代码时遇到了一些困难.我想学习选择其中一种方法的标准.另外,我很感谢在我遇到麻烦的具体情况下做什么的建议(对选择的解释).

这是具体问题:
(1)

def _setCurrentCurve(self, curve):
        if curve == "sine":
            self.currentCurve =  SineCurve(startAngle = 0, endAngle = 14,
            lineColor = (0.0, 0.0, 0.0), expansionFactor = 1,
            centerPos = (0.0, 0.0))
        elif curve == "quadratic":
            self.currentCurve = QuadraticCurve(lineColor = (0.0, 0.0, 0.0))
Run Code Online (Sandbox Code Playgroud)

响应于选择从菜单绘制曲线,该方法由qt-slot调用.一旦申请完成,上述方法将包含总共4-7条曲线.在这种情况下使用丢弃词典是否合理?由于最明显的方法是if-elif-else,我应该坚持下去吗?我也考虑在这里使用**kargs(有朋友的帮助)因为所有曲线类都使用**kargs ...

(2)
第二段代码是当用户改变曲线属性时调用的qt-slot.基本上,槽从gui(spinBox)获取数据并将其放入适当曲线类的实例变量中.在这种情况下,我再次有同样的问题 - 我应该使用dict吗?

这是前面提到的插槽 -

def propertyChanged(self, name, value):
    """A Qt slot, to react to changes of SineCurve's properties."""
    if name == "amplitude": …
Run Code Online (Sandbox Code Playgroud)

python switch-statement

18
推荐指数
2
解决办法
7826
查看次数

使用cin在C++中进行输入验证的最佳方法是什么?

我哥哥最近开始学习C++.他告诉我在尝试在简单程序中验证输入时遇到的问题.他有一个文本菜单,用户输入一个整数choice,如果他们输入了无效的选项,他们会被要求再次输入(循环时).但是,如果用户输入的是字符串而不是int,则代码会中断.我在stackoverflow上阅读了各种问题,并告诉他重写他的代码:

#include<iostream>
using namespace std;

int main()
{
    int a;
    do
    {
    cout<<"\nEnter a number:"
    cin>>a;
        if(cin.fail())
        {
            //Clear the fail state.
            cin.clear();
            //Ignore the rest of the wrong user input, till the end of the line.
            cin.ignore(std::numeric_limits<std::streamsize>::max(),\
                                                    '\n');
        }
    }while(true);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

虽然这个工作正常,但我还尝试了其他一些想法:
1.使用try catch块.它没用.我认为这是因为输入错误不会引发异常.我试过if(! cin){//Do Something}哪个也没用.我还没想出来.
3.第三,我尝试输入一个固定长度的字符串然后解析它.我会用atoi().这个标准是否合规且便携?我应该编写自己的解析函数吗?
4.如果编写一个使用cin的类,但动态地进行这种错误检测,也许通过在运行时确定输入变量的类型,它会有太多的开销吗?它甚至可能吗?

我想知道进行这种检查的最佳方法是什么,最佳做法是什么?

我想补充一点,虽然我不是新编写C++代码,但我是编写符合标准的良好代码的新手.我试图忘掉不良做法并学习正确的做法.如果回答者提供详细解释,我将非常感激.

编辑:我看到litb回答了我以前的一个编辑.我会在这里发布该代码以供参考.

#include<iostream>
using namespace std;

int main()
{
    int a;
    bool inputCompletionFlag = true;
    do
    {
    cout<<"\nEnter a number:"
    cin>>a;
        if(cin.fail())
        { …
Run Code Online (Sandbox Code Playgroud)

c++ validation coding-style

8
推荐指数
2
解决办法
2万
查看次数

有人可以解释为什么scipy.integrate.quad在积分sin(X)的同时给出了相同长距离的不同结果吗?

我试图使用数值积分方法在我的程序中数字地集成任意(当我编码时已知)函数.我使用Python 2.5.2和SciPy的数字集成包.为了感受它,我决定尝试整合sin(x)并观察这种行为 -

>>> from math import pi
>>> from scipy.integrate import quad
>>> from math import sin
>>> def integrand(x):
...     return sin(x)
... 
>>> quad(integrand, -pi, pi)
(0.0, 4.3998892617846002e-14)
>>> quad(integrand, 0, 2*pi)
(2.2579473462709165e-16, 4.3998892617846002e-14)
Run Code Online (Sandbox Code Playgroud)

我发现这种行为很奇怪,因为 -
1.在普通的集成中,整个循环的积分给出零.
2.在数值积分中,这个(1)不一定是这种情况,因为你可能只是近似曲线下的总面积.

无论如何,假设1为True或假设2为True,我发现行为不一致.两个积分(-pi到pi和0到2*pi)都应返回0.0(元组中的第一个值是结果,第二个值是错误)或返回2.257 ...

有人可以解释为什么会这样吗?这真的是不一致吗?有人也可以告诉我,如果我遗漏了一些关于数值方法的基本信息吗?

在任何情况下,在我的最终应用程序中,我计划使用上面的方法来查找函数的弧长.如果有人有这方面的经验,请告诉我在Python中执行此操作的最佳政策.

编辑
注意
我已经在存储在数组中的范围内的所有点处具有第一个差值.
当前错误是可以容忍的.
结束说明

我已经阅读了Wikipaedia.正如Dimitry指出的那样,我将整合sqrt(1 + diff(f(x),x)^ 2)来获得弧长.我想问的是 - 是否有更好的近似/最佳实践(?)/更快的方式来做到这一点.如果需要更多上下文,我会在此处单独发布/发布上下文,如您所愿.

python integration scipy numerical-methods

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

了解维基百科代码的通用深度优先树搜索?

我正在刷新不同的树遍历方法,最后阅读以下维基百科文章.正如所料,二叉树有三种深度优先遍历方法:

  1. 预订遍历
  2. 后序遍历
  3. 顺序遍历

然后,本文继续处理任意(通用)树的深度优先遍历.为方便起见,我把它贴在这里:

// To traverse a non-empty tree in depth-first order,
// perform the following operations recursively at each node:
Perform pre-order operation
for i=1 to n-1 do
    Visit child[i], if present
    Perform in-order operation

Visit child[n], if present
Perform post-order operation
Run Code Online (Sandbox Code Playgroud)

以下是维基百科提供的所有解释:

其中n是子节点的数量.根据手头的问题,预订,有序或后序操作可能无效,或者您可能只想访问特定的子节点,因此这些操作应视为可选.而且,实际上可能需要不止一个预订,有序和后订单操作.例如,当插入三元树时,通过比较项目来执行预订操作.之后可能需要后序操作来重新平衡树.

指定的算法对我没有意义,因为它是根据未定义的操作指定的:

  1. 预订操作.
  2. 后期订单操作.
  3. 顺序操作.

为了增加混乱,我无法根据我所知道的以及维基百科文章中的内容提出所述操作的定义.我一直在困惑这一段时间没有真正的突破.我有以下问题:

  1. 维基百科文章中指定的算法是错误的吗?我怀疑它是,但除了它是不明确的事实之外,不能肯定地说什么.
  2. 后序,预订,深度优先遍历甚至为通用树定义?这些实际使用过吗?它与三个操作的定义有关吗?如果是这样,怎么样?
  3. 如果算法确实正确,有人可以为我定义上述操作并解释它是如何工作的吗?

algorithm tree tree-traversal depth-first-search data-structures

4
推荐指数
1
解决办法
1349
查看次数

Toast的保证金值是做什么的?

Android Toast类提供了获取和设置边距的方法.我很确定他们会提到整个吐司消息的外边距.由于Toast消息在UI上浮动,为什么这些边距确实必要?

我试着查看SDK参考以及搜索Internet.我找到的最接近解决方案的是一条线建议,即边距偏移都允许控制Toast的定位.为什么我需要两种方法(尽管概念上不同,因为边距允许按容器宽度百分比来规定),以控制Toast的定位?

可以肯定的是,这些边距不像其他布局的填充那样工作吗?这没有意义,但我想明确一点.

总而言之,我想知道为什么需要保证金,保证金的作用以及保证金与抵消的使用情况,即何时应该使用保证金,何时应使用抵消额,为什么?

更新:

我还没有找到任何答案.我尝试使用边距而不是在代码中使用偏移量,并发现它们似乎提供了两种不同的Toast定位范例.设计意图(为什么有两种方法),当我应该使用一种方法而不是另一种方法时(或者至少是其他程序员/ UI设计者发现一种方法比其他方法更有用的例子),甚至是确切的操作(做边距)这些方法的中心"它们里面的吐司?是对最近的容器边缘施加的边缘?"仍然不清楚.

更新2:

我仔细查看了文档,还看了谷歌指出的Toast.java的一些代码.显而易见的是Toast包含在一个Window(Activity窗口?)中,它可能是一个叠加层.WindowManager.LayoutParams类还提供了进一步的线索.我已决定使用Toasts,偏移和边距,以及查看AOSP中的代码以获得更清晰的理解.

我会在这里更新,因为我发现了更多.

android android-ui

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