初学者必看!盘点9个Python使用常见错误

我是黄勇,一名大厂内训专家,曾为网易、360、华为等多家企业员工提供Python培训;曾使用Python开发过多个大型企业网站;从零打造分布式爬虫架构,目前专注于python领域的课程研发和教学工作。

如今的职场上,10个人里大约有7个动过学Python的念头,3个能付诸行动,1个能坚持学习完基础,最后能理直气壮的说出“我会用Python!”的人,emmm……不用我多说了吧。

当然,失败率高并不代表同学们没有毅力坚持下去,而是Python入门的路上,坑真的是太太太太多了!所以今天,我把Python入门中出现频率最高的9个问题分享给大家。(通过学习路上的清障,哪怕能留住几个同学坚持下来也是好的~)

敲黑板!!!该记笔记了↓↓↓

1

缩进

Python每缩进一层代表形成了一个独立的代码块,非常严格。比如:

但是很多同学在用缩进的时候,经常会出现这个问题:

这种错误就是在写缩进代码的时候,既使用了tab键,又使用了空格键,所以才导致的问题。因此我们在缩进的时候,要么全部使用tab键,要么全部使用空格键。PEP8规范要求全部使用空格键,并且每层缩进使用2个空格,这个就要看每个公司的规范了。

2

三元表达式

Python中并不存在三元表达式,但可以通过if...else的方式在一行代码中实现类似三元表达式的效果。

但是“三元表达式”中,四则运算的优先级高于if...else...,比如看以下代码:

按道理结果应该为10,但是结果却是0,原因就是Python中的“三元表达式”优先级没有运算符优先级高,他会先计算10+4的结果,然后再进行三元表达式的运算。这点尤其要注意。

3

try...finally + return

try...finally是用来捕获异常,并且不管有没有异常发生,都会执行finally中的代码。这样看起来会比较好理解,但是如果加上return语句,可能就会发生意想不到的事情。

猜想一下以上代码会输出什么?是不是觉得应该输出的是1和2?,但实际上,以上代码输出结果是1,3,2!为什么?首先看下Python中的官方解释:

翻译成中文的意思就是,如果try中包含了break、continue、return语句,在离开try块之前,会优先执行finally中的代码,然后才会执行return语句。这样就能理解,为什么结果是1,3,2了。知道这个结果的你,是不是有种豁然开朗的感觉。

4

可变容器作为函数默认值

当我们在函数中使用了列表、字典等可变容器类型作为参数默认值的时候,会很容易出现问题。

我们可以看到,test()函数每执行一次,param这个列表中的值都会加1,这是因为默认参数会存储在函数的一个叫做__defaults__属性中,这个属性是函数属性,每次执行都是同一个对象,因此每次执行,param都会加一个新元素,并且还会保留之前添加的元素。正确的做法应该是把默认值设置成None,或者设置成不可变的数据类型,比如元组。

5

含单个元素的元组

在Python中,元组是不可变的(不能动态添加和删除元素),并且他的语法形式是圆括号,所以我们在元组定义的时候,如果里面只有一个元素,那么必须要在后面加上一个逗号。否则变成一个普通的数据:

a没有使用逗号,得到的结果是1,而b在定义元组的时候使用了逗号,则不会变成数字1,而是一个存储了数字1的元组。

6

相同值的不可变对象

先来看一段代码:

大家猜测一下,第一个print输出是多少,第二个print输出又是多少?先给大家看下答案,再解释原因:

可以发现只有key为1,value为'b'的数据了。而原来的key为1,value为'a'的值凭空消失了。这是为什么呢?原因是Python字典是使用哈希表的思想实现的,Python 调用内部的散列函数,将键(Key)作为参数进行转换,得到一个唯一的地址,也就是哈希值。而Python 的哈希算法对相同的值计算得到的结果是一样的,这就很好地解释了上述情况出现的原因。

7

is和==

Python中的is代表两个对象的id值是否相同,而==则判断两个值是否相同。

来看下以下代码:

a和b都是一个空的列表,他们是存放到不同的内存空间,因此他们的id是不一样的,所以a is b为False,但是a==b是True,原因是他们两个的值是相等的。

8

for...else...

这个语法可以说是Python独有的,他的作用是在for循环中每一项都循环到了,就会执行else,否则就不会执行else。举个例子:

因为0...9的所有数字都小于18,所以不执行到break,也就range中的每一项都执行到了。这时候就会执行else语句。但是如果我们把a改成8,就不会执行else中的语句了,这个大家可以自行尝试。

9

Python闭包的变量

先来看以下代码:

我们期望的结果应该是0,1,4,但实际上是16,16,16。原因是python中的惰性求值。惰性求值,也就是延迟求值,表达式不会在它被绑定到变量之后就立即求值,而是等用到时再求值。x 实际不在 lambda 的作用域中。只有当 lambda 被调用时,x 的值才会被传给它。也就是最后的一次循环中 x 为 4,后面的 ls[1],ls[1],ls[2],ls[3]实际都是 16。

掌握了这几个问题的解决方法,不能说Python入门一路畅通,至少也能给大家学习路上扫清大部分障碍。

能静下心来学习Python的,我都会称呼一句“勇士”,不过想坚持把Python学好,明确学习路线非常重要。不能说你对爬虫感兴趣,所以一开始就学爬虫,完全不考虑基础语法,这就等于还不会走路,就想拿奥运会110米栏冠军。

我在这里为大家推荐一个标准学习路径

↓↓↓立即扫码↓↓↓

小白和初学者都可以无压力学习,从Python编程基础,到热门应用(数据分析、数据挖掘、爬虫、机器学习)全面覆盖,另外还包含了100道大厂面试真题。

推荐理由:

  • 本课程分为7个大课程方向,共计623节视频课,涵盖10个企业级项目实战和50个练习案例,能够帮助你建立完整知识体系,同时具备独立实操能力。

  • 近13万学习者亲测有效,他们之中有编程小白,有转行的程序员,有准备从事数据分析、人工智能等等岗位。无论你之后想从事 Python 的哪个应用方向,该掌握的在这里都能学到。

  • 师资有保障。本课程的授课讲师包括我在内共7位,全部是来自阿里、网易、华为、360等企业的Python讲师,并且均有着超10年以上的实战开发经验。

  • 价格超优惠。原价1253元,今天只要198元7位Python名师指导课打包带回家!

课程还设置了线上答疑,你在学习中遇到任何问题,都可以随时在社群中发问,这样一来,你在学习Python时,遇到诸如前面提到的实际问题,都可以轻松解决。

课程最适合哪些人学习?

  • 准备从事编程工作,但是不知道选择什么语言好

  • Python应用方向太多了,不知道该学哪个才适合自己

  • 准备从事Python开发,不知道怎么学,也没人带

  • 有一定的Python基础,但缺乏系统的学习,没有完整的知识框架

课程最适合哪些人学习?

  • CSDN价值100元现金券(购课后根据指引进群领取)

  • 随课赠送价值2000元的Python学习视频

⚠️⚠️⚠️ 友情提醒

线下5位数,线上1000多的课程

年初特惠,到手仅需198

(购课免费领价值2000元礼包)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值