- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
上周我接受了一次采访,在其中我学到了一些我不知道的关于 python 的东西(或者更确切地说是意识到如何使用它们),首先,这个问题的内容是 的使用或
用于分支控制。
因此,例如,如果我们运行:
def f():
# do something. I'd use ... but that's actually a python object.
def g():
# something else.
f() or g()
然后如果 f()
评估为某个 true 条件,则返回该值,如果不是,则评估 g()
并返回它产生的任何值,无论是否对或错。这使我们能够使用 or
关键字来实现 if
语句。
我们也可以使用 and
这样 f() 和 g()
如果 将返回
为真,如果 g()
的值f()g()
为假,则 f()
的值。
有人告诉我,这(使用 或
进行分支控制)在诸如 lisp 之类的语言中很常见(因此有 lisp 标签)。我目前关注 SICP学习方案,所以我可以看到 (or (f x) (g x))
将返回 (g x)
的值,假设 (f x)
是#f
。
我对这种技术是否有任何优势感到困惑。它显然实现了分支控制,但对我来说,内置关键字似乎更不言自明。
我也很困惑这是否是“功能性的”?我对纯函数式编程的理解是你使用这样的结构(我最近的 erlang 实验中的一个例子):
makeeven(N,1) -> N+1;
makeeven(N,0) -> N;
makeeven(N) -> makeeven(N,N rem 2).
或者使用 template meta-programming in C++ 的更好、更复杂的示例(通过 cpp-next.com 发现)。我的思考过程是函数式编程的一个方面归结为 piecewise defined functions in code 的使用。用于分支控制(如果你能管理它,尾递归)。
所以,我的问题:
我很抱歉跳过了这么多语言;我只是想把我对它们的理解联系在一起。随意用提到的任何语言回答。如果我误解了任何定义或遗漏了一些重要的东西,我也深表歉意,因为我从未正式学习过计算机科学。
最佳答案
你的面试官一定有“职能背景”。以前很常见的写法
(or (some-condition) (some-side-effect))
但是在 CL 和支持它的 Scheme 实现中,用 unless
编写要好得多。 and
vs when
也是如此。
所以,更具体地说——它不是更实用(事实上,这些东西的常见用途是单方面的条件,一开始就没有功能);没有任何优势(当您知道事物无论如何都是作为宏实现时,这在这些语言中变得非常明显 - 例如,大多数 or
和 and
实现扩展为 如果
);并且任何可能的用例都应该使用 when
和 unless
如果你的实现中有它们,否则最好将它们定义为宏而不是不使用它们。
哦,你可以使用它们的组合来代替两侧的 if
,但这会非常难看。
关于python - 在 FP 中使用 OR 作为分支控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5474514/
我是一名优秀的程序员,十分优秀!