Python高手必知的18个简洁代码片段

1. 使用列表推导式简化循环

列表推导式是Python中最强大的特性之一。它允许你在一行代码内创建列表。

# 假设我们有一个数字列表  
numbers = [1, 2, 3, 4, 5]  
  
# 我们想要得到这个列表中所有数字的平方  
squares = [num ** 2 for num in numbers]  
  
print(squares)  # 输出: [1, 4, 9, 16, 25]  

解释: 这里我们使用了列表推导式 [num ** 2 for num in numbers] 来代替传统的循环方式,使代码更简洁。

2. 字典推导式生成新字典

字典推导式同样可以简化生成新字典的过程。

# 假设我们有一个字典  
original_dict = {'a': 1, 'b': 2, 'c': 3}  
  
# 我们想要得到一个新字典,其中所有的值都加1  
new_dict = {key: value + 1 for key, value in original_dict.items()}  
  
print(new_dict)  # 输出: {'a': 2, 'b': 3, 'c': 4}  

解释: 通过 {key: value + 1 for key, value in original_dict.items()} 这种形式,我们轻松地生成了一个新字典。

3. 列表切片

列表切片可以帮助你快速获取列表的一部分。

# 偶数位置的元素  
even_positions = numbers[::2]  
  
# 反转列表  
reversed_numbers = numbers[::-1]  
  
print(even_positions)  # 输出: [1, 3, 5]  
print(reversed_numbers)  # 输出: [5, 4, 3, 2, 1]  

解释: numbers[::2] 表示从第一个元素开始,每隔一个元素取一个值;numbers[::-1] 表示从最后一个元素开始,逆序取出所有元素。

4. 使用zip函数合并多个列表

当你需要同时遍历多个列表时,zip 函数是一个好帮手。

names = ['Alice', 'Bob', 'Charlie']  
ages = [25, 30, 35]  
  
# 合并两个列表  
combined = list(zip(names, ages))  
  
print(combined)  # 输出: [('Alice', 25), ('Bob', 30), ('Charlie', 35)]  

解释: zip(names, ages) 将两个列表打包成一个元组列表。

5. 使用enumerate增强for循环

当需要同时访问列表中的元素及其索引时,enumerate 函数可以派上用场。

for index, name in enumerate(names):  
    print(f"Index {index}: {name}")  
  
# 输出:  
# Index 0: Alice  
# Index 1: Bob  
# Index 2: Charlie  

解释: enumerate(names) 返回一个枚举对象,每次迭代都会返回当前元素及其索引。

6. 三元条件表达式简化if-else语句

有时候,简单的条件判断可以用一行代码搞定。

age = 20  
status = "adult" if age >= 18 else "minor"  
  
print(status)  # 输出: adult  

解释: "adult" if age >= 18 else "minor" 是一个三元条件表达式,相当于 if age >= 18: status = "adult" else: status = "minor"

7. 使用any和all函数简化逻辑判断

anyall 函数可以用来简化对集合的逻辑判断。

# 检查是否至少有一个元素为真  
if any([False, False, True]):  
    print("At least one element is True")  
  
# 检查是否所有元素都为真  
if all([True, True, True]):  
    print("All elements are True")  

解释: any 函数只要集合中有任何一个元素为真,就返回 Trueall 函数只有当集合中所有元素都为真时才返回 True

8. 使用set进行去重

如果你需要去除列表中的重复元素,set 类型是个不错的选择。

items = [1, 2, 2, 3, 4, 4, 5]  
unique_items = list(set(items))  
  
print(unique_items)  # 输出: [1, 2, 3, 4, 5]  

解释: set(items) 会自动去除重复元素,再将其转换回列表即可。

9. 使用lambda函数定义匿名函数

在某些情况下,你可能需要定义一个一次性使用的简单函数。

# 定义一个匿名函数,计算两个数的和  
add = lambda x, y: x + y  
  
print(add(3, 5))  # 输出: 8  

解释: lambda x, y: x + y 定义了一个接受两个参数 xy 的匿名函数,并返回它们的和。

10. 使用sorted函数排序

sorted 函数可以用来对列表进行排序,支持自定义排序规则。

