提高效率的Python编程技巧

参考B站UP啥都会一点的研究生
整理了十个100%提高效率的Python编程技巧,更上一层楼

1.遍历列表,且要用到其索引位置进行相应的数据操作

遍历列表,且要用到其索引位置进行相应的数据操作

'''通常会写成如下形式'''
data = [1, 4, 5, 7, 9]
for i in range(len(data)):
    if data[i] % 2:
        data[i] = 0
print(data)

>>> [0, 4, 0, 0, 0]

但更好的方式是使用Python的内置枚举函数enumerate,可以直接获取到相应值及其索引

'''使用内置枚举函数enumerate'''
data = [1, 4, 5, 7, 9]
for idx, value in enumerate(data):
    if value%2:
        data[idx]=0
print(data)

>>> [1, 4, 1, 1, 1]

2.对列表进行增删改操作

如果需要对列表进行增删改操作

'''列表是可变对象,不能直接对其进行操作,可以建立一个新列表保存结果'''
data2 = [9, 8, 8, 3, 3, 1]
out = []
for i in data2:
    if i % 2 != 0:
        out.append(i)
print(out)

>>> [9,3,3,1]

但通常列表推导式是更简单更快的方式

'''列表推导式'''
out = [x for x in data2 if x % 2 != 0]
print(out)

>>> [9,3,3,1]

3.对可迭代对象进行排序

需要对可迭代对象进行排序,比如列表、元组、字典,首先以列表为例子,可以直接使用内置函数sorted完成任务,如果想使用降序,可以将参数reverse设置为True

data3_1 = [-1, -10, 0, 9, 5]
new_data = sorted(data3_1, reverse=True) # 降序
print(new_data)

>>> [9, 5, 0, -1, -10]

同样的适用于元组,但要注意此时输出类型变成了列表

data3_2 = (-1, -10, 0, 9, 5)
new_data = sorted(data3_2, reverse=True)
print(new_data)
print(type(new_data))

>>> [9, 5, 0, -1, -10]
>>> <class 'list'>

如果需要对复杂的可迭代对象进行排序,比如列表中的元素为字典类型,在这个例子中,需要按age大小对列表进行排序,那么可以在参数key这使用匿名函数lambda

data3_3 = [
    {"name" : "jia", "age" : 18},
    {"name" : "yi", "age" : 60},
    {"name" : "bing", "age" : 20}
]
new_data = sorted(data3_3, key=lambda x: x["age"])
print(new_data)

>>> [{'name': 'jia', 'age': 18}, {'name': 'bing', 'age': 20}, {'name': 'yi', 'age': 60}]

4.列表去重

有一个包含多个值的列表,但存在重复值,如果需要去重,最简单的做法是将我们的list转为set,会自动进行重复值的删除

data4 = [1, 1, 2, 3, 3, 4, 5, 5, 7]
new_data = set(data4)
print(new_data)

>>> {1, 2, 3, 4, 5, 7}

关于集合set,常见的用法是在两组数据中进行运算,如,求交集、并集、差集、补集等

data4_1 = {'Mathematics', 'Chinese', 'English', 'Physics', 'Chemistry', 'Biology'}
data4_2 = {'Mathematics', 'Chinese', 'English', 'Politics', 'Geography', 'History'}
print(data4_1 & data4_2)
print(data4_1 | data4_2)
print(data4_1 - data4_2)
print(data4_1 ^ data4_2)

>>> {'Mathematics', 'Chinese', 'English'}
>>> {'Geography', 'Physics', 'Mathematics', 'Chinese', 'Politics', 'English', 'Chemistry', 'Biology', 'History'}
>>> {'Physics', 'Biology', 'Chemistry'}
>>> {'Politics', 'Geography', 'Chemistry', 'Biology', 'Physics', 'History'}

5.包含大量数据的列表执行如sum等操作,可能会出现内存问题

有一个包含很多数据的列表,如果执行如sum等操作,可能会出现内存问题

但是如果将中括号改成小括号,即变成生成器,将提升效率

为方便对比,我们导入Python标准库sys进行演示,可以看到生成器的方式将大大节省空间

import sys

data5_1 = [i for i in range(10000)]
print(sys.getsizeof(data5_1), "bytes")

data5_2 = (i for i in range(10000))
print(sys.getsizeof(data5_2), "bytes")

>>> 499500
>>> 9024 bytes
>>> 499500
>>> 120 bytes

6.获取字典中不存在的键时会报错

定义一个拥有不同键值对的字典,正常情况下当你获取字典中不存在的键时会报错

data6 = {"name" : "sds", "age" : "18"}
uid = data6["uid"]
print(uid)

>>> KeyError: 'uid'

而你在工程文件中经常会注意到使用get方法,避免因键不存在而引起的程序崩溃,若索引不到,将返回在第二个位置定义的参数

uid = data.get("uid", "1314")
print(uid)

>>> 1314

类似的还有setdefault,如果键不存在于字典中,将会添加键并将值设为默认值

data6 = {"name" : "sds", "age" : "18"}
uid = data6.setdefault("uid", "1314")
print(uid)
print(data6)

>>> 1314
>>> {'name': 'sds', 'age': '18', 'uid': '1314'}

7.完成字符串中某位置插入某对象的格式化操作

如果想完成字符串中某位置插入某对象的格式化操作,f-Strings将会是一个不错的方式

name = "sds"
data7_1 = f"Hi {name}"
print(data7)

>>> Hi sds

还可以在大括号内进行运算,这是Python3.6开始支持的新的格式化操作,相比以前更简洁方便。

i = 9
data7_2 = f"{i} * {i} = {i * i}"
print(data7_2)

>>> 9 + 9 * 9 = 90

8.字符串拼接

定义一个列表,里面存放字符串对象,如果想实现拼接,由于字符串是不可变对象,很多人会定义空字符串进行遍历拼接,但,对于大型字符串可能会导致特别慢

data8 = ["Hi", "my", "data8"]
newdata = ''
for i in data8:
    newdata += i + " "
print(newdata)

>>> Hi my data8

更优的方案是使用join,实现将列表中内容进行全部拼接,join前引号中的内容将作为分隔符

newdata = " ".join(data8)
print(newdata)

>>> Hi my data

9.合并两个字典

如果想合并两个字典,无需遍历对比判断键,只需使用如下语法即可达到目的

data9_1 = {"name" : "sds", "age" : "18"}
data9_2 = {"name" : "sds", "uid" : "6688"}
out_data = {**data9_1, **data9_2}
print(out_data)

>>> {'name': 'sds', 'age': '18', 'uid': '6688'}

10.if中将某对象与多个其他对象进行对比判断

如果需要在if中将某对象与多个其他对象进行对比判断

'''你可能会进行如下定义'''
data10 = "a"
if data10 == "a" or data10 == "b" or data10 == "c":
    print("right")

>>> right

但是当对比对象增加时,很不方便,且可能存在拼写错误,所以通常会使用如下方式

datas = ["a", "b", "c"]
if data10 in datas:
    print("cool~")

>>> cool~
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值