Python 是一种学习起来极其简单的语言,它不会强迫你使用特定的规定。但是也容易让人陷入一些陷阱,让你表现得像初学者。为避免看起来像个完全的新手,请查看下面的技巧以及如何纠正它们。
Python 让遍历事物变得超级简易,比如列表。看看下面的例子:
vals = ['Python', '好玩!']for val in vals: print(val)# 输出:# Python# 好玩!
如果你需要引用每个项目的索引,会发生些什么呢?你可能会遇到,甚至写出如下所示的代码:
vals = ['Python', '好玩!']for i in range(len(vals)): print(i, vals[i])# 输出:# 0 Python# 1 好玩!
虽然这行得通,但不够优美!同时它也无法立即明白你的代码在做什么。
这就是 enumerate() 函数派上用场的地方!看看它是如何让这个过程变得更容易:
vals = ['Python', '好玩!']for i, val in enumerate(vals): print(i, val)# 输出:# 0 Python# 1 好玩!
这是不是好多了?
作为一个专业的提示,你甚至可以改变初始值。假如你想让从索引1开始迭代,则可以简单地写为:
vals = ['Python', '好玩!']for idx, val in enumerate(vals, start=1): print(idx, val)# 输出:# 1 Python# 2 好玩!
好的,让我们深入研究下一个新手习惯!
当你使用 if-else 语句进行值的分配时,你为一个简单的操作写了许多行代码。看看下面的场景:
amount = 100if amount > 50: raise_amount = 20else: raise_amount = 10print(raise_amount)# 输出:# 20
在上面的例子中,创建了一个 if-else 语句,检查某人卖出的金额是否超过 50。如果是的话,他们就会涨薪 20。否则,他们将获得 10 的涨幅。
我们的代码很清晰,但并不简练。此时可通过使用三元运算符大大简化:
amount = 100raise_amount = 20 if amount > 50 else 10print(raise_amount)# 输出:# 20
这对于非常简单的分配赋值来说效果最好。当然你可以让其变的更复杂,但不要为了简练而牺牲可读性!
Python 推导可以轻松创建列表、字典,甚至生成器。它们提供了一种优雅且可读的方式来轻松创建数据结构。
让我们看一个你如何使用 for 循环来创建一个平方数列表的例子:
squares = []for i in range(1, 6): squares.append(i ** 2)print(squares)# 输出:# [1, 4, 9, 16, 25]
现在让我们将其与列表推导进行比较:
squares = [i ** 2 for i in range(1, 6)]print(squares)# 输出:# [1, 4, 9, 16, 25]
可以看到使用列表推导多么的简单和明确!代码不仅更精简,且更容易阅读。
创建字典推导也同样容易。再通过创建一个字典来比较两种方法,其中键是原始数字,值是其平方:
squares = {}for i in range(1, 6): squares[i] = i ** 2print(squares)# 输出:# {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
现在让我们看看我们如何用字典推导来简化!
squares = {i: i ** 2 for i in range(1, 6)}print(squares)# 输出:# {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
现在,大家可能很容易过度使用推导用于生成列表或字典。但除非有意义,否则不要把它们用在所有事情上!
Python 推导很强大。你可以在里面构建复杂的 if-else 语句,甚至可以在其中互相嵌套。
让我们看看我们如何应用 if-else 语句:
even_odd_numbers = [ "偶数" if num % 2 == 0 else "奇数" for num in range(10)]print(even_odd_numbers)# 输出:# ['偶数', '奇数', '偶数', '奇数', '偶数', '奇数', '偶数', '奇数', '偶数', '奇数']
上面这个例子中,使用了三元运算符返回一个值,同时继续迭代。这个例子相当简单 —— 但看看更复杂的一个:
result = [x * 2 if x % 2 == 0 else x * 3 for x in range(10) if x != 5]
哎!阅读起来有点费劲了。这就是重点说明的地方 —— 如果推导不清晰,就不要写它。
让我们将这个推导转换成一个循环看看,能否更易读:
result = []for x in range(10): if x != 5: if x % 2 == 0: result.append(x * 2) else: result.append(x * 3)
可以看到,虽然使用了更多行来编写这段代码,但易读得多!
Python 的 itertools 是 Python 自带的一个隐藏的宝石。尽管表面上,它的许多功能看似简单,但它们提供了优雅且强大的方式来迭代不同的对象。
假设你有两个列表,你想遍历所有可能的组合。可以写一个如下所示的嵌套 for 循环:
colors = ['红色', '绿色']sizes = ['S', 'M', 'L']for color in colors: for size in sizes: print(color, size)# 输出:# 红色 S# 红色 M# 红色 L# 绿色 S# 绿色 M# 绿色 L
与这篇文章中其他内容一样,这种方法行得通,但它并不真正的优雅。
幸运的是,itertools 附带了 product() 函数,它生成所有项的笛卡尔积。意味着可以在单个的for循环中直接解包值,如下所示:
from itertools import productcolors = ['红色', '绿色']sizes = ['S', 'M', 'L']for color, size in product(colors, sizes): print(color, size)# 输出:# 红色 S# 红色 M# 红色 L# 绿色 S# 绿色 M# 绿色 L
可以看到这种方法有多么简单!它也更加节省内存,因为它只在你需要使用值之前将值存储在生成器中。
在某些情况下,你需要成对地遍历一个列表,这意味着你需要访问一个对象及其周围的对象。
为此,可以写出以下代码:
vals = [1, 2, 3, 4]for i in range(len(vals) - 1): print((vals[i], vals[i + 1]))# 输出:# (1, 2)# (2, 3)# (3, 4)
这种方法效果很好,但既不容易阅读,也不明确它的作用。
这就是 Python 3.10 引入的 pairwise() 函数派上用场之处!让我们看看如何简化代码:
from itertools import pairwisevals = [1, 2, 3, 4]for pair in pairwise(vals): print(pair)# 输出:# (1, 2)# (2, 3)# (3, 4)
这是我们之前写过的代码的更明确的版本,可以立即理解代码的目标。
itertools 库为你提供了许多对于迭代对象非常有用的函数。知道何时应用这些函数真正将你的技能提升到另一个层次。
掌握 Python 不仅仅是记住语法 —— 还需要拥抱优雅,知道何时平衡简洁和可读性。
记住 Python 的禅宗:
本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-87502-0.html初学者易犯的四个Python错误!
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com