Python 初学者容易踩的 5 个坑

这篇具有很好参考价值的文章主要介绍了Python 初学者容易踩的 5 个坑。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

哈喽大家好,我是咸鱼。

今天咸鱼列出了一些大家在初学 Python 的时候容易踩的一些坑,看看你有没有中招过。

原文:https://www.bitecode.dev/p/unexpected-python-traps-for-beginners

不明显的字符串拼接

Python 在词法分析的时候会把多个字符串自动拼接起来。

data = "very""lazy"
print(data) # verylazy

这个特性可以让我们在声明一个长字符串的时候可以分成多行来写,这样看起来比较优雅。

msg = (
    "I want this to be on a single line when it prints " 
    "but I want it to be broken into several lines in "
    "the code"
    )


print(msg)
# I want this to be on a single line when it prints but I want it to be broken into several lines in the code
msg ="I want this to be on a single line when it prints " \
    "but I want it to be broken into several lines in " \
    "the code"

print(msg)
# I want this to be on a single line when it prints but I want it to be broken into several lines in the code

但初学者往往会忽略这一点,他们在使用包含字符串的列表时把分隔符漏掉,造成了意想不到的字符串拼接。

比如说他们想要声明一个包含域名的列表host。

host = [
    "localhost",
    "bitecode.dev",
    "www.bitecode.dev"
]

print(host) # ['localhost', 'bitecode.dev', 'www.bitecode.dev']

但是写成了下面这样。

host = [
    "localhost",
    "127.0.0.1",
    "bitecode.dev" # 这里把逗号忘掉了
    "www.bitecode.dev"
]

print(host) # ['localhost', 'bitecode.devwww.bitecode.dev']

这是有效的代码,不会触发语法错误,但是解析的时候会把 "bitecode.dev""www.bitecode.dev" 拼接在一起,变成 'bitecode.devwww.bitecode.dev'

sorted() 和 .sort() 傻傻分不清

在 Python 中,大多数函数或方法都会返回一个值。比如说我们要对一个列表里面的内容进行排序,可以使用 sorted() 方法。

# sorted() 方法会返回一个排序后的新列表
numbers = [4, 2, 3]
sorted_numbers = sorted(numbers)
print(sorted_numbers) # [2, 3, 4]

我们也可以用列表自带的 .sort() 方法来排序,需要注意的是: .sort() 直接对原有列表进行排序,不会返回任何值。

# .sort() 方法直接对原列表进行排序
numbers = [4, 2, 3]
numbers.sort()
print(numbers) # [2, 3, 4]

但是初学者很容易把 sorted() 的用法用在 .sort() 上,结果发现怎么返回了一个 None。

numbers = [4, 2, 3]
sorted_numbers = numbers.sort()
print(sorted_numbers) # None

list.sort() 修改原列表,它不会返回任何内容。当 Python 可调用对象不返回任何内容时,会得到 None

或者把 .sort() 的用法用在了 sorted() 上。

numbers = [4, 2, 3]
sorted(numbers)
print(numbers) # [4, 2, 3]

不要乱加尾随逗号

我们在创建一个空元组的时候可以用下面的两种方法:

t1 = ()
t2 = tuple()
print(type(t1))
print(type(t2))

在 Python 中,虽然元组通常都是使用一对小括号将元素包围起来的,但是小括号不是必须的,只要将各元素用逗号隔开,Python 就会将其视为元组。

t1 = 1,
print(t1) # (1,)
print(type(t1)) # <class 'tuple'>

所以如果在数据后面多加了一个逗号,就会产生一些问题。

比如说下面是一个列表:

colors = [
    'red',
    'blue',
    'green',
]
print(colors) # ['red', 'blue', 'green']

如果不小心加了一个尾随逗号,列表就变成了元组。

colors = [
    'red',
    'blue',
    'green',
],
print(colors) # (['red', 'blue', 'green'],)

在 python 中,包含一个元素的元组必须有逗号,比如下面是包含一个列表的元组:

