听说这是70%学Python人,都会弄错的题,看你是否学到位

简介:

菜鸟独白

Python语言虽然优美,简洁和强大,但是也有很多坑,一不小心就会掉进去。我学Python的时候也遇到过,今天总结一下,希望对大家能有收获!

1.陷阱1:可变默认参数

Python里面可变参数非常灵活,但是也有陷阱,不信你看看这个小例子:

听说这是70%学Python人,都会弄错的题,看你是否学到位

我们希望每次调用这个函数的,因为第二个参数是默认参数,如果不提供第二个参数,就会创建一个新的列表,然后返回列表,大家猜猜看结果应该是多少:

是不是应该为[1][2][3].

但是实际上结果为:

[1, 2, 3]

[1, 2, 3]

[1, 2, 3]

也就是说变量地址l1,l2被l3污染了,为啥呢:

当函数被第一次调用的时候,这个默认的res列表就被创建了,这个列表的地址空间就生成了!关键来了,Python的默认参数就被创建 一次,而不是每次调用函数的时候创建。也就是说,后面的代码对这个列表的改变,会前面的内容也同样修改!

不信的话,可以把res的地址打印出来看看:

听说这是70%学Python人,都会弄错的题,看你是否学到位

是不是地址都是一样的。

正确的做法:在每次函数调用时候,好的做法是把默认参数赋值为None来创建一个新的对象。

听说这是70%学Python人,都会弄错的题,看你是否学到位

高级进阶:爬虫递归的使用

有的同学说这确实是个陷阱,但是好像没有什么实际的用途,我们看一个爬虫额例子,前几周我刚在小密圈里面搞了一个爬虫的实战活动,里面就一个需要循环爬取,递归调用的场景!

我解析一个网页的页面,获得解析的结果,如果当前的页数超过了最大页数,则停止,否则继续递归解析下一页.推荐给大家一个学习交流的地方,719+139+688,喜欢Python的一起high起来。

这里就用了res=None,递归还是蛮有用的。

2.陷阱2:闭包中延迟绑定

如果说上面的陷阱1还比较好理解,那下面的这个陷阱是就更有的迷惑性!大部分人都会掉进去,这就是Python在闭包作用域中绑定变量的方式~~

听说这是70%学Python人,都会弄错的题,看你是否学到位

我们有一个函数是squares(用来创建平方数的函数),里面有一个3个匿名函数,每个匿名函数是返回i的平方数.看起来好像也满简单的,返回平方数嘛

接着我们用一个for循环得到每一个square函数,然后给这个square输入一个2. 也就是说x为2.我们期望的结果是: 0,1,2

0*2=0

1*2=2

2*2=4

但是实际上的结果是:

4

4

4

为啥会这样的呢,闭包本来就是Python里面一个比较难理解的概念,经常和函数装饰器搞在一起,再加上一个匿名函数,头都昏了!我们来换一下普通函数方式来理解:

听说这是70%学Python人,都会弄错的题,看你是否学到位

Python的闭包是延迟绑定,也就是说闭包中用到的变量的值,是在内部函数被调用的时候才查询得到的。

res里面包含了闭包函数make_square,这个闭包比较牛逼,它会对延伸到函数的作用域外边,也就是包含了对变量i的绑定,最后一次查询i的值为2.

正确的做法:

听说这是70%学Python人,都会弄错的题,看你是否学到位

i因为闭包延迟绑定才会造成上面的问题,解决的办法就是给它立刻绑定,就搞定了 .

Python的学习道路上有很多好玩的有趣的风景,也有很多坑,欢迎大家一起讨论,如果你有问题,也欢迎来撩!

文章来源网络和自己整理,如有侵权,请联系24小时删除

目录
相关文章
|
30天前
|
IDE 安全 程序员
揭秘如何用C编写出无敌的程序代码,你绝对会后悔错过!
揭秘如何用C编写出无敌的程序代码,你绝对会后悔错过!
14 1
|
2月前
|
数据采集 大数据 Python
学Python静不下来,看了一堆资料还是很迷茫是为什么
学Python静不下来,看了一堆资料还是很迷茫是为什么
30 2
学Python静不下来,看了一堆资料还是很迷茫是为什么
|
4月前
|
人工智能 架构师 机器人
高薪程序员的三大窍门,你准备好了吗?
“高薪,月薪过万”已经成为人们对于程序员的刻板印象,但实际上对于二三线城市的码农来说,月薪过万似乎仍然是一个难以达到的目标。地理位置、房价以及升职加薪等问题让程序员陷入了薪资困境。作为一位程序员,若想获得自己理想的工资水平,需要具备哪些要素呢?
|
人工智能 运维 数据可视化
程序员养家活口接私活必备网站(顺便用技术改变世界)
程序员接私活的原因很多种(挣钱、养家糊口、提升技术等等)。下面整理了一下网站送给最有潜能的你。 提前准备好自己的笔记本和技术呦。
479 0
|
程序员
程序人生 - 程序员要学点儿理财知识,而不仅仅是代码技巧
程序人生 - 程序员要学点儿理财知识,而不仅仅是代码技巧
109 0
程序人生 - 程序员要学点儿理财知识,而不仅仅是代码技巧
|
Java C语言
计算机教育中缺失的一课,劝学弟学妹们一句,一定要趁早补上,工作后会事半功倍!
各位学弟学妹们好,作为稍微年长的我(岁月是把杀猪刀啊),今天就给大家补补课。 在大学里的,我们上的计算机专业课程一般都是像操作系统、编译原理、计算机组成原理、计算机网络这些理论课程,还有一些像C语言、Java、.Net这些可以实践的课程,甚至还有可能让你焊一个收音机,但是对于一些基本习惯却很容易被忽略,需要学弟学妹们自行摸索。
178 0
计算机教育中缺失的一课,劝学弟学妹们一句,一定要趁早补上,工作后会事半功倍!
|
存储 安全 搜索推荐
天选程序员:如何提个好问题?
天选程序员:如何提个好问题?
240 0
天选程序员:如何提个好问题?
|
存储 程序员 C++
如果当初学习编程时能有人给我这些忠告该多好
Cecily Carver 是多伦多的一位程序媛,和 Jennie Faber 一起创办了一个游戏制作工作室。她喜欢歌剧、舞蹈和弹钢琴。Cecily 在这篇文章分享她在编程道路上的所感所想,给出很多值得思考的编程箴言以及一些思想误区,比如在你学习编程之前思考一下你的目标、编程不是什么神秘的东西、坚持比方法更重要等,可以让我们在编程路上少走一些弯路,从而有更多的时间学习技术让自己变的越来越强大。
197 0
|
程序员
程序员好心帮应届生改代码后,结果扎心了!
近日,一名程序员在互联网社区的吐槽:公司一个应届毕业生,领导安排和我一起做项目,提交的代码有许多不合适的地方,我在没有和他提前沟通的情况下做了部分重构,结果直接喷我,让我不要改他的代码,老哥们,遇到过这种情况吗?对此,网友是如此评论的: 直接说让他自己改,改之前你应该先说,不过应届生也敢喷你,不是后台强,就是情商低;千万别自己改,你应该给他说怎么改,然他自己改,我就是应届生,我领导就这样做的。
1008 0
|
Java 程序员
一个“码农”自述的血泪史:当了35年程序员,我最大的遗憾就是没抓住机遇转行
注:这是一个“一子错,满盘皆落索”的故事。兢兢业业干了35年的程序员,最后却认识到,程序员的力量太过微小。无论你写程序有多厉害,你都很难有权力真正改变一些失败的产品、失败的项目。
1447 0

热门文章

最新文章