网上下载了一个 Python2 脚本,其中有一句非常 pythonic ,本人水平理解不能
想请教下大家这段代码要如何修改才能在 Python3 中运行。
def avhash(img):
if not isinstance(img, Image.Image):
img = Image.open(img)
img = img.resize((8, 8), Image.ANTIALIAS).convert('L') #将 image 压缩为 8*8,转化为灰度图
avg = reduce(lambda x, y: x + y, img.getdata()) / 64. #对每个像素点的灰度累和,最后除以 64,得到灰度的平均值
return reduce(lambda x,(y,z): x | (z << y), enumerate(map(lambda i: 0 if i < avg else 1, img.getdata())), 0)
就是这句
reduce(lambda x,(y,z): x | (z << y), enumerate(map(lambda i: 0 if i < avg else 1, img.getdata())), 0)
目前直接运行会报错,错误信息如下
1
okletswin 2018-01-09 19:07:59 +08:00
|
2
laqow 2018-01-09 19:13:59 +08:00 via Android
python3 自带的帮助里面有个 2to3 发生变化语法的介绍页,搜索一下关键字应该就有了
|
3
Ginson OP @okletswin 嗯,在发帖之前我尝试了几种方法
1. 用在线的 2to3 工具,比如 http://www.pythonconverter.com/ ,但是转换的结果还是一样报错 2. 搜索了一下 lambda 在 Python2 和 3 里面是否有语法上的区别,但是没有找到结果 谢谢您的嘲讽,呵呵 |
4
qsnow6 2018-01-09 19:17:05 +08:00
lambda 只能 接受一个参数
|
5
mkeith 2018-01-09 19:17:31 +08:00 via iPhone
lambda 改成普通函数试试
|
7
Ginson OP @laqow 是这个把 http://sebastianraschka.com/Articles/2014_python_2_3_key_diff.html
但是我没有看到 跟 lambda 或 reduce 相关的信息 |
8
jotsai 2018-01-09 19:21:17 +08:00
lambda 可以接收多个参数。试试把
lambda x,(y,z): x | (z << y) 改成 lambda x, y: x | (y[1] << y[0]) |
10
ballshapesdsd 2018-01-09 19:22:08 +08:00
这个在 python2 运行不过呀
|
11
no1xsyzy 2018-01-09 19:25:23 +08:00
这个是 Python2 也是旧的吧
函数定义里解 tuple 的功能被取消了 |
13
Ginson OP |
14
jotsai 2018-01-09 19:33:31 +08:00
@Ginson 搜到 stackoverflow 一个回答,就是 @no1xsyzy 说的
https://stackoverflow.com/questions/11328312/python-lambda-does-not-accept-tuple-argument |
16
Ginson OP @DGChost QAQ !!
既然被发现了我就坦白吧,其实是全景图片网找到我们公司,说我们很多图片侵犯了他们的版权,所以从网上找了这个判断图片相似度脚本逐个判断下是否属实。 |
17
thautwarm 2018-01-09 22:19:42 +08:00
`2to3 -w <directory name>\`即可。(另: 不过有时候 encode 和 decode 可能需要手动改一下。报错进 step in 进去改。
然后看了一下错在 lambda 参数解构。。 吐槽一下 PEP 3113。。 难受,想哭。你没法和某些人谈优雅,因为他要跟你谈 exception non characteristic, 功能弱小非要强行说"powerful"的 introspection。。。 专门为 param destruction 写,顺便加入 dict, list 的解构,提供贴近自然的语法糖,这都是非常有意义的事情。 不能因为一个东西的好提到了某些东西的不好,就砍掉这个好的。X 疼医嘴,人都傻了。 怀念 python2 少有的先进事物... |