Python lambda x,(y,z):x |(z

Python lambda x,(y,z):x |(z,python,lambda,Python,Lambda,代码如下: reduce(lambda x, (y, z): x | (z << y), enumerate(map(lambda i: 0 if i < avg else 1, im.getdata())), 0) 我理解了另外两个论点的含义: enumerate(map(lambda i: 0 if i < avg else 1, im.getdata())), 0 返回 y是项目的索引。 z是iterable中的当前项。

代码如下:

reduce(lambda x, (y, z): x | (z << y),
       enumerate(map(lambda i: 0 if i < avg else 1, im.getdata())),
       0)
我理解了另外两个论点的含义:

enumerate(map(lambda i: 0 if i < avg else 1, im.getdata())),
       0
返回

y是项目的索引。 z是iterable中的当前项。 x是迄今为止的结果,初始值为0。 x、 y,z利用了元组参数解包的优势,您还可以将其编写为:

x = 0
for y, ind_item in enumerate(map(lambda i: 0 if i < avg else 1, im.getdata()):
    x |= (z << y)
请注意,Python 3中已删除此功能,PEP-3113建议执行以下操作:

def func(x, y_z):
    y, z = y_z
    print x, y, z
...     
>>> func(0, (10, 20))
0 10 20
由于lambda不允许赋值语句,因此可以使用索引来获取y和z的值:

签名是。从文档:

将两个参数的函数从左到右累加地应用于序列项,以便将序列缩减为单个值

这意味着:


应用lambda x,y,z:x | z整个语句只是将一个数据映像转换为一系列位,然后将这些位打包为一个int

一种更好、更具可读性的方法可能是执行以下操作

import array
import numpy

pixel_data = numpy.array(data)
truth_values = pixel_data >= avg
byte_values = numpy.packbits(numpy.array(truth_values, dtype=int))
bit_string = array.array('B', byte_values).tobytes()
bit_int = int.from_bytes(bit_string, byteorder='big')
有点晚了

但这里的代码没有使用嵌套函数和lambda:

class Img:
    def __init__(self, data):
        self.data = data

    def getdata(self):
        return self.data

def function1(i):
    if i < avg:
        print "function1(%i) == 0"%i
        return 0
    else:
        print "function1(%i) == 1" % i
        return 1

def function2(y,z):
    print "function2(%i,%i) == %i"%(y,z,z << y)
    return z << y


avg = 0
im = Img(list(range(-5,5)))

MAP = map(function1,im.getdata())
print "\nMAP of function1 with im.getdata() == %s"%MAP
ENUM = list(enumerate(MAP))
print "\nENUM of MAP == %s\n"%ENUM
a = 0
for y, z in ENUM:
    print "a == %i"%a
    value = function2(y,z)
    print "a += %i"%(value)
    a += value

print "\nResult is\na == %i"%a

它是说x或z左移y次,我知道,但它如何与reduce一起工作@你能澄清一下你的困惑是什么吗?如果你把它分成更多的步骤可能会更容易,这样你就可以确切地看到每个部分都在做什么。你是说它如何与reduce一起工作?这并没有真正澄清问题。你知道reduce做什么吗?它的论点是什么?请准确说明您不理解的内容,例如,通过清楚地解释您确实理解的每一部分。是的,lambda是两个参数的函数,但如何初始化第二个参数y,z?@simon_xia enumerate生成一系列两元组索引,元素,然后将其解压缩为名称y,有关于元组参数解包的更多信息吗?问题中的im.getdata可能是指PIL-
def func(x, y_z):
    y, z = y_z
    print x, y, z
...     
>>> func(0, (10, 20))
0 10 20
from functools import reduce
reduce(lambda x, y_z: x | (y_z[1] << y_z[0]),
       enumerate(map(lambda i: 0 if i < avg else 1, im.getdata())),
       0)
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
import array
import numpy

pixel_data = numpy.array(data)
truth_values = pixel_data >= avg
byte_values = numpy.packbits(numpy.array(truth_values, dtype=int))
bit_string = array.array('B', byte_values).tobytes()
bit_int = int.from_bytes(bit_string, byteorder='big')
class Img:
    def __init__(self, data):
        self.data = data

    def getdata(self):
        return self.data

def function1(i):
    if i < avg:
        print "function1(%i) == 0"%i
        return 0
    else:
        print "function1(%i) == 1" % i
        return 1

def function2(y,z):
    print "function2(%i,%i) == %i"%(y,z,z << y)
    return z << y


avg = 0
im = Img(list(range(-5,5)))

MAP = map(function1,im.getdata())
print "\nMAP of function1 with im.getdata() == %s"%MAP
ENUM = list(enumerate(MAP))
print "\nENUM of MAP == %s\n"%ENUM
a = 0
for y, z in ENUM:
    print "a == %i"%a
    value = function2(y,z)
    print "a += %i"%(value)
    a += value

print "\nResult is\na == %i"%a
function1(-5) == 0
function1(-4) == 0
function1(-3) == 0
function1(-2) == 0
function1(-1) == 0
function1(0) == 1
function1(1) == 1
function1(2) == 1
function1(3) == 1
function1(4) == 1

MAP of function1 with im.getdata() == [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]

ENUM of MAP == [(0, 0), (1, 0), (2, 0), (3, 0), (4, 0), (5, 1), (6, 1), (7, 1), (8, 1), (9, 1)]

a == 0
function2(0,0) == 0
a += 0
a == 0
function2(1,0) == 0
a += 0
a == 0
function2(2,0) == 0
a += 0
a == 0
function2(3,0) == 0
a += 0
a == 0
function2(4,0) == 0
a += 0
a == 0
function2(5,1) == 32
a += 32
a == 32
function2(6,1) == 64
a += 64
a == 96
function2(7,1) == 128
a += 128
a == 224
function2(8,1) == 256
a += 256
a == 480
function2(9,1) == 512
a += 512

Result is
a == 992