小编Car*_*ate的帖子

为什么静态方法被认为是一种方法?

我正在为一门课程的一些代码写一个解释,并且不小心使用了这些单词method并且function可以互换.我决定回过头来修改措辞,但在我的理解中遇到了一个漏洞.

根据我的理解,子程序是一个function如果它不作用于一个类的实例(它的效果仅限于它的显式输入/输出),并且是一个method如果它在一个类的实例上运行(它可能携带)对实例造成不纯的副作用).

这里有关于这个主题的很好的讨论.请注意,根据接受的答案的定义,静态method实际上应该是一个函数,因为实例永远不会被隐式传递,并且它不能访问任何实例的成员.

虽然这是心灵,但是静态methods实际上不应该是函数吗?

根据他们的定义,他们不会对某一类的特定情况采取行动; 由于关系,他们只与班级"捆绑".我已经看到一些好看的网站将静态子程序称为"方法"(Oracle,Fredosaurus,ProgrammingSimplified),所以要么它们都忽略了术语,要么我错过了一些东西(我的猜测是后者) .

我想确保我使用正确的措辞.
任何人都能清楚这一点吗?

java methods static static-methods terminology

135
推荐指数
7
解决办法
6930
查看次数

Python3中的过滤器

我正在学习Python中的过滤器概念.我正在运行这样一个简单的代码.

>>> def f(x): return x % 2 != 0 and x % 3 != 0
>>> filter(f, range(2, 25))
Run Code Online (Sandbox Code Playgroud)

但是我没有得到一个列表,而是得到了这样的消息.

<filter object at 0x00FDC550>
Run Code Online (Sandbox Code Playgroud)

这是什么意思?这是否意味着我的过滤对象即出来的列表存储在该内存位置?我如何获得我需要的清单?

python list filter python-3.x

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

类型检查器允许非常错误的类型替换,程序仍然编译

在尝试调试我的程序中的问题时(使用Gloss将2个具有相同半径的圆圈绘制成不同的大小),我偶然发现了一个奇怪的情况.在我处理对象的文件中,我有以下定义*:

type Coord = (Float,Float)
data Obj =  Player  { oPos :: Coord, oDims :: Coord }
Run Code Online (Sandbox Code Playgroud)

在导入Objects.hs的主文件中,我有以下定义:

startPlayer :: Obj
startPlayer = Player (0,0) 10
Run Code Online (Sandbox Code Playgroud)

发生这种情况是因为我为玩家添加和更改字段,并且忘记更新Player之后(其尺寸由单个数字确定以表示半径,但我将其更改为a startPlayer来表示(宽度,高度);如果我做的话玩家对象是一个非圆圈).

令人惊奇的是,上面的代码编译并运行,尽管第二个字段是错误的类型.

我首先想到的可能是我打开了不同版本的文件,但对编译程序中的任何文件的任何更改都会反映出来.

接下来我认为可能Coord由于某种原因没有被使用.注释会startPlayer产生编译器错误,甚至更奇怪的是,更改startPlayerin 10会导致适当的响应(更改起始大小startPlayer); 再次,尽管它是错误的类型.为了确保它正确读取数据定义,我在文件中插入了一个拼写错误,它给了我一个错误; 所以我正在查看正确的文件.

我试图粘贴2段以上的到自己的文件,并吐出预期误差的第二场PlayerPlayer是不正确.

什么可能允许这种情况发生?您认为这是Haskell的类型检查器应该阻止的事情.


我应该注意到,我原来的问题的答案,即两个被认为是相同半径的圆被绘制成不同的大小,其中一个半径实际上是负的.

haskell types

98
推荐指数
2
解决办法
3569
查看次数

在烧瓶应用中保持全局状态

我试图在我的flask应用程序中保存缓存字典.

据我所知,应该使用Application Context,特别是flask.g对象.

建立:

import flask as f

app = f.Flask(__name__)
Run Code Online (Sandbox Code Playgroud)

如果我这样做:

with app.app_context():
    f.g.foo = "bar"
    print f.g.foo
Run Code Online (Sandbox Code Playgroud)

它打印bar.

继续以下内容:

with app.app_context():
    print f.g.foo

AttributeError: '_AppCtxGlobals' object has no attribute 'foo'
Run Code Online (Sandbox Code Playgroud)

我不明白,文档根本没有帮助.如果我正确阅读它们,应该保留状态.

我的另一个想法是简单地使用模块范围的变量:

cache = {}

def some_function():
    cache['foo'] = "bar"
Run Code Online (Sandbox Code Playgroud)

但似乎每次请求都会重置这些内容.

怎么做到这一点?

编辑: Flask 10.1

python state global flask

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

为什么这个长溢出为-1,而不是类型的最小值?

我有以下代码,当完整的二进制树是layer图层高时,它返回树中的节点数:

