解决python3.x版本中zip与reduce及map合用出现的问题

本文介绍了在Python3.x环境下,如何解决从2.x版本移植的代码中,zip、reduce和map函数导致的错误。关键在于Python3中reduce需要导入,且map和zip返回的是迭代器,需要转换为列表。通过修改相关代码,可以确保3.x版本的兼容性。
摘要由CSDN通过智能技术生成

        看到@hanbingtao大神的《零基础入门深度学习(1) - 感知器》,心里非常激动,原来不明白的问题终于搞清楚了,尤其是提供了python代码……哦,对了,代码是在2.x环境下的,直接在3.x中运行会报错,当时百思不得其解,历经一天,终于搞清楚,主要是zip与reduce及map合用的问题,因此只需要修改以下3处,亲测可运行:
        1.py2中reduce可以直接用,py3中需要导入;
        2.py2和py3在map和zip的地方有区别(一并感谢百度知道中的匿名用户),py3的结果是迭代器,所以需要自己手动将结果转化为列表。因此只是光改代码提示错误的地方还不够,出现map和zip的地方都需要修改。两处使用reduce和map的函数都需要修改,下面代码中我已标红(这是与原代码不同之处)

from functools import reduce


class Perceptron(object):
    def __init__(self, input_num, activator):
        self.activator = activator
        self.weights = [0.0 for _ in range(input_num)]
        self.bias = 0.0

    def __str__(self):
        return 'weights\t:%s\nbias\t:%f\n' % (self.weights, self.bias)

    def predict(self, input_vec):
        return self.activator(reduce(lambda a,b: a + b,list(map(lambda x: x[0] * x[1], list(zip(input_vec, self.weights)))))+self.bias)

    def train(self, input_vecs, labels, iteration, rate):
        for i in range(iteration):
            self._one_iteration(input_vecs, labels, rate)

    def _one_iteration(self, input_vecs, labels, rate):
        samples = zip(input_vecs, labels)
        for (input_vec, label) in samples:
            output = self.predict(input_vec)
            self._update_weights(input_vec, output, label, rate)

    def _update_weights(self, input_vec, output, label, rate):
        delta = label - output
        self.weights = list(map(lambda x: x[1] + rate * delta * x[0],list(zip(input_vec, self.weights))))
        self.bias += rate * delta


def f(x):
    return 1 if x > 0 else 0

def train_and_perceptron():
    p = Perceptron(2, f)
    input_vecs = [[1, 1], [1, 0], [0, 1], [0, 0]]
    labels = [1, 0, 0, 0]
    p.train(input_vecs, labels, 10, 0.1)
    return p

and_perception = train_and_perceptron()
print(and_perception)
print('1 and 1 = %d' % and_perception.predict([1, 1]))
print('0 and 0 = %d' % and_perception.predict([0, 0]))
print('1 and 0 = %d' % and_perception.predict([1, 0]))
print('0 and 1 = %d' % and_perception.predict([0, 1]))
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值