10个小技巧改进的 Python 代码,让你的代码更加简洁

  如果你需要遍历一个列表,并且需要同时获取索引和元素,大多数情况可能会使用 range(len(data)) 的语法。

  比如我们要遍历一个列表,找到所有的负数:

  私信小编01即可获取大量Python学习资源

  data = [1, 3, -5, 7, 9, -11]for i in range(len(data)):if data[i] < 0:print(f"索引:{ i},元素:{ data[i]}")

  输出:

  索引:2,元素:-5索引:5,元素:-11

  虽然这种方法有效,但如果使用 Python 内置的 enumerate 函数会更好,这个函数会返回遍历过程中当前索引和当前元素值作为一个元组,因此可以直接输出索引和值:

  data = [1, 3, -5, 7, 9, -11]for i, v, in enumerate(data):if v < 0:print(f"索引:{ i},元素:{ v}")

  输出:

  索引:2,元素:-5索引:5,元素:-11

  假如我们要创建一个从0~9的平方数的列表,一种简单的方法是先创建一个 list ,然后通过 for 循环每次将一个数的平方 append 到列表的结尾。

  squares=[]for i in range(10):squares.append(i ** 2)print(squares)

  输出:

  [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

  但其实通过列表生成式,我们有一种更快捷的方法,只需要一行代码就能够实现相同的功能。

  squares=[i ** 2 for i in range(10)]print(squares)

  输出:

  [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

  排序的需求在很多场景中都很常见,Python中的可迭代对象(列表、元组、字典)都可以进行排序,内置函数 sorted() 让我们甚至都不需要自己实现排序算法。

  data = [1, 3, -5, 7, 9, -11]sortedData = sorted(data)print(sortedData)

  输出:

  [-11, -5, 1, 3, 7, 9]

  sorted() 方法自动将列表按照升序排序,如果你想按照降序排序,可以使用 sorted() 的参数 reverse=True 。

  sorted() 方法同样也适用于元组类型的数据,但是注意排序的结果将返回一个列表。

  data = (1, 3, -5, 7, 9, -11)print(data)sortedData = sorted(data)print(sortedData)

  输出:

  (1, 3, -5, 7, 9, -11)[-11, -5, 1, 3, 7, 9]

  对于复杂的可迭代对象,比如我们可以创建一个列表,列表中的每一个元素都是一个人的字典信息,然后我们按照每个人的年龄进行排序。

  我们可以用 sorted() 的 key 参数,传入一个匿名函数,让排序按照我们预想的方式进行。

  data=[{ "name": "Alex", "age": 18}, { "name": "Band", "age": 21}, { "name": "Coco", "age": 17}]sorted_data=sorted(data, key=lambda x: x["age"])print(sorted_data)

  输出:

  [{'name': 'Coco', 'age': 17}, {'name': 'Alex', 'age': 18}, {'name': 'Band', 'age': 21}]

  如果你有一个包含多个值的列表,并且需要去重,一个不错的技巧是将我们的列表转换为一个集合。

  Python的集合是一种无序的数据类型,并且没有重复元素,还提供了不同集合之间的运算,可以求交集、并集和差集。

  data = [1, 3, 3, 5, 5, 5, 7, 7, 7, 7, 9, 9, 9, 9, 9]setData = set(data)print(setData)

  输出:

  {1, 3, 5, 7, 9}

  有时候列表并不是最好的选择。假如我们有一个非常大的列表,有10000个元素,我们想计算所有元素的总和,虽然可以用列表来做,当如果数据量特别大的话我们可能会遇到内存问题,更好的解决方案是使用生成器。

  dataList=[i for i in range(10000)]print(sum(dataList))dataGen=(i for i in range(10000))print(sum(dataGen))

  输出:

  列表生成式与生成器具有相同的语法,不同点在于列表生成式使用的是中括号,而生成器使用的是小括号。

  生成器通过类似于懒加载的方式计算我们需要的元素,因此它一次只生成一个元素,并且只在需要的时候才生成。

  我们可以使用 sys 的 getsize() 方法看一下列表和生成器的大小。

  import sysdataList=[i for i in range(10000)]print(sys.getsizeof(dataList), "bytes")dataGen=(i for i in range(10000))print(sys.getsizeof(dataGen), "bytes")

  输出:

  85176 bytes112 bytes

  假设我们有一个字典,其中包括不同的键,比如商品和价格,在我们的代码中的某个点,想要获得商品的价格。

  当我们用 [] 简单的访问键时,如果键不在字典中,那么代码将会报错,引发一个 KeyError 。

  dataDict={ "name": "Tesla", "price": 250000}print(dataDict["count"])

  报错:

  Traceback (most recent call last): File "mian.py", line 5, in print(dataDict["count"])KeyError: 'count'

  更好的方式是使用 .get() 方法,此时如果键不存在,则不会引发 KeyError ,而是返回一个默认值,如果我们不指定默认值,它会直接返回None,如果我们指定默认值,那么它会返回我们指定的默认值。

  dataDict={ "name": "Tesla", "price": 250000}print(dataDict.get("count"))print(dataDict.get("count", 0))

  输出:

  None0

  如果你想计算列表中元素的数量,Python中有一个非常方便的工具。

  from collections import Counterdata = [1, 3, 3, 5, 5, 5, 7, 7, 7, 7, 9, 9, 9, 9, 9]counter = Counter(data)print(counter)

  输出:

  Counter({9: 5, 7: 4, 5: 3, 3: 2, 1: 1})

  Counter 可以统计列表中不同元素的数量,并且按照出现次数降序排列,这比我们自己计算要好得多。

  如果你想知道某个元素的个数的话,可以直接通过 [] 访问,如果这个元素不存在,那么将返回0,并且还可以通过 most_common() 方法返回排名靠前的几个元素。

  from collections import Counterdata = [1, 3, 3, 5, 5, 5, 7, 7, 7, 7, 9, 9, 9, 9, 9]counter = Counter(data)print(counter[7])print(counter[11])print(counter.most_common(2))

  输出:

  40[(9, 5), (7, 4)]

  f-String在我看来是最佳的格式化字符串方法,我们只需要在字符串前写一个f,然后在字符串内部可以直接使用大括号来嵌入变量或表达式。

  data={ "name": "Alex", "age": 18}string=f"I'm { data['name']} and I am { data['age']} years old."print(string)

  输出:

  I'm Alex and I am 18 years old.

  这种方式更简单、更简洁、速度也更快。

  假如我们有一个包含不同字符串的列表,我们想把所有的字符串通过空格拼接在一起,千万不要再用 for 循环一个一个遍历然后拼接了,一种更简洁的方法是通过 .joint() 方法,它可以使用指定的字符将字符串拼接起来。

  strings=["Hello", "World", "!"]print(" ".join(strings))print("_".join(strings))

  输出:

  Hello World !Hello_World_!

  如果我们有两个字典,并且希望将其合并成一个,此时我们可以使用双星号 ** 和大括号 {} 语法。

  info1={ "name": "Alex", "age": 18}info2={ "name": "Alex", "city": "Bei Jing"}info={ **info1, **info2}print(info)

  输出:

  {'name': 'Alex', 'age': 18, 'city': 'Bei Jing'}

  以上就是这篇文章跟大家分享的小技巧。

  如果你觉得这篇文章对你有帮助的话,欢迎一键三连~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值