# 对数字列表按降序排序  
desc_sorted = sorted(numbers, reverse=True)  
  
# 自定义排序规则  
def custom_sort(item):  
    return item % 3  
  
custom_sorted = sorted(numbers, key=custom_sort)  
  
print(desc_sorted)  # 输出: [5, 4, 3, 2, 1]  
print(custom_sorted)  # 输出: [3, 1, 4, 2, 5]  

解释: sorted(numbers, reverse=True) 以降序排序;sorted(numbers, key=custom_sort) 根据自定义函数排序。

11. 使用with语句管理资源

with 语句可以安全地打开文件或连接数据库等,自动处理资源释放。

# 打开一个文件并读取内容  
with open('example.txt', 'r') as file:  
    content = file.read()  
  
print(content)  

解释: with open('example.txt', 'r') as file: 会在执行完代码块后自动关闭文件。

12. 使用map函数批量处理数据

map 函数可以将一个函数应用于一个或多个序列中的所有元素。

# 计算每个元素的平方  
squared = map(lambda x: x ** 2, numbers)  
  
# 转换为列表  
squared_list = list(squared)  
  
print(squared_list)  # 输出: [1, 4, 9, 16, 25]  

解释: map(lambda x: x ** 2, numbers) 会对 numbers 中的每个元素应用平方操作。

13. 使用filter函数筛选元素

filter 函数可以筛选出满足条件的元素。

# 筛选出大于2的元素  
filtered = filter(lambda x: x > 2, numbers)  
  
# 转换为列表  
filtered_list = list(filtered)  
  
print(filtered_list)  # 输出: [3, 4, 5]  

解释: filter(lambda x: x > 2, numbers) 会筛选出 numbers 中大于2的元素。

14. 使用f-string格式化字符串

f-string 是一种新的字符串格式化方法,简洁易用。

name = "Alice"  
age = 25  
  
# 使用f-string格式化字符串  
message = f"{name} is {age} years old."  
  
print(message)  # 输出: Alice is 25 years old.  

解释: f"{name} is {age} years old." 直接在字符串中嵌入变量名,非常方便。

15. 使用try-except捕获异常

异常处理可以让程序更加健壮,避免因错误而崩溃。

try:  
    result = 10 / 0  
except ZeroDivisionError:  
    print("Cannot divide by zero!")  
  
# 输出: Cannot divide by zero!  

解释: try-except 结构可以捕获并处理特定类型的异常。

16. 使用*和**解包参数

解包参数可以让你更加灵活地传递参数给函数。

# 解包列表  
def add_many(*args):  
    return sum(args)  
  
nums = [1, 2, 3, 4, 5]  
result = add_many(*nums)  
  
print(result)  # 输出: 15  
  
# 解包字典  
def profile(**kwargs):  
    print(kwargs)  
  
details = {"name": "Alice", "age": 25}  
profile(**details)  
  
# 输出: {'name': 'Alice', 'age': 25}  

解释: *nums 解包列表;**details 解包字典。

17. 使用生成器节省内存

生成器是一种特殊的迭代器,可以按需生成数据,节省内存。

# 定义一个生成器函数  
def count_up_to(max):  
    count = 1  
    while count <= max:  
        yield count  
        count += 1  
  
# 使用生成器  
for number in count_up_to(5):  
    print(number)  
  
# 输出:  
# 1  
# 2  
# 3  
# 4  
# 5  

解释: yield 关键字使得函数成为一个生成器。

18. 使用@property装饰器实现属性访问

@property 装饰器可以让你像访问属性一样访问方法。

class Person:  
    def __init__(self, age):  
        self._age = age  
  
    @property  
    def age(self):  
        return self._age  
  
    @age.setter  
    def age(self, value):  
        if value < 0:  
            raise ValueError("Age cannot be negative!")  
        self._age = value  
  
p = Person(25)  
print(p.age)  # 输出: 25  
p.age = 30  
print(p.age)  # 输出: 30  

解释: @property 装饰器使得 age 方法可以像属性一样被访问和修改。

19. 使用上下文管理器

上下文管理器可以确保在特定上下文中执行特定的操作,并在完成后自动清理资源。除了 with 语句外,还可以使用 contextlib 模块中的 contextmanager 装饰器。