colors = [
    'red',
    'blue',
    'green',
],

这是列表:

colors = ([
    'red',
    'blue',
    'green',
])

可怕的 is

在 python 中, is 和 == 都是用来比较 python 对象的,区别是:

  • is 比较需要对象的值和内存地址都相等
  • == 比较只需要对象的值相等就行了

事实上,这两者的实际使用要远远复杂的多。

比如说下面的 a 和 b 是两个不同的对象,a is b 应该返回 False,但是却返回了 True。

a = 4
b = 4

print(a == b) # True
print(a is b) # True

在 python 中,由于小整数池和缓存机制,使用 is 来比较对象往往会出现意想不到的结果。

关于小整数池和缓存机制可以看我这篇文章:

《Python 中 is 和 == 的区别》

奇怪的引用

在Python中,如果 * 运算符用于数字与非数字型数据(列表、字符串、元组等)的结合,它将重复非数字型数据。

print("0" * 3) # '000'
print((0,) * 3) # (0, 0, 0)

在创建一个多个列表元素的元组时候,如果使用下面的代码:

t1 = ([0],) * 3
print(t1) # ([0], [0], [0])

会带来意想不到的问题:我们对元组中的第一个列表元素中的数据进行算数运算(自增 1)

t1[0][0] += 1
print(t1) # ([1], [1], [1])

我们发现元组中的所有列表元素内的数据都自增 1 了,我们不是只对第一个列表元素进行自增的吗?

实际上,当我们执行 t1 = ([0],) * 3 的时候,不会创建一个包含三个列表组成的元组,而是创建一个包含 3 个 引用的元组,每个引用都指向同一个列表。

元组中的每个元素都是对同一个可变对象(列表)的引用,所以当我们修改其中的元素时,另外的对象也会跟着发生变化。

正确的方法应该是:

t2 = ([0], [0], [0])  
# 或者 t2 = tuple([0] for _ in range(3))
t2[0][0] += 1             
print(t2) # ([1], [0], [0]) 

在 python 的其他地方中也有这种类似的坑:

def a_bugged_function(reused_list=[]):  
    reused_list.append("woops")         
    return reused_list                  
                                        
print(a_bugged_function())  # ['woops']            
print(a_bugged_function())  # ['woops', 'woops']            
print(a_bugged_function())  # ['woops', 'woops', 'woops']          

可以看到,reused_list 在函数定义中被初始化为一个空列表 [],然后每次函数调用时都使用这个默认的空列表。

在第一次调用 a_bugged_function() 后,列表变成了 ['woops']。然后,在第二次和第三次调用中,它分别继续被修改,导致输出的结果为:

['woops']
['woops', 'woops']
['woops', 'woops', 'woops']

这是因为在函数定义中,如果将可变对象(例如列表)作为默认参数,会导致该对象在函数调用时被共享和修改:每次调用函数时,使用的都是同一个列表对象的引用。

为了避免这种情况,常见的做法是使用不可变对象(如 None)作为默认值,并在函数内部根据需要创建新的可变对象。文章来源地址https://www.toymoban.com/news/detail-838671.html

def a_fixed_function(reused_list=None):
    if reused_list is None:
        reused_list = []
    reused_list.append("woops")
    return reused_list

print(a_fixed_function())
print(a_fixed_function())
print(a_fixed_function())

