如何激怒一位Python爱好者?

简介: 如何激怒一位Python爱好者?

写代码不那么pythonic风格的,多多少少都会让人有点难受。

什么是pythonic呢?简而言之,这是一种写代码时遵守的规范,主打简洁、清晰、可读性高,符合PEP 8(Python代码样式指南)约定的模式。

Python社区发展几十年,已经沉淀出一套更加科学规范的代码书写法则,该踩的坑都帮你踩过了,按这个来基本不会出什么错。

下面举几个不那么pythonic的代码案例,虽然不会出错,但十分不建议这样写。

1、函数、变量命名无意义、不规范

很多人图省事,使用a、aa、bbb这样无意义的变量名、函数名,这样在编程中会大大降低代码的可读性,也影响代码质量。

def a(revenue, cost):  
    """  
    计算销售利润率。  
    :param revenue: 销售额(或总收入)  
    :param cost: 成本  
    :return: 销售利润率(以百分比表示)  
    """  
    if revenue <= 0 or cost < 0:  
        return "错误:销售额必须大于0,成本不能为负数。"  
    aa = revenue - cost  
    bbb = (aa / revenue) * 100  
    return bbb

更有初学者使用中文来作为变量名,虽然在语法上是允许的,但会引起歧义,不符合代码规范

年龄 = 30
名字 = "张三"
print("{}的年龄是{}".format(名字,年龄))

2、不善于使用函数和类,重复写代码

Python是鼓励用函数和类去封装一些重复用的功能,这样能增加代码的可读性,也减少不必要的劳动,但一些人就是喜欢写很长的代码,导致看着很冗余。

在Python中大家可以把一个复杂的功能,用多个函数去分解,一个函数代码行数最好不要超过十行,如果确实需要很多代码,那就进行分解,多写几个函数来实现。

比如以下的函数,用来实现csv文件的读取、行去重、空值剔除、保存等功能。

import csv  
def process_csv(input_file, output_file):  
    """  
    读取CSV文件,去重,剔除空值,并保存到新文件。  
    :param input_file: 输入的CSV文件路径  
    :param output_file: 输出的CSV文件路径  
    """  
    # 读取CSV文件  
    with open(input_file, mode='r', newline='', encoding='utf-8') as file:  
        reader = csv.reader(file)  
        rows = [row for row in reader if row]  # 剔除空行  
    # 去重  
    unique_rows = []  
    for row in rows:  
        # 将行转换为元组以用于集合去重  
        unique_rows.append(tuple(row))  
    # 剔除空值  
    processed_rows = [[cell for cell in row if cell] for row in unique_rows]  
    # 转换回列表以写入CSV文件  
    processed_rows = [[str(cell) for cell in row] for row in processed_rows]  
    # 写入新的CSV文件  
    with open(output_file, mode='w', newline='', encoding='utf-8') as file:  
        writer = csv.writer(file)  
        writer.writerows(processed_rows)

当你看到这个函数,是不是觉得有点冗长,一个函数实现了四个功能,不易阅读也不利于重复利用。

如果把它拆分成四段函数,分别实现读取、行去重、空值剔除、保存这四个功能,就会更加清晰。

import csv  
def read_csv(file_path):  
    """  
    读取CSV文件并返回行的列表。  
    :param file_path: CSV文件路径  
    :return: CSV文件行的列表  
    """  
    with open(file_path, mode='r', newline='', encoding='utf-8') as file:  
        reader = csv.reader(file)  
        return [row for row in reader if row]  # 剔除空行  
def remove_duplicates(rows):  
    """  
    去除行列表中的重复行。  
    :param rows: 行的列表  
    :return: 去重后的行列表  
    """  
    return list(set(tuple(row) for row in rows))  
def remove_empty_values(rows):  
    """  
    从行列表中剔除含有空值的行。  
    :param rows: 行的列表  
    :return: 剔除空值后的行列表  
    """  
    return [[cell for cell in row if cell] for row in rows]  
def write_csv(file_path, rows):  
    """  
    将行列表写入CSV文件。  
    :param file_path: CSV文件路径  
    :param rows: 要写入的行列表  
    """  
    with open(file_path, mode='w', newline='', encoding='utf-8') as file:  
        writer = csv.writer(file)  
        writer.writerows(rows)

3、使用很复杂的列表推导式,较难阅读

列表推导式可以简化列表的创建,既实用还能让代码更加美观,但列表推导式只适合创建逻辑简单的列表,对于很复杂且代码量大的列表,是不建议用列表推导式的,比如以下案例。

nested_list = [[(i * j, i + j, i - j) for j in range(1, 4)] for i in range(5, 10)]

改成如下循环函数是否更好?

def generate_nested_list(start_i, end_i):  
    nested_list = []  
    for i in range(start_i, end_i):  
        sublist = []  
        for j in range(1, 4):  
            sublist.append((i * j, i + j, i - j))  
        nested_list.append(sublist)  
    return nested_list

4、代码行特别长,也很难阅读

一般Python代码行长度最好不要超过79,vscode和pycharm等编辑器里都有代码长度指引线,写代码时遇到它就是提示你要换行了。

连续代码(一行代码很长,需要分在多行写)中被裹着的代码(可能被 (), [], {} 包裹)应该垂直(左)对齐。

def long_function_name(
        var_one, var_two, var_three,
        var_four):
    print(var_one)

其实还有很多pythonic风格的规范,需要大家注意,建议按照约定俗成的方法去写,第一原则是可读性强,可读性强,可读性强。

相关文章
|
6月前
|
传感器 JavaScript 物联网
盘点30个Python树莓派源码Python爱好者不容错过
盘点30个Python树莓派源码Python爱好者不容错过
150 1
盘点30个Python树莓派源码Python爱好者不容错过
|
6月前
|
数据采集 监控 前端开发
盘点49个Python网站项目Python爱好者不容错过
盘点49个Python网站项目Python爱好者不容错过
51 3
|
6月前
|
数据采集 前端开发 搜索推荐
盘点72个Python网站项目Python爱好者不容错过
盘点72个Python网站项目Python爱好者不容错过
258 0
|
6月前
|
数据采集 机器学习/深度学习 设计模式
盘点35个Python书籍Python爱好者不容错过
盘点35个Python书籍Python爱好者不容错过
68 0
盘点35个Python书籍Python爱好者不容错过
|
6月前
|
数据采集 前端开发 JavaScript
盘点63个Python登录第三方源码Python爱好者不容错过
盘点63个Python登录第三方源码Python爱好者不容错过
110 0
|
6月前
|
监控 安全 测试技术
盘点54个Python实用工具源码Python爱好者不容错过
盘点54个Python实用工具源码Python爱好者不容错过
90 0
|
6月前
|
运维 Kubernetes 监控
盘点60个Python各行各业管理系统源码Python爱好者不容错过
盘点60个Python各行各业管理系统源码Python爱好者不容错过
87 0
|
6月前
|
数据采集 自然语言处理 搜索推荐
盘点52个Python各行各业管理系统源码Python爱好者不容错过
盘点52个Python各行各业管理系统源码Python爱好者不容错过
71 0
|
6月前
|
监控 搜索推荐 关系型数据库
盘点73个Python各行各业管理系统源码Python爱好者不容错过
盘点73个Python各行各业管理系统源码Python爱好者不容错过
105 0
|
6月前
|
数据采集 前端开发 关系型数据库
盘点60个Python网站项目Python爱好者不容错过
盘点60个Python网站项目Python爱好者不容错过
131 0