from contextlib import contextmanager  
  
@contextmanager  
def open_file(file_name, mode):  
    try:  
        f = open(file_name, mode)  
        yield f  
    finally:  
        f.close()  
  
# 使用上下文管理器打开文件  
with open_file('example.txt', 'r') as file:  
    content = file.read()  
  
print(content)  

解释: open_file 函数通过 @contextmanager 装饰器成为上下文管理器。在 with 语句中使用它可以确保文件在使用完毕后自动关闭。

20. 使用itertools模块简化迭代操作

itertools 模块提供了许多用于高效迭代的工具,例如 chainrepeatcombinations

import itertools  
  
# 将多个列表合并成一个  
list1 = [1, 2, 3]  
list2 = [4, 5, 6]  
  
merged = list(itertools.chain(list1, list2))  
  
print(merged)  # 输出: [1, 2, 3, 4, 5, 6]  
  
# 无限重复一个元素  
inf_repeated = itertools.repeat('A')  
  
# 获取前5个重复元素  
first_five = list(itertools.islice(inf_repeated, 5))  
  
print(first_five)  # 输出: ['A', 'A', 'A', 'A', 'A']  
  
# 获取所有组合  
combinations = list(itertools.combinations([1, 2, 3], 2))  
  
print(combinations)  # 输出: [(1, 2), (1, 3), (2, 3)]  

解释:

  • itertools.chain(list1, list2) 将多个列表合并成一个。

  • itertools.repeat('A') 无限重复 'A' 元素。

  • itertools.combinations([1, 2, 3], 2) 获取 [1, 2, 3] 中所有长度为2的组合。

21. 使用collections模块优化数据结构

collections 模块提供了许多高效的数据结构,如 Counterdefaultdictdeque

from collections import Counter, defaultdict, deque  
  
# 统计列表中元素出现的次数  
words = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']  
word_count = Counter(words)  
  
print(word_count)  # 输出: Counter({'apple': 3, 'banana': 2, 'orange': 1})  
  
# 使用默认值为0的字典  
d = defaultdict(int)  
d['a'] = 1  
d['b'] = 2  
print(d['a'])  # 输出: 1  
print(d['c'])  # 输出: 0  
  
# 使用双端队列  
queue = deque()  
queue.append(1)  
queue.append(2)  
queue.append(3)  
  
print(queue)  # 输出: deque([1, 2, 3])  
  
queue.popleft()  
print(queue)  # 输出: deque([2, 3])  

解释:

  • Counter(words) 统计列表中元素出现的次数。

  • defaultdict(int) 创建一个默认值为0的字典。

  • deque 创建一个双端队列,可以方便地进行插入和删除操作。

22. 使用functools模块简化函数操作

functools 模块提供了许多用于函数操作的工具,如 partiallru_cache

import functools  
  
# 部分函数  
def power(base, exponent):  
    return base ** exponent  
  
square = functools.partial(power, exponent=2)  
cube = functools.partial(power, exponent=3)  
  
print(square(4))  # 输出: 16  
print(cube(4))  # 输出: 64  
  
# 使用缓存装饰器  
@functools.lru_cache(maxsize=None)  
def fibonacci(n):  
    if n <= 1:  
        return n  
    return fibonacci(n - 1) + fibonacci(n - 2)  
  
print(fibonacci(30))  # 输出: 832040  

解释:

  • functools.partial(power, exponent=2) 创建一个部分函数 square

  • functools.partial(power, exponent=3) 创建一个部分函数 cube

  • @functools.lru_cache(maxsize=None) 装饰器缓存递归函数的结果,提高性能。

23. 使用multiprocessing模块实现多进程

multiprocessing 模块可以让你轻松实现多进程编程,提高程序的并发能力。

import multiprocessing  
  
def worker(num):  
    print(f"Worker {num}")  
  
if __name__ == "__main__":  
    jobs = []  
    for i in range(5):  
        p = multiprocessing.Process(target=worker, args=(i,))  
        jobs.append(p)  
        p.start()  
  
    for j in jobs:  
        j.join()  