到了这里,关于Python 初学者容易踩的 5 个坑的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python初学者友好丨详解参数传递类型

    摘要:  本文清晰地解释了Python中的不同参数传递类型,并提供了示例代码来说明每种类型的用法。对于初学者或不清楚Python传参的读者们来说是非常有益的,文中提供了足够的信息来理解和使用Python中的函数参数传递。 本文分享自华为云社区《提升Python函数调用灵活性:参

    2024年02月09日
    浏览(45)
  • 【新手解答】Python中Pandas的初学者笔记

    🌈你好呀!我是 是Yu欸 🌌 2024每日百字篆刻时光,感谢你的陪伴与支持 ~ 🚀 欢迎一起踏上探险之旅,挖掘无限可能,共同成长! 前些天发现了一个人工智能学习网站,内容深入浅出、易于理解。如果对人工智能感兴趣,不妨点击查看。 一位CSDN好友询问是否有 python里的p

    2024年03月14日
    浏览(61)
  • 学完python的心得体会,初学者对python的感想

    大家好,给大家分享一下学了一年的python的收获和感想,很多人还不知道这一点。下面详细解释一下。现在让我们来看看! Python今年是排名前3的最受欢迎和增长最快的编程语言之一。 它是一种多用途,高级别,面向对象,交互式,解释型和对用户非常友好的编程语言。 那么

    2024年02月08日
    浏览(45)
  • Python GUI初学者教程,轻松构建用户界面

    Python GUI入门教程:轻松构建用户界面。 微信搜索关注《Python学研大本营》,加入读者群,分享更多精彩 Python以其简单性和多功能性成为最受欢迎的编程语言之一。从网络开发到数据科学,Python被广泛应用于各个领域。 本文将探索Python内置的用于创建图形用户界面(GUI)的库

    2024年01月15日
    浏览(64)
  • 详解 matplotlib.pyplot ,Python 初学者真能看懂

    Matplotlib 是一个 Python 中的 2D 绘图库, pyplot 模块是一个方便使用 Matplotlib 的接口。 下面是 pyplot 模块中的五个重要的知识点: 【创建图形】: pyplot 模块提供了许多简单易用的函数来创建图形,如 plot、scatter、bar、hist 等。这些函数可以绘制不同类型的图形,例如散点图、折

    2024年02月02日
    浏览(47)
  • python 涉及opencv mediapipe知识,眨眼计数 供初学者参考

    基本思路  我们知道正面侦测到人脸时,任意一只眼睛水平方向上的两个特征点构成水平距离,上下两个特征点构成垂直距离 当头像靠近或者远离摄像头时,垂直距离与水平距离的比值基本恒定  根据这一思路 当闭眼时 垂直距离变小 比值固定小于某一个值 当睁眼时 比值大

    2024年01月23日
    浏览(51)
  • Python初学者必会的11道测试题,含代码!!

    一个学妹问我的11道python题,我就顺手拿来做了下,发现有些题目还是很有意思的。 1 随机生成一个在[5,10]区间内的整数n,分别输出如下图所示的n行有规律字符图。 【提示】 (I)随机数生成需要导入random库后调用randint(a,b)函数; (2)利用序列range()函数,获得字母编码值,调用

    2024年02月07日
    浏览(60)
  • 天猫商城自动化python脚本(仅供初学者学习使用)

    作者:Eason_LYC 悲观者预言失败,十言九中。 乐观者创造奇迹,一次即可。 一个人的价值,在于他所拥有的。可以不学无术,但不能一无所有! 技术领域:WEB安全、网络攻防 关注WEB安全、网络攻防。我的专栏文章知识点全面细致,逻辑清晰、结合实战,让你在学习路上事半

    2024年01月17日
    浏览(56)
  • python爬虫——爬取豆瓣top250电影数据(适合初学者)

    爬取豆瓣top250其实是初学者用于练习和熟悉爬虫技能知识的简单实战项目,通过这个项目,可以让小白对爬虫有一个初步认识,因此,如果你已经接触过爬虫有些时间了,可以跳过该项目,选择更有挑战性的实战项目来提升技能。当然,如果你是小白,这个项目就再适合不过

    2024年02月07日
    浏览(83)
  • chatgpt赋能python:Python初学者必知:如何正确安装pandas模块

    如果你是一名初学者,或者只是想学习数据分析的人,你可能已经听说过 pandas 这个模块。Pandas 是一个 Python 的数据处理库,它提供了各种数据结构,可以使用户轻松地处理大量数据。但是,在安装 Pandas 的时候,可能会遇到一些问题。下面,我们将给大家介绍一些方法,来确

    2024年02月07日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包