Python小技巧:如何用更少的代码做更多的事情

2023-11-28 17:04:13 浏览数 (2)

经常在写代码的时候,会写很多代码,但是有时候只要是使用妥当,一行代码就可以代替,也就是很简单的一行代码就能实现。

1.短路运算,常见的就是if els组成的

代码语言:javascript复制
def get_user(user):
    # 常规代码
    if user:
        return user
    return "匿名用户"

if __name__=="__main__":
    print(get_user(None))
# 短路来简写代码

def get_user(user):
    return user or "匿名用户"
if __name__=="__main__":
    print(get_user(None))

结果打印

代码语言:javascript复制
匿名用户
匿名用户

这样只需要一行代码久可以搞定了。

2.切片替代循环

使用切片代替循环或递归来操作序列。切片是一种用于从一个序列(如字符串、列表、元组等)中获取一部分或全部元素的语法。

代码语言:javascript复制
# 使用循环
def reverselist(lst):
    new_lst = []
    for i in range(len(lst) - 1, -1, -1):
        new_lst.append(lst[i])
    return new_lst

lst = [1, 2, 3, 4, 5]
print(reverselist(lst)) # [5, 4, 3, 2, 1]

# 使用切片
def reverselist(lst):
    return lst[::-1]

lst = [1, 2, 3, 4, 6]
print(reverselist(lst)) # [6, 4, 3, 2, 1]

切片的操作比循环或递归更简单并且高效,因为切片是基于内置函数实现的,而循环或递归是基于自定义函数实现。

3.枚举

枚举是一种用于同时获取可迭代对象中的元素和索引的函数。枚举可以避免使用额外的变量来记录索引,提高了代码的可读性和效率。

代码语言:javascript复制
# 使用普通的循环
lst = ["a", "b", "c", "d", "e"]
index = 0
for x in lst:
    print(index, x)
    index  = 1

打印

代码语言:javascript复制
# 输出:
# 0 a
# 1 b
# 2 c
# 3 d
# 4 e

使用枚举来实现

代码语言:javascript复制
# 使用枚举
lst = ["a", "b", "c", "d", "e"]
for index, x in enumerate(lst):
    print(index, x)
# 输出:
# 0 a
# 1 b
# 2 c
# 3 d
# 4 e

使用枚举更加清晰,更加简洁

4.三元运算符

三元运算符是一种用于根据一个条件表达式来选择两个不同的值的简洁的语法。

代码语言:javascript复制
# 使用普通的if-else语句
num = -5
if num > 0:
    sign = "positive"
else:
    sign = "negative"
print(sign) # negative
代码语言:javascript复制
# 使用三元运算符
num = -5
sign = "positive" if num > 0 else "negative"
print(sign) # negative
5.字典处理条件判断

遇到if循环语句很长的时候,其实可以使用字典来替代

代码语言:javascript复制
# 使用多个if-elif-else语句
def foo(x):
    if x == "a":
        return 1
    elif x == "b":
        return 2
    elif x == "c":
        return 3
    else:
        return -1

print(foo("a")) # 1
print(foo("d")) # -1

# 使用字典
def foo(x):
    dic = {"a": 1, "b": 2, "c": 3}
    return dic.get(x, -1)

print(foo("a")) # 1
print(foo("d")) # -1

6.map 函数

map函数代替循环来对可迭代对象中的每个元素应用一个函数。map函数是一种用于将一个函数作用于一个可迭代对象中的每个元素,并返回一个新的可迭代对象的函数。

代码语言:javascript复制
# 不使用map函数
lst = ["1", "2", "3", "4", "5"]
new_lst = []
for x in lst:
    new_lst.append(int(x))
print(new_lst) # [1, 2, 3, 4, 5]

# 使用map函数
lst = ["1", "2", "3", "4", "5"]
new_lst = list(map(int, lst))
print(new_lst) # [1, 2, 3, 4, 5]

7.filter 函数

filter函数代替循环来从可迭代对象中筛选出满足一个条件的元素。filter函数是一种用于将一个条件函数作用于一个可迭代对象中的每个元素,并返回一个只包含满足条件元素的新的可迭代对象的函数。

例如:查找奇偶数

代码语言:javascript复制
# 不使用filter函数
lst = [1, 2, 3, 4, 5]
new_lst = []
for x in lst:
    if x % 2 == 0:
        new_lst.append(x)
print(new_lst) # [2, 4]

# 使用filter函数
lst = [1, 2, 3, 4, 5]
new_lst = list(filter(lambda x: x % 2 == 0, lst))
print(new_lst) # [2, 4]

8.装饰器

装饰器是一种用于在不修改原函数定义和调用的情况下,给函数添加额外的功能或修改其行为的语法。

代码语言:javascript复制
# 使用普通的函数调用
import time

def foo():
    # do something
    time.sleep(1)

start = time.time()
foo()
end = time.time()
print(f"foo() fun run {end - start} seconds.")

如果用装饰器呢

代码语言:javascript复制

# 使用装饰器
import time

def timer(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f"{func.__name__}() took {end - start} seconds to run.")
        return result
    return wrapper

@timer # 相当于 foo = timer(foo)
def foo():
    # do something
    time.sleep(1)

这个装饰器不仅这个函数能用,其他函数也可以用。比如flask 框架,装饰器用到很多。还可以实现,如日志、缓存、计时、权限检查等。使用起来还是很方便呢。比如在测试中,之前我还自己简单写了一个巡检系统,不用定时器,自己用装饰器实现一个定时器,很简单的一两行代码不用依赖,只要有python环境随时可以执行了。当然了,还可以有很多用途。

python以简洁之美著称,所以在实际的开发中,我们还是可以多用到这些高级的语法,可以很简洁的实现功能。

0 人点赞