public static long nNodesUpToLayer(int layer) {
        if (layer < 0) throw new IllegalArgumentException(
            "The layer number must be positive: " + layer );

        //At layer 0, there must be 1 node; the root.
        if (layer == 0) return 1;

        //Else, there will be 1 + 2 * (the number of nodes in the previous layer) nodes.
        return 1 + (2 * nNodesUpToLayer(layer - 1));
Run Code Online (Sandbox Code Playgroud)

奇怪的是,当我输入63函数(产生这个的最小值)时,它会让我回来-1.在62,它回馈9223372036854775807,所以这似乎是由溢出引起的.

它不应该让我回到Java长期的最小值+它溢出的数量吗?无论我给它(通过62)的输入如何,它总是会返回-1 …

java integer integer-overflow biginteger

28
推荐指数
3
解决办法
195
查看次数

受约束的 TypeVar 和联合有什么区别?

如果我想要一个可以是多种可能类型的类型,Unions 似乎是我表示的方式:

U = Union[int, str] 
Run Code Online (Sandbox Code Playgroud)

U可以是一个int或一个str

我注意到虽然TypeVars 允许可选的 var-arg 参数似乎也做同样的事情:

T = TypeVar("T", int, str)
Run Code Online (Sandbox Code Playgroud)

双方TU似乎只被允许采取的类型strint

这两种方式之间有什么区别,何时应该首选?

python type-hinting python-3.x type-variables union-types

18
推荐指数
1
解决办法
2227
查看次数

什么是库中的哈希(#)来源?

我试图弄清楚mVars是如何工作的,我偶然发现了这段代码:

-- |Create an 'MVar' which is initially empty.
newEmptyMVar  :: IO (MVar a)
newEmptyMVar = IO $ \ s# ->
    case newMVar# s# of
         (# s2#, svar# #) -> (# s2#, MVar svar# #)
Run Code Online (Sandbox Code Playgroud)

除了混淆地相互递归之外newMVar,它还充满了哈希(#).

在两者之间,我无法弄清楚它是如何工作的.我知道这基本上只是mVar的伪构造函数,但模块的其余部分(实际上大部分库)都包含它们,我找不到它们.谷歌搜索"Haskell哈希"并没有产生任何相关的东西.

haskell

16
推荐指数
1
解决办法
853
查看次数

更改一个列表中的元素会更改多个列表

我有一份清单说mysolution:

>>>mySolution
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
>>> mySolution[0][0] = 1    
>>> mySolution
[[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]
Run Code Online (Sandbox Code Playgroud)

预期产量:

[[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
Run Code Online (Sandbox Code Playgroud)

为什么我的列表列表中的所有第一个元素都被更改为1?我只想将第一个列表的第一个元素更改为1.

python list python-2.7

13
推荐指数
2
解决办法
8616
查看次数

PowerShell 函数是否返回值由什么决定?

我试图弄清楚是什么决定了是否从 PowerShell 函数返回一个值,并且我遇到了一些奇怪的情况。about_return 文档说:

在 PowerShell 中,每个语句的结果都会作为输出返回,即使没有包含 Return 关键字的语句也是如此。

但这似乎掩盖了细节。如果我运行这个:

function My-Function {
    1
    [System.Console]::WriteLine("Hello")
    $null
    $true
    $false
    0
    2
}
Run Code Online (Sandbox Code Playgroud)

运行此命令将返回一个数组(并打印“Hello”):

1
True
False
0
2
Run Code Online (Sandbox Code Playgroud)

这意味着它$null不会自动返回。然后我尝试递增,因为我正在函数中使用它:

function My-Function {
    $n = 1
    $n
    $n++
    ($n++)
    -join @(1, 2, 3)
    (-join @(1, 2, 3))
}
Run Code Online (Sandbox Code Playgroud)

返回:

1
2
123
123
Run Code Online (Sandbox Code Playgroud)

所以,$n$n++退回了,但($n++)不是吗?但与另一个运算符 ( -join) 相比,每种情况都是相同的。为什么将括号括起来$n++会阻止它被返回,并且为什么其他运算符没有相同的行为?这更加令人困惑,因为=运算符似乎以相反的方式工作:

function My-Function {
    ($n = 1)
    $n
    $n++
    ($n++)
} …
Run Code Online (Sandbox Code Playgroud)

powershell function powershell-7.0

11
推荐指数
1
解决办法
2176
查看次数

类型构造函数可以被视为函数式编程语言中的类型吗?

我正在接近Haskell编程语言,我有Scala和Java开发人员的背景.

我正在阅读类型构造函数背后的理论,但我无法理解它们是否可以被视为类型.我的意思是,在Scala中,您使用关键字classtrait定义类型构造函数.想想List[T],或者Option[T].同样在Haskell中,您使用相同的关键字data,用于定义新类型.

那么类型构造函数也是类型吗?

haskell types type-theory scala

9
推荐指数
2
解决办法
313
查看次数