- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有这个问题:
cons(a, b)
constructs a pair, andcar(pair)
andcdr(pair)
returns the first and last element of that pair. For example,car(cons(3, 4))
returns3
, andcdr(cons(3, 4))
returns4
.Given this implementation of cons:
def cons(a, b):
def pair(f):
return f(a, b)
return pairImplement
car
andcdr
.
cons(..)
。
a
或
b
。为何函数
f
在那里?任务是实现
car
和
cdr
,并应提供函数
f
。
最佳答案
首先:Python函数对象是一流的对象。 def
语句会生成一个新的函数对象,您可以使用函数名称来检索该对象:
>>> def foo():
... return 'foo was called'
...
>>> foo
<function foo at 0x11b3d8ae8>
(...)
添加到引用中来调用函数对象:
>>> bar = foo
>>> bar()
'foo was called'
cons
之类的函数中,该名称被添加为本地名称。
return pair
函数中的
cons
然后将函数对象
pair
返回给调用者。
f
和
a
和
b
也是变量。如果传入函数对象作为参数,则
parameter_name(...)
将调用
paramater_name
并传入
...
部分中的所有参数。
f(a, b)
调用
f
并传递
a
和
b
。
spam
是
bar
函数闭包中的名称:
>>> def foo():
... spam = 'Vikings'
... def bar():
... return spam
... return bar
...
>>> foo()
<function foo.<locals>.bar at 0x11b44bf28>
>>> foo()()
'Vikings'
foo()
返回一个新的函数对象;
bar()
内部的
foo()
函数。调用返回的函数对象将生成
'Vikings'
,即
spam
函数中
foo
变量的值。
bar()
是如何获得该权限的?通过关闭:
>>> foo().__closure__
(<cell at 0x11b3c05b8: str object at 0x11b469180>,)
>>> foo().__closure__[0].cell_contents
'Vikings'
spam
,则再次调用
bar()
将返回新值)。
cons()
创建一个内部函数
pair()
,并且
pair()
通过其闭包可以访问参数
a
和
b
:
>>> def cons(a, b):
... def pair(f):
... return f(a, b)
... return pair
...
>>> cons(42, 81)
<function cons.<locals>.pair at 0x11b46f048>
>>> pair_42_81 = cons(42, 81)
>>> pair_42_81.__closure__
(<cell at 0x11b3c02b8: int object at 0x10f59a750>, <cell at 0x11b3c05b8: int object at 0x10f59ac30>)
>>> pair_42_81.__closure__[0].cell_contents
42
>>> pair_42_81.__closure__[1].cell_contents
81
pair()
函数采用参数
f
并调用该参数,并传入
a
和
b
。让我们看看当我们传入
print
时会发生什么。
print
也是一个函数,它是一个您可以调用的对象,它会将参数写入控制台,中间用空格隔开:
>>> print
<built-in function print>
>>> print('arg1', 'arg2')
arg1 arg2
pair()
返回的
cons()
函数,则可以看到
f(a, b)
的作用:
>>> pair_42_81(print)
42 81
print
的
pair()
被分配给
f
,而
f(a, b)
与
print(a, b)
完全相同。
print()
,因为这些值已写到控制台中。但是您也可以创建一个返回新值的函数。假设您有一个将两个数字相加并返回该值的函数:
>>> def add(first, second):
... return first + second
...
>>> add(42, 81)
123
>>> pair_42_81(add)
123
123
,或者我们可以让
pair_42_81()
为我们执行此操作,并将相同的结果返回给我们。简单的!
pair_42_81
在闭包中存储了
a = 42
和
c = 81
,并且将使用它们来调用带有这两个参数的给定对象
f
。
cdr()
和
car()
,它们将返回一对中的第一个或最后一个元素。如果
cons(a, b)
产生返回
pair(f)
的
f(a, b)
,则
cdr()
和
car()
必须分别创建一个传递给
pair()
的函数,该函数将提取
a
或
b
。
cdr()
和
car()
调用
pair()
。嵌套函数完成选择
a
或
b
的工作,并返回该值。然后将调用结果返回给外界:
def car(pair):
def return_first(a, b):
return a
return pair(return_first)
def cdr(pair):
def return_last(a, b):
return b
return pair(return_last)
pair(return_first)
调用
return_first(a, b)
,返回
a
,并且
car()
可以将其返回给调用者:
>>> car(cons(42, 81))
42
pair(return_last)
,仅现在返回
b
:
>>> cdr(cons(42, 81))
81
car
,
cdr
和
cons
来自LISP,其中
cons a b
构造一个带有两个指针(解释名称)的单元,以及
car
(意味着在LISP的IBM 704指令集中创建了注册号的地址部分的内容)和
cdr
(含义是704语言中寄存器编号的减量部分的内容)占据了该单元格的第一部分和其余部分。参见
this Wikipedia article on the names。
关于python - 不了解python的内部功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52481607/
这是我的测试用例。 http://tobeythorn.com/isi/dummy2.svg http://tobeythorn.com/isi/isitest.html 如果我自己打开 svg,内部
这是我的测试用例。 http://tobeythorn.com/isi/dummy2.svg http://tobeythorn.com/isi/isitest.html 如果我自己打开 svg,内部
我正在尝试做类似的事情: SELECT SUM( CASE WHEN ( AND EXISTS(SELECT 1
我想问如何在外部 ng-repeat 内部正确使用内部 ng-repeat: 这意味着你想使用这样的东西: {{milestone.id}} {{
我希望在 wordpress 的仪表板内编辑 css 样式并且如果可能的话不必编辑 php 文件。 我知道至少可以编辑一些属性,所以我希望我可以直接在仪表板中编辑所有属性。 更具体地说如何更改自定义类
我在安装在 windows10 上的 vmware 中的 Ubuntu 上安装了伪分布式独立 hadoop 版本。 我从网上下载了一个文件,复制到ubuntu本地目录/lab/data 我在 ubun
我有一个如下所示的 WHERE 语句: WHERE ((@Value1 IS NULL AND [value1_id] IS NULL) OR [value1_id] = ISNULL(@Va
我有一个如下所示的 WHERE 语句: WHERE ((@Value1 IS NULL AND [value1_id] IS NULL) OR [value1_id] = ISNULL(@Va
在我的一些测试帮助程序代码中,我有一个名为 FakeDbSet(Of T) 的 IDbSet(Of T) 实现,它模拟了许多 EF 行为,但没有实际的数据库。我将类声明为 Friend ,因为我想强制
我正在寻找 Cassandra/CQL 的常见 SQL 习语 INSERT INTO ... SELECT ... FROM ... 的表亲。并且一直无法找到任何以编程方式或在 CQL 中执行此类操作
如何防止内部 while 循环无限运行?问题是,如果没有外部 while 循环,内部循环将毫无问题地运行。我知道它必须对外循环执行某些操作,但我无法弄清楚是什么导致了问题。 import java.u
我正在努力学习更多有关 C++ 的知识,但在国际象棋程序中遇到了一些代码,需要帮助才能理解。我有一个 union ,例如: union b_union { Bitboard b; st
这是我项目网页中的代码片段。这里我想显示用户选择的类别,然后想显示属于该类别的主题。在那里,用户可以拥有多个类别,这没有问题。我可以在第一个 while 循环中打印所有这些类别。问题是当我尝试打印主题
我想知道如何在 swing 中显示内部框架。这意味着,当需要 JFrame 时,通常我所做的是, new MyJFrame().setVisible(true); 假设之前的表单也应该显示。当显示这个
我最近发现了一些有趣的行为,这让我想知道对象如何知道存在哪些全局变量。例如,假设我有一个文件“test.py”: globalVar = 1 toDelete = 2 class Test(objec
我知道它已经在这里得到回答: google maps drag and drop objects into google maps from outside the Map ,但这并不完全是我所需要的
我目前正在学习Javascript DOM和innerHTML,发现在理解innerHTML方面存在一些问题。 这是我的代码:http://jsfiddle.net/hphchan/bfjx1w70/
我构建了一个布局如下的库: lib/ private_class_impl.cc private_class_decl.h public_class_impl.cc include/
我有一个使用 bootstrap 3 的组合 wordpress 网站。它基本上是一个图像网格。当屏幕展开时,它会从三列变为四列。移动时它是一列。 我想出了如何调整图像的顶部和底部边距,但我希望图像的
我正在试用 MSP-EXP430G2 的教程程序,使用 Code Composer Studio 使 LED 闪烁。最初,它有一个闪烁的无限循环: for(;;) // This emp
我是一名优秀的程序员,十分优秀!