解释:

  • multiprocessing.Process(target=worker, args=(i,)) 创建一个进程对象。

  • p.start() 启动进程。

  • j.join() 等待进程结束。

24. 使用asyncio模块实现异步编程

asyncio 模块支持异步编程,可以让你编写非阻塞的代码。

import asyncio  
  
async def my_coroutine():  
    print("Start")  
    await asyncio.sleep(1)  
    print("End")  
  
async def main():  
    task = asyncio.create_task(my_coroutine())  
    await task  
  
asyncio.run(main())  
  
# 输出:  
# Start  
# End  

解释:

  • async def my_coroutine(): 定义一个协程函数。

  • await asyncio.sleep(1) 模拟异步操作。

  • asyncio.run(main()) 运行主协程。

25. 使用logging模块记录日志

logging 模块可以让你方便地记录程序的日志信息。

import logging  
  
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')  
  
logging.debug('This is a debug message')  
logging.info('This is an info message')  
logging.warning('This is a warning message')  
logging.error('This is an error message')  
logging.critical('This is a critical message')  

解释:

  • logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') 设置日志级别和格式。

  • logging.debug, logging.info, logging.warning, logging.error, logging.critical 分别记录不同级别的日志信息。

26. 使用decorator模式增强函数功能

装饰器是一种常用的代码增强方式,可以不改变原有函数的情况下添加新功能。

def my_decorator(func):  
    def wrapper():  
        print("Something is happening before the function is called.")  
        func()  
        print("Something is happening after the function is called.")  
    return wrapper  
  
@my_decorator  
def say_hello():  
    print("Hello!")  
  
say_hello()  
  
# 输出:  
# Something is happening before the function is called.  
# Hello!  
# Something is happening after the function is called.  

解释:

  • @my_decorator 装饰器在原有函数前后添加额外的功能。

  • def wrapper(): 定义一个新的包装函数。

27. 使用type hinting增强代码可读性

类型提示可以让你的代码更具可读性和可维护性。

from typing import List, Tuple  
  
def greet(name: str) -> str:  
    return f"Hello, {name}!"  
  
def process_data(data: List[int]) -> Tuple[int, int]:  
    total = sum(data)  
    count = len(data)  
    return total, count  
  
print(greet("Alice"))  # 输出: Hello, Alice!  
print(process_data([1, 2, 3, 4, 5]))  # 输出: (15, 5)  

解释:

  • def greet(name: str) -> str: 指定函数的输入和输出类型。

  • def process_data(data: List[int]) -> Tuple[int, int]: 指定函数的输入和输出类型。

实战案例:自动化数据分析脚本

假设你需要编写一个脚本来处理一个CSV文件中的数据,统计其中的各项指标,并输出结果。我们可以使用上述技巧来实现这个任务。

import csv  
import statistics  
from collections import Counter  
from typing import List  
  
def read_csv(file_path: str) -> List[List[str]]:  
    with open(file_path, 'r') as file:  
        reader = csv.reader(file)  
        data = [row for row in reader]  
    return data  
  
def analyze_data(data: List[List[str]]) -> None:  
    # 提取第二列数据  
    values = [float(row[1]) for row in data[1:]]  
  
    # 计算平均值、中位数和众数  
    mean_value = statistics.mean(values)  
    median_value = statistics.median(values)  
    mode_value = statistics.mode(values)  
  
    # 统计各值出现的次数  
    value_counts = Counter(values)  
  
    print(f"Mean: {mean_value}")  
    print(f"Median: {median_value}")  
    print(f"Mode: {mode_value}")  
    print(f"Value Counts: {value_counts}")  
  
if __name__ == "__main__":  
    file_path = 'data.csv'  
    data = read_csv(file_path)  
    analyze_data(data)  

解释: 1. read_csv(file_path: str) -> List[List[str]]: 读取CSV文件并返回数据列表。 2. analyze_data(data: List[List[str]]) -> None: 分析数据并输出结果。 3. values = [float(row[1]) for row in data[1:]]: 提取第二列数据并转换为浮点数。 4. 使用 statistics.mean, statistics.median, statistics.mode 计算各项统计指标。 5. 使用 Counter(values) 统计各值出现的次数。

好了,今天的分享就到这里了,我们下期见。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值