3

为啥好多面试 Python 的连魔法函数都不知道?

 2 years ago
source link: https://www.v2ex.com/t/816468
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

V2EX  ›  Python

为啥好多面试 Python 的连魔法函数都不知道?

  aladdinding · 1 小时 1 分钟前 · 1016 次点击

Python 开发应届生岗位

有的甚至还写的精通 Python

话说 Python 的精髓就是鸭子类型吧,有的直接说没听过

估计都是把 Python 当作面向过程来写了,怪不得觉得语法简单

我感觉 Python 并不简单。。

35 条回复    2021-11-19 11:34:11 +08:00

Chase2E

Chase2E   56 分钟前   ❤️ 1

好的代码, 是刚入职的新人也能看懂,
牛逼的代码, 是学完 CS101 的大一新生也能看懂.

你想问他懂不懂"魔法函数"的特性, 直接问他 "__init()__"为什么前后都要下划线不就行了...

这些语言的高级 feature, 你写在工作代码中, 不是让大家为难吗?...

rationa1cuzz

rationa1cuzz   55 分钟前

魔法方法太多了,而且大部分都用的少。

aladdinding

aladdinding   55 分钟前

@Chase2E 问了啊 就是问了为什么有的函数是双下划线

leetom

leetom   52 分钟前   ❤️ 2

这种语法细节没啥意义啊
要不你回答一下,为啥 init 前面和后面都有双下划线?为啥不是单下划线?为啥不是只有前边有?

cyrivlclth

cyrivlclth   52 分钟前

= =不如问一下 list 的扩容机制吧。。。

ipwx

ipwx   50 分钟前

@Chase2E 我寻思 Python 类写多点自然就用到 magic function 了。

别的不说,__lt__, __eq__, __hash__ 这三个凡是要用上自定义类型,大概率都要用到。不然你怎么自定义放进 map 当 key 或者 sort

__deepcopy__, __getstate__, __setstate__ 这三个对需要序列化的自定义类型也是必须认识的。

__enter__, __exit__ 是为了自定义类型要 with

这些都不会,那就真的只会写函数了。可是复杂逻辑不用类,很难写啊。。。除非是 脚本小子

huruwo

huruwo   50 分钟前

因为工作用不上 或者是用了也不知道是什么

ampedee

ampedee   48 分钟前   ❤️ 1

自己用魔术方法实现了一个特性:真爽!我真牛逼
看别人的代码用魔术方法实现了一个特性:傻逼!垃圾代码

ipwx

ipwx   48 分钟前

@leetom
@Chase2E “精通 Python”但是不会我上面说的这几个功能,也太离谱了。

ipwx

ipwx   48 分钟前

@ampedee 你对“魔法方法”的理解有些怪异。

比如我提到的这几个都是标准途径。。。

ospider

ospider   48 分钟前

@leetom duck typing 不能算语法细节吧,不然用毛线 Python 。不过应届生不知道这个也合理吧

macha

macha   47 分钟前

最后一句我很赞同,不知道为什么那么多人说 Python 简单。

shyling

shyling   47 分钟前

要不你问怎么让 len(自定义 class()) 返回结果吧。。

或者怎么 for in 自定义 class()

ipwx

ipwx   47 分钟前

哦最基础的还有 __repr__。

这个都不会还怎么调试的时候 print ?

xxoOOovv

xxoOOovv   46 分钟前

如果毕业就写 py 的(而且 c/cpp 基础不扎实的),我感觉多数后面都会变成“能用就行”的原则,多数都不去了解源码和底层原理。如果是从 c/cpp 或 go 转来写 py ,情况就不一样了

dejavuwind

dejavuwind   46 分钟前

@Chase2E @aladdinding 所以为什么要前后双下划线?为什么不是单下划线或者双连接符?

难道不应该问这类函数有什么特点或者作用吗?而不是问为什么要前后双下划线?

aladdinding

aladdinding   45 分钟前

@dejavuwind 目的就是问有什么作用 说双下划线只是给点提示

fgwmlhdkkkw

fgwmlhdkkkw   42 分钟前

meta class
await/yield

ytmsdy

ytmsdy   42 分钟前

其实我觉得 Python 最大的问题不是速度慢,或者不支持并发。
而是花式语法太多,每个人的编程风格都不一样,写出来的代码千奇百怪。
相对于 C++或者 Java 这种工程化标准的语言,就没有这一类的问题!

uni

uni   42 分钟前

很讨厌面试问名词的,我觉得更好的问法是给一个具体的场景然后问他怎么实现

fgwmlhdkkkw

fgwmlhdkkkw   39 分钟前

但是我看你打的这段文字,我想给你一拳,栽种。
没有对人的基本尊重,“估计”……,闻道有先后而已,别看不起人。

ohwind

ohwind   39 分钟前

@ytmsdy C++ 这类问题反而更多......

bytesfold

bytesfold   36 分钟前

不如说些问题看看有没有解决方案,非要把 Python 搞成像 Java 那样卷?

efaun

efaun   36 分钟前

@ytmsdy #20 更大的问题是代码提示太差, 用 . 经常联想不出来, 或者联想错

wangxin13g

wangxin13g   34 分钟前

我一直没理解 duck typing 的意义在哪
为了彻底消灭继承么
duck typing 的工程化项目写的不多 理解错了见谅

learningman

learningman   28 分钟前

原来__init__就算吗,我还以为说的是__code__

dangyuluo

dangyuluo   28 分钟前   ❤️ 2

不能怪应届生,因为 Python 这些魔法函数本来就是为了省事才存在的,而在大学里最不缺的就是时间。举个例子`__next__ `是为了能让 Class 支持迭代器,但是有很多其他代码长一点的办法来实现,所以大学生可能没有过接触。

我觉得面试,尤其是应届生面试的时候还是要考察对基础知识掌握是否牢固,而不是这种语法糖。

dangyuluo

dangyuluo   26 分钟前

@ohwind 因为学 C++的人没两步就能遇到 overload operator 了😅不需要等到工作后才知道

aloxaf

aloxaf   16 分钟前

有句话怎么说的来着,人的知识就像一个圆,知道的越多,圈就越大,就越能意识到自己不知道的有多少。

大部分应届生的圈都很小,所以会产生「我已经精通了 Python 」的幻觉也无可厚非。

Osk

Osk   16 分钟前

忘名了, 尴尬, 看标题也有点懵, 看下面的回复才明白...

__repr__ __str__ __eq__ __len__ 等运算和比较的用得多一点, 因为确实好用, 但已经忘了他们叫魔法方法了😭

skinny

skinny   16 分钟前

乍看之下我还寻思难道又有我不懂的 Python 特性和语法,看下来我就无语了,你特么就不能说人话,你这就跟在 C++、C#、Java 面试里问别人知不知道魔法函数一样,构造函数就构造函数,操作符函数或方法就操作符函数或方法,你就不能说个实际需求,比如序列化、支持某些操作符、元编程具体场景?还让别人猜你这词什么意思,暗示来暗示去,我一旁观者看着都累。

sagaxu

sagaxu   11 分钟前 via Android

@ipwx key 一律用作为 id 的 int 或者 string ,sort 每次自定义比较 lambda ,也不是不 work 。

序列号有 json ,一般不处理 state 也问题不大。

with 就更少用了,finally 中清理也不差,而且 with 跟 pypy 不兼容。

decorater 和 descriptor 就更加用不上了,学生大都从 C 语言入门,很多时候只是把 python 之类当做不用管内存而且内置数据结构更丰富的语言在用。

youngce

youngce   7 分钟前

面试的时候尽量减少出现一些官方文档上提及比较少的名词,比如所谓的魔法函数,换一种问法:python 类的内置函数和方法你知道哪些?

再比如想考察一下面向对象的思想,让候选人讲讲常见的设计模式如何实践、SOLID 设计原则也是不错的选择

当然如果只是想找到能和自己对上暗号的候选人当我没说

locoz

locoz   5 分钟前 via Android

还是得看具体领域和做的事情吧,如果没有什么深入定制化的需求,其实真用不上这些高级玩法,不会用很正常。

以爬虫领域为例,自己写框架的肯定会用上很多高级玩法来让使用起来更方便,但是单纯用框架去采集数据的就压根不需要用,那后者当然也就大概率不会去了解这些。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK