Python的Zen声明应该只有一种方法可以做 - 但我经常遇到决定何时使用函数与何时使用方法的问题.
让我们来看一个简单的例子 - 一个ChessBoard对象.假设我们需要一些方法来获得董事会所有合法的King移动.我们写ChessBoard.get_king_moves()或get_king_moves(chess_board)吗?
以下是我看到的一些相关问题:
我得到的答案基本上没有结果:
为什么Python使用某些功能的方法(例如list.index())但是其他功能(例如len(list))?
主要原因是历史.函数用于那些对一组类型通用的操作,这些操作甚至可以用于根本没有方法的对象(例如元组).当您使用Python的功能特性(map(),apply()等)时,拥有一个可以很容易地应用于无定形对象集合的函数也很方便.
事实上,实现len(),max(),min()作为内置函数实际上比将它们作为每种类型的方法实现它们的代码更少.人们可以对个别案例嗤之以鼻,但它是Python的一部分,现在进行这样的根本性改变为时已晚.必须保留这些功能以避免大量代码破坏.
虽然有趣,但上述内容并未真正说明采用何种策略.
这是原因之一 - 使用自定义方法,开发人员可以自由选择不同的方法名称,如getLength(),length(),getlength()或任何方法.Python强制执行严格命名,以便可以使用公共函数len().
稍微有点儿了.我的看法是函数在某种意义上是Pythonic版本的接口.
最后,来自Guido本人:
谈论能力/接口让我想到了一些我们的"流氓"特殊方法名称.在语言参考中,它说:"类可以通过定义具有特殊名称的方法来实现特殊语法(例如算术运算或下标和切片)调用的某些操作." 但是所有这些方法都有特殊的名称,
__len__或者__unicode__似乎是为了内置函数的优势而提供的,而不是为了支持语法.据推测,在基于接口的Python中,这些方法将变成ABC上的常规命名方法,这样就__len__可以了Run Code Online (Sandbox Code Playgroud)class container: ... def len(self): raise NotImplemented虽然,再考虑一下,我不明白为什么所有语法操作都不会在特定的ABC上调用适当的常用命名方法."
<"举例来说,大概会调用"object.lessthan"(或者是"comparable.lessthan").所以另一个好处是能够让Python远离这个错位名称奇怪,这在我看来是HCI的改进.嗯.我不确定我同意(数字:-).
有两点"Python基本原理"我想首先解释一下.
首先,由于HCI的原因,我选择len(x)而不是x.len()(
def __len__()后来发布).实际上有两个相互交织的原因,都是人机交互:(a)对于某些操作,前缀表示法只比读后缀更好 - 前缀(和中缀!)操作在数学中有悠久的传统,它喜欢视觉效果帮助数学家思考问题的符号.比较与我们改写像公式简单
x*(a+b)到x*a + x*b使用原始OO符号做同样的事情的笨拙.(b)当我阅读代码时,
len(x)我知道它是在询问某些东西的长度.这告诉我两件事:结果是一个整数,参数是某种容器.相反,当我阅读时x.len(),我必须知道这x是某种实现接口的容器或从具有标准的类继承len().当没有实现映射的类有一个get()或一个keys()方法,或者一个不是文件的东西有一个方法时,见证我们偶尔会遇到的困惑write().用另一种方式说同样的事情,我认为'len'是一种内置 操作 …
我正在尝试将可选链接与数组而不是对象一起使用,但不确定如何执行此操作:
这就是我想要做的myArray.filter(x => x.testKey === myTestKey)?[0]。还用一个函数尝试类似的事情:
let x = {a: () => {}, b: null}
console.log(x?b());
Run Code Online (Sandbox Code Playgroud)
但是它给出了这样的错误,所以如何将它与数组或函数一起使用。
我的同事一直在使用带有小写"f"的"new function()"来定义JavaScript中的新对象.它似乎在所有主流浏览器中运行良好,并且在隐藏私有变量方面似乎也相当有效.这是一个例子:
var someObj = new function () {
var inner = 'some value';
this.foo = 'blah';
this.get_inner = function () {
return inner;
};
this.set_inner = function (s) {
inner = s;
};
};
Run Code Online (Sandbox Code Playgroud)
一旦使用"this",它就成为someObj的公共财产.所以someObj.foo,someObj.get_inner()和someObj.set_inner()都是公开的.另外,set_inner()和get_inner()是特权方法,因此它们可以通过闭包访问"内部".
但是,我在任何地方都没有看到任何对此技术的引用.甚至Douglas Crockford的JSLint抱怨它:
- 怪异的建筑.删除'新'
我们在生产中使用这种技术,它似乎运作良好,但我有点担心它,因为它没有在任何地方记录.有谁知道这是否是一种有效的技术?
我正在玩PHP中的匿名函数,并意识到它们似乎没有达到它们之外的变量.有没有办法解决这个问题?
例:
$variable = "nothing";
functionName($someArgument, function() {
$variable = "something";
});
echo $variable; //output: "nothing"
Run Code Online (Sandbox Code Playgroud)
这将输出"无".有没有办法匿名功能可以访问$variable?
只是一个简单的问题:我已经看到一些PHP函数在顶部被注释,使用了我不知道的格式:
/**
*
* Convert an object to an array
*
* @param object $object The object to convert
* @return array
*
*/
Run Code Online (Sandbox Code Playgroud)
我的IDE为@param和@return之类的内容提供了一个下拉选项,因此必须在某处记录.我试过搜索谷歌,但它的搜索中不会包含@符号.
这种评论格式是什么?我在哪里可以找到相关信息?
我想知道JavaScript是否支持在另一个函数或嵌套函数中编写函数(我在博客中阅读它).这真的有可能吗?事实上,我已经使用过这些但不确定这个概念.我真的不清楚 - 请帮忙!
C中两个函数有什么区别?
void f1(double a[]) {
//...
}
void f2(double *a) {
//...
}
Run Code Online (Sandbox Code Playgroud)
如果我要在一个相当长的数组上调用这些函数,这两个函数的行为会不同,它们会占用更多的空间吗?
我需要创建一个只能执行一次的函数,每次执行后都不会执行.我从C++和Java中了解到可以完成工作的静态变量,但我想知道是否有更优雅的方法来做到这一点?
没有操作的JavaScript约定是什么?
passfunction() {},它只调用上面的空函数.$.noop()或者值是否可以接受false? 在上下文中...所有这些工作都没有在Chrome中引发错误:
var a = 2;
(a === 1) ? alert(1) : function() {};
(a === 1) ? alert(1) : $.noop();
(a === 1) ? alert(1) : false;
(a === 1) ? alert(1) : 0;
Run Code Online (Sandbox Code Playgroud)
编辑:很多人回答说,"不要这样做!改变代码结构!" 这让我想起了有人问如何嗅探浏览器的帖子.他接到一连串的帖子说:"不要这样做!它是邪恶的",但没有人告诉他如何嗅探浏览器.这不是代码审查.想象一下,您正在处理无法更改的遗留代码,如果没有传入某些函数,它将丢失一个错误.或者,简单地说,这就是客户想要的方式,他们付钱给我.所以,请尊重,请回答这个问题:在JavaScript中指定"无操作"功能的最佳方法是什么?
编辑2:其中一个怎么样?
true;
false;
0;
1;
null;
Run Code Online (Sandbox Code Playgroud) 我只是好奇我将如何处理这个问题.如果我有一个函数,并且我想在完全执行时发生某些事情,我该如何将它添加到函数中?谢谢