首页 欧洲联赛正文

巫师之旅,这十二个坑爹的Python圈套你知道清楚了吗!别掉坑里,主张保藏,皇太极

榜首:以mutable目标作为默许参数

这个估量是最广为人知的了,Py世界大师时装画thon和其他许多言语相同,供给了默许参数,蔡健臣默许参数的确是个好东西,可以让函数调用者疏忽一些细节(比方GUI编程,Tkinter,QT),关于lambda表达式也十分有用。可是假如运用了可变目标作为默许参数,那么作业就不那么愉快了

惊喜不惊喜?!究其原因,python中一切都是目标,函数也不列外,默许参数仅仅函数的一个特点。而默许参数在函数界说的时分现已求值了。

Default parameter values are evaluated when the function definition is executed.

stackoverflow上有一个更恰当的比方来阐明默许参数是在界说的时分求值,而不是调用的时分。

python docoment 给出了规范的解决办法:

A way around this is to use None as the default, and explicitly test for it in the body of the function

第二: x += y vs x = x + y

一般来说,二者是等价的,至少看起来是等价的(这也是骗局的界说 — 看起来都OK,但不必定正确)。

呃,被光速打脸了?

前者x指向一个新的目标,后者x在本来的目标是修正,当然,那种作用是正确的取决于运用场景。至少,得知道,二者有时分并不相同

第三,奇特的小括号—()

小括号(parenthese)在各种编程言语中都有广泛的运用,python中,小括号还能表明元组(tuple)这一数据类型, 元组是immutable的序列。

但假如只要一个元素呢

奇特不奇特,假如要表明只要一个元素的元组,正确的姿态是:

第四:生成一个元素是列表的列表

这个有点像二维数组,当然生成一个元素是字典的列表也是可以的,更浅显的说,生成一个元啪啪啪好爽素是可变目标的序邵露列

很简略嘛:

看起来很不错,简略明了,but

我猜,这应该不是你预期的成果吧,究其原因,仍是由于python中l森咲智美ist是可变目标,上述的写法我们都指向的同一个可变目标,正确的姿态

别的一个在实践编码中遇到的问题,dic巫师之旅,这十二个坑爹的Python骗局你知道清楚了吗!别掉坑里,建议保藏,皇太极t.fromkeys,夜夜撸2016最新版 也有异曲同工之妙: 创立的dict的一切values指向同一个目标。

fromkeys(seq[, value])
仿制代码

Create a new dictionary with keys from seq and values set to value.

第五,在拜访列表的时分,修正列表

列表(list)在python中运用十分广泛,当然常常会在拜访列表的时分添加或许删去一些元素。比方,下面这个函数,企图删掉列表中为3的倍数的元素:

测验一下,

如同没什么错,不过这仅仅命运好

上面的比方中,6这个元素就没有被删去。假如在modify_lst函数中print idx, item就可以发现端倪:lst在变短,但idx是递加的,所以在上面犯错的比方中,当3被删去之后,6变成了lst的第2个元素(从0开端)。在C++中,假如遍历容器的时分用迭代器删去元素,也会有相同的问题。

假如逻辑比较简略,运用list comprehension是不错的留意

第六,闭包与lambda

这个也是老生长谈的比方,在其他言语也有相似的状况。先看一个比方:

create_multipliers函数的回来值时一个列表,列表的每一个元素都是一个函数 巫师之旅,这十二个坑爹的Python骗局你知道清楚了吗!别掉坑里,建议保藏,皇太极-- 将输入参数x乘以一个倍数i的函数。预期的成果时0,2,4,6,8. 但成果是5个8,意外不意外。

由于呈现这个骗局的时分常常运用了lambda,所以或许会认为是lambda初中女生脚的问题,但la巫师之旅,这十二个坑爹的Python骗局你知道清楚了吗!别掉坑里,建议保藏,皇太极mbda表明不愿意背这个锅。问题的实质在与python中的特点查找规矩,LEGB(local,enclousing,global,bulitin),在上面的比方中,i便是在闭包作用域(enclousing),而Python的闭包是 迟绑定 , 这意味着闭包中用到的变量的值,是在玥玥児内部函数被调用时查询得到的。

解决办法也很简略,那便是变闭包作用域为部分作用域。

第七,界说del

