是否可以将带有参数的函数传递给Python中的另一个函数?
比如说:
def perform(function):
return function()
Run Code Online (Sandbox Code Playgroud)
但要传递的函数将具有如下参数:
action1()
action2(p)
action3(p,r)
Run Code Online (Sandbox Code Playgroud) 我无法理解functools中的部分工作原理.我从这里得到以下代码:
>>> sum = lambda x, y : x + y
>>> sum(1, 2)
3
>>> incr = lambda y : sum(1, y)
>>> incr(2)
3
>>> def sum2(x, y):
return x + y
>>> incr2 = functools.partial(sum2, 1)
>>> incr2(4)
5
Run Code Online (Sandbox Code Playgroud)
现在就行了
incr = lambda y : sum(1, y)
Run Code Online (Sandbox Code Playgroud)
我得到的是,无论我传递给incr
它的任何论点都将被传递y
给lambda
哪个将返回sum(1, y)
ie 1 + y
.
我明白那个.但我不明白这一点incr2(4)
.
如何在部分函数中4
传递x
?对我来说,4
应该更换sum2
.x
和之间有什么关系 …
考虑以下代码段:
# directorys == {'login': <object at ...>, 'home': <object at ...>}
for d in directorys:
self.command["cd " + d] = (lambda : self.root.change_directory(d))
Run Code Online (Sandbox Code Playgroud)
我希望创建一个包含两个函数的字典如下:
# Expected :
self.command == {
"cd login": lambda: self.root.change_directory("login"),
"cd home": lambda: self.root.change_directory("home")
}
Run Code Online (Sandbox Code Playgroud)
但看起来生成的两个lambda函数完全相同:
# Result :
self.command == {
"cd login": lambda: self.root.change_directory("login"),
"cd home": lambda: self.root.change_directory("login") # <- Why login ?
}
Run Code Online (Sandbox Code Playgroud)
我真的不明白为什么.你有什么建议吗 ?
我formfield_for_manytomany
在django文档中使用给定的.但在该函数内部,我需要获取正在编辑的当前父对象.
def formfield_for_manytomany(self, db_field, request, **kwargs):
if db_field.name == "car":
kwargs["queryset"] = Cars.objects.filter(owner=person)
return super(myModel, self).formfield_for_manytomany(db_field, request, **kwargs)
Run Code Online (Sandbox Code Playgroud)
如何让被编辑的人?
我一直在使用Python,我设置了以下代码情况:
import timeit
setting = """
import functools
def f(a,b,c):
pass
g = functools.partial(f,c=3)
h = functools.partial(f,b=5,c=3)
i = functools.partial(f,a=4,b=5,c=3)
"""
print timeit.timeit('f(4,5,3)', setup = setting, number=100000)
print timeit.timeit('g(4,5)', setup = setting, number=100000)
print timeit.timeit('h(4)', setup = setting, number=100000)
print timeit.timeit('i()', setup = setting, number=100000)
Run Code Online (Sandbox Code Playgroud)
我得到以下结果:
f: 0.181384086609
g: 0.39066195488
h: 0.425783157349
i: 0.391901016235
Run Code Online (Sandbox Code Playgroud)
为什么对部分函数的调用需要更长时间?部分函数是将参数转发到原始函数还是映射静态参数?而且,在Python中是否有一个函数返回一个函数的主体,假定所有参数都是预定义的,就像函数i一样?
在Python中,假设我有一个函数f
,我想传递一些辅助参数(为简单起见,它只是第一个保持变量的参数).
这两种方式(如果有的话)之间有什么区别?
# Assume secondary_args and secondary_kwargs have been defined
import functools
g1 = functools.partial(f, *secondary_args, **secondary_kwargs)
g2 = lambda x: f(x, *secondary_args, **secondary_kwargs)
Run Code Online (Sandbox Code Playgroud)
例如,在doc页面中partial
,有这样的引用:
partial
在类中定义的对象的行为类似于静态方法,并且在实例属性查找期间不会转换为绑定方法.
如果用于从提供给类的参数(在构造函数中或稍后通过函数)中创建类方法,lambda方法是否会受此影响?
我想concurrent.futures.ProcessPoolExecutor.map()
调用一个由2个或更多参数组成的函数.在下面的示例中,我使用了一个lambda
函数并将其定义ref
为numberlist
具有相同值的相同大小的数组.
第一个问题:有更好的方法吗?在numberlist的大小可能是数百万到数十亿个元素的情况下,因此ref大小必须遵循numberlist,这种方法不必要地占用宝贵的内存,我想避免.我这样做是因为我读取map
函数将终止其映射,直到达到最短的数组结束.
import concurrent.futures as cf
nmax = 10
numberlist = range(nmax)
ref = [5, 5, 5, 5, 5, 5, 5, 5, 5, 5]
workers = 3
def _findmatch(listnumber, ref):
print('def _findmatch(listnumber, ref):')
x=''
listnumber=str(listnumber)
ref = str(ref)
print('listnumber = {0} and ref = {1}'.format(listnumber, ref))
if ref in listnumber:
x = listnumber
print('x = {0}'.format(x))
return x
a = map(lambda x, y: _findmatch(x, y), numberlist, ref)
for n …
Run Code Online (Sandbox Code Playgroud) 我有简化的代码,如下所示:
run = functools.partial(run, grep=options.grep, print_only=options.print_only, force=options.force)
if not options.single and not options.print_only and options.n > 0:
pool = multiprocessing.Pool(options.n)
Map = pool.map
else: Map = map
for f in args:
with open(f) as fh: Map(run, fh)
try:
pool.close()
pool.join()
except NameError: pass
Run Code Online (Sandbox Code Playgroud)
当我在单进程模式下运行它时工作正常,但是失败并出现这样的错误
TypeError: type 'partial' takes at least one argument
Run Code Online (Sandbox Code Playgroud)
通过多处理模块与长调用栈混合在一起.这是怎么回事?
我正在使用python 2.6.1.
这个答案解释了如何动态创建测试用例.
答案的代码:
class Tests(unittest.TestCase):
def check(self, i, j):
self.assertNotEquals(0, i-j)
for i in xrange(1, 4):
for j in xrange(2, 6):
def ch(i, j):
return lambda self: self.check(i, j)
setattr(Tests, "test_%r_%r" % (i, j), ch(i, j))
Run Code Online (Sandbox Code Playgroud)
我已经测试过它的确有效,但我不知道怎么做?
我无法理解lambda self:
这里的魔术,主要是:
functools.partial()
(即使用一个尚未知的额外参数创建包装函数)self
一个有意义的关键字还是lambda spam
会起作用?.check()
在class
es范围之外完全没问题呢?lambda
(更不用说我同意Guido和Alex这是一个眼睛,我想没有:)我在 python 中有一些代码,它按位或等于 b 到一个称为 a 的多维列表中的所有值
for i in xrange(len(a)):
for j in xrange(len(a[i])):
a[i][j] |= b
Run Code Online (Sandbox Code Playgroud)
我的问题是,有没有什么方法可以只使用 (map()、filter()、reduce()) 编写此代码,而不必使用 lambdas 或任何其他函数定义,如下例所示
map(lambda x: map(lambda y: y | b, x), a)
Run Code Online (Sandbox Code Playgroud) python ×10
lambda ×4
functools ×3
function ×2
partial ×2
concurrency ×1
django ×1
django-admin ×1
loops ×1
python-3.x ×1