什么是这个C/C++代码的惯用Python等价物?
void foo()
{
static int counter = 0;
counter++;
printf("counter is %d\n", counter);
}
Run Code Online (Sandbox Code Playgroud)
具体来说,如何在功能级别实现静态成员,而不是类级别?将函数放入类中会改变什么吗?
Python nonlocal语句做了什么(在Python 3.0及更高版本中)?
官方Python网站上没有文档,help("nonlocal")也没有用.
python doc中的本地/全局/自由变量定义:
如果名称绑定在块中,则它是该块的局部变量,除非声明为非本地.如果名称在模块级别绑定,则它是全局变量.(模块代码块的变量是局部的和全局的.)如果在代码块中使用了变量但在那里没有定义,则它是一个自由变量.
>>> x = 0
>>> def foo():
... print(x)
... print(locals())
...
>>> foo()
0
{}
Run Code Online (Sandbox Code Playgroud)
>>> def bar():
... x = 1
... def foo():
... print(x)
... print(locals())
... foo()
...
>>> bar()
1
{'x':1}
Run Code Online (Sandbox Code Playgroud)
自由变量locals()在函数块中调用时返回,但不在类块中调用.
In Code 1,x是一个全局变量,它已被使用但未定义foo().
然而,它不是一个自由变量,因为它不是由它返回的locals().
我认为这不是医生所说的.是否有自由变量的技术定义?
在C++中,您可以这样做以强制本地范围:
{
int i = 1;
// Do stuff
}
// local variable i is destroyed
{
int i = 7;
// Do more stuff
}
Run Code Online (Sandbox Code Playgroud)
这样做的好处是,在强制本地范围结束时,括号中声明的任何变量都将消失.这有助于防止在以后您不打算使用x的位置使用先前定义的变量x.
你能用Python做到这一点吗?如果是这样,怎么样?
== ==更新
我知道功能 - 这是显而易见的事情.我想知道当代码很简单并且不值得创建单独的函数时,是否有一种快速的方法来执行上述操作 - 只是一些快速表示法强调该块中的变量不会在函数中的任何其他位置使用.
从人们到目前为止所说的简短回答是否定的.
(我知道有一些聪明的方法,比如"del",或者这种有块的愿望可能会建议重构成一个单独的函数.但是我想强调这只是为了简短的片段,你想强调这里的变量小块不得在别处使用.)
Alan Kay说,仔细阅读代码并找到Lisp 1.5手册第13页代码中唯一的错误,帮助他更好地理解计算机科学100倍.
有问题的代码是eval&的第一个版本,apply它看起来像现代的lisp(我知道).
既然正确的答案可能已知但丢失了(我的google-fu很不错,我至少搜索了20分钟)我将奖励第一个正确的答案(我将查看编辑时间,所以不要试图作弊)尽快获得250点赏金.
我会建议其他人也为赏金做出贡献,记得上面的视频Alan Kay说这些东西让人回想起爱因斯坦在发现相对论时所处的环境.
文本中的代码用M-Expressions编写.我正在翻译从M表达式转换为S表达式(lisp代码)@ https://github.com/Viruliant/MccarthyMCEval-1.5.
无论如何这里是第13页的翻译引用:
;______________________________________Lisp Meta-Circular Evaluator S-Expression
;this code is written in the order it appears on pages 10-13 in the Lisp 1.5 Manual
;and is translated from the m-expressions into s-expressions
(label mc.equal (lambda (x y)
(mc.cond
((atom x) ((mc.cond ((atom y) (eq x y)) ((quote t) (quote f)))))
((equal (car x)(car y)) (equal (cdr x) (cdr y)))
((quote …Run Code Online (Sandbox Code Playgroud) 在许多情况下,有两种实现选择:闭包和可调用类.例如,
class F:
def __init__(self, op):
self.op = op
def __call__(self, arg1, arg2):
if (self.op == 'mult'):
return arg1 * arg2
if (self.op == 'add'):
return arg1 + arg2
raise InvalidOp(op)
f = F('add')
Run Code Online (Sandbox Code Playgroud)
要么
def F(op):
if op == 'or':
def f_(arg1, arg2):
return arg1 | arg2
return f_
if op == 'and':
def g_(arg1, arg2):
return arg1 & arg2
return g_
raise InvalidOp(op)
f = F('add')
Run Code Online (Sandbox Code Playgroud)
在任何一个方向上做出选择时应该考虑哪些因素?
我能想到两个:
似乎关闭总会有更好的表现(不能想到一个反例).
我认为有些情况下关闭不能完成工作(例如,如果其状态随时间变化).
我在这些方面是否正确?还能添加什么?
假设我有一个看起来像这样的类:
class Test(object):
def __init__(self, a, b):
self.a = a
self.b = b
self.c = self.a + self.b
Run Code Online (Sandbox Code Playgroud)
我希望self.c每当属性值self.a或self.b相同实例的更改时更改值.
例如
test1 = Test(2,4)
print test1.c # prints 6
test1.a = 3
print test1.c # prints = 6
Run Code Online (Sandbox Code Playgroud)
我知道为什么它仍会打印6,但有没有一种机制可以用来触发更新self.c时self.a更改.或者我唯一的选择是有一个方法,它返回self.c基于当前状态self.a和的值self.b
我正在尝试使用在我的日志记录中添加自定义字段LogRecordFactory。我重复调用一个类,每次这样做时,我都想在 init 模块中设置 custom_attribute,以便类中的其余代码将具有此属性。但我无法让它发挥作用。我发现以下内容有效,但它是静态的。
import logging
old_factory = logging.getLogRecordFactory()
def record_factory(*args, **kwargs):
record = old_factory(*args, **kwargs)
record.custom_attribute = "whatever"
return record
logging.basicConfig(format="%(custom_attribute)s - %(message)s")
logging.setLogRecordFactory(record_factory)
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
logging.debug("test")
Run Code Online (Sandbox Code Playgroud)
这将正确输出:
whatever - test
Run Code Online (Sandbox Code Playgroud)
但是,我的用例是 custom_attribute 会有所不同。每次我调用一个特定的函数时,我都想改变它。因此,record_factory 似乎需要传递另一个参数,以便它可以使用新参数返回正确的记录。但我无法弄清楚。我尝试向该函数添加参数,但是当我进行调用时,我得到:
TypeError: __init__() missing 7 required positional arguments: 'name', 'level', 'pathname', 'lineno', 'msg', 'args', and 'exc_info'
Run Code Online (Sandbox Code Playgroud)
*args我认为这与and**kwargs但我真的不知道有关。record_factory另外,为什么调用 by后没有括号logging.setLogRecordFactory?我从来没有见过一个函数像这样工作。
我遇到以下面试问题,却不知道如何解决:
def cons(a, b):
def pair(f):
return f(a, b)
return pair
Run Code Online (Sandbox Code Playgroud)
给定一对,比如cons(6,8)我要求归还a和bseparetely,例如,在这种情况下分别为6,8。
举例来说,
def first(pair):
pass
#would return pair's `a` somehow
def second(pair):
pass
#would return pair's `b` somehow
Run Code Online (Sandbox Code Playgroud)
如何才能做到这一点?
我想做类似以下的事情:
def getFunction(params):
f= lambda x:
do stuff with params and x
return f
Run Code Online (Sandbox Code Playgroud)
我得到的语法无效.什么是Pythonic /正确的方法呢?
这样我就可以打电话f(x)而不必打电话给f(x,params)哪一个更混乱的IMO.
python ×8
closures ×3
python-3.x ×2
eval ×1
function ×1
global ×1
interpreter ×1
lambda ×1
lisp ×1
logging ×1
metacircular ×1
performance ×1
return ×1
scope ×1