大多数计算机专业的同学或许都是先学的C、C++,结构、析构函数的概念应该都十分熟。所以,当切换到python的时分,天然也想知道有没有相应的函数。比方,在C++中十分有名的RAII,即经过结构、析构来办理资源(如内存、文件描绘符)的声明周期。那在python中要到达相同的作用怎么做呢,即需求找到一个目标在毁掉的时分必定会调用的函数,所以发现了 init , del 函数,或许简略写了两个比方发现的确也能作业。但事实上或许掉进了一个骗局,在python documnet是有描绘的:

Circular references which are garbage are detected when the option cycle detector is enabled (it’s on by default), but can only be cle高兴大本营20150502aned up if there are no Python-level del () method幼女资源s involved.

简略来说,假如在循环引证中的目标界说了 del ,那么python gc不能进行收回,因而,存在内存走漏的危险

第八,不同的姿态import同一个module

示例在stackover巫师之旅,这十二个坑爹的Python骗局你知道清楚了吗!别掉坑里,建议保藏,皇太极flow的比方上稍作修正,假定现在有一个package叫mypackage,里边包括三个python文件:mymodule.py, main.py, init .py巫师之旅,这十二个坑爹的Python骗局你知道清楚了吗!别掉坑里,建议保藏,皇太极。mymodule.py代码如下:

main.py代码如下:

运转python main.py,sw036成果如下:

updated list [1] 4406700752
module in get 4406700920
lets check []
仿制代码

从运转成果可以看到,在add 和 get函数中import的mymodule不是同一个module,ID不同。当然,在python2.7.10中,需求main.py的第13行才干呈现这样的作用。你或许会问,谁会写出第13行这样的代码呢?事实上,在许多项目中,为了import的时分便利,会往sys.path参加一堆途径。快穿之媚那么在项目中,我们赞同一种import方法就十分有必要了

第九,python晋级

python3.x并不向后兼容,所以假如从2.x晋级到3.x的时分得当心了,下面罗列两点:

在python2.7中,range的回来值是一个列表;而在python3.x中,回来的是一个range目标。

map()、filter()、 dict.items()在python2.7回来列表,而在3.x中回来迭代器。当然迭代器大多数都是比较好的挑选,愈加pythonic,可是也有缺点鹫冢庆一郎,便是只能遍历一次。在instagram的共享中,也说到由于这个导致的一个坑爹的bug。

第十:++i —i

这个骗局主要是坑来自C、C++布景的同学。简略来说南京大学启明网,++i是对i取两次正号,—i是对i取两次负号,运算完之后i的值不变。

第十一: setattr getattr getattribute

Python中有很多的magic method(形似 xx ),其间许多跟特点拜访有关,比方 get , set, de巫师之旅,这十二个坑爹的Python骗局你知道清楚了吗!别掉坑里,建议保藏,皇太极lete_, getattr , setattr , delattr , getattribute 。前三个跟descriptor相关,具体可拜见《python descriptor 详解》。坑爹的是, getattr 与 setattr 相差很大,在《python属ploice性查找(attribute look up)》一文中有具体介绍。简略说lol凶恶来, setattr 与 getattribute 是对应的,都是修正python默许的特点修正、查找机制,而 getattr 仅仅默许查找机制无法找到特点的时分才会调用, se郑露莹tattr 应该叫 setattribute__才恰当!

第负一,gil

以GIL结束,由于gil是Python中我们公认的缺点巫师之旅,这十二个坑爹的Python骗局你知道清楚了吗!别掉坑里,建议保藏,皇太极!

其他言语过来的同学或许看到python用threading模块,拿过来就用,成果发现作用不对啊,然后就会喷,什么鬼

总结:

毫无疑问的说,python是十分简单上手,也十分强壮的一门言语。python十分灵敏,可定制化很强。一起,也存在一些骗局,搞清楚这些骗局可以更好的把握、运用这么言语。本文罗列了一些python中的一些缺点,这是一份不完全列表,欢迎我们弥补。

2019Python课程体系全新晋级为《P好乐宝蒙文博客网ython+数据剖析+机器学习》,九大阶段才能逐级提高,打造技术更全面的全栈工程师。

以上这些教程小编现已为我们打包预备好了,期望对正在学习的你有所协助!

请我们转发本文+重视并私信小编:“材料”,即可免费获取哦!

Ps:小编和高教师熟的很,一切资源当然是我榜首时间拿到手啦!性感写真集哈哈,重视柠檬,更多干货等着你!

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。