我正在为一门课程的一些代码写一个解释,并且不小心使用了这些单词method并且function可以互换.我决定回过头来修改措辞,但在我的理解中遇到了一个漏洞.
根据我的理解,子程序是一个function如果它不作用于一个类的实例(它的效果仅限于它的显式输入/输出),并且是一个method如果它在一个类的实例上运行(它可能携带)对实例造成不纯的副作用).
这里有关于这个主题的很好的讨论.请注意,根据接受的答案的定义,静态method实际上应该是一个函数,因为实例永远不会被隐式传递,并且它不能访问任何实例的成员.
虽然这是心灵,但是静态methods实际上不应该是函数吗?
根据他们的定义,他们不会对某一类的特定情况采取行动; 由于关系,他们只与班级"捆绑".我已经看到一些好看的网站将静态子程序称为"方法"(Oracle,Fredosaurus,ProgrammingSimplified),所以要么它们都忽略了术语,要么我错过了一些东西(我的猜测是后者) .
我想确保我使用正确的措辞.
任何人都能清楚这一点吗?
我正在学习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)
这是什么意思?这是否意味着我的过滤对象即出来的列表存储在该内存位置?我如何获得我需要的清单?
在尝试调试我的程序中的问题时(使用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段以上的到自己的文件,并吐出预期误差的第二场Player中Player是不正确.
什么可能允许这种情况发生?您认为这是Haskell的类型检查器应该阻止的事情.
我应该注意到,我原来的问题的答案,即两个被认为是相同半径的圆被绘制成不同的大小,其中一个半径实际上是负的.
我试图在我的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
我有以下代码,当完整的二进制树是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 …
如果我想要一个可以是多种可能类型的类型,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)
双方T并U似乎只被允许采取的类型str和int。
这两种方式之间有什么区别,何时应该首选?
我试图弄清楚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哈希"并没有产生任何相关的东西.
我有一份清单说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.
我试图弄清楚是什么决定了是否从 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) 我正在接近Haskell编程语言,我有Scala和Java开发人员的背景.
我正在阅读类型构造函数背后的理论,但我无法理解它们是否可以被视为类型.我的意思是,在Scala中,您使用关键字class或trait定义类型构造函数.想想List[T],或者Option[T].同样在Haskell中,您使用相同的关键字data,用于定义新类型.
那么类型构造函数也是类型吗?
python ×4
haskell ×3
java ×2
list ×2
python-3.x ×2
types ×2
biginteger ×1
filter ×1
flask ×1
function ×1
global ×1
integer ×1
methods ×1
powershell ×1
python-2.7 ×1
scala ×1
state ×1
static ×1
terminology ×1
type-hinting ×1
type-theory ×1
union-types ×1