当前位置:首页 > 科技  > 软件

八个重构技巧使得Python代码更Pythonic

来源: 责编: 时间:2023-09-28 10:08:49 569观看
导读1.合并嵌套的if语句我们从简单的开始。不要像这样嵌套 if 语句,只需将它们合并为一个即可。if a: if b: pass# -> refactorif a and b: pass2.使用 any 而不是循环这里我们要检查列表中是否至少有一个正

1.合并嵌套的if语句

我们从简单的开始。不要像这样嵌套 if 语句,只需将它们合并为一个即可。FQj28资讯网——每日最新资讯28at.com

if a:    if b:        pass# -> refactorif a and b:    pass

2.使用 any 而不是循环

这里我们要检查列表中是否至少有一个正元素。更长的解决方案是遍历所有数字,检查当前数字,然后在条件为真时中断。但是对于这个任务,在 Python 中有一个专门的方法,即 any 函数。如果可迭代对象的任何元素为真,则 any 返回 True。这比手动循环要短得多,也更像 pythonic。FQj28资讯网——每日最新资讯28at.com

numbers = [-1, -2, -4, 0, 3, -7]has_positives = Falsefor n in numbers:    if n > 0:        has_positives = True        break# -> refactorhas_positives = any(n > 0 for n in numbers)

3.从 for/while 循环中提取语句

很多时候你会看到循环中定义了一个变量,但它永远不会改变。这些都是不必要的操作,所以把它从循环中拉出来,然后你只需要创建一次。FQj28资讯网——每日最新资讯28at.com

for building in buildings:    city = 'London'    addresses.append(building.street_address, city)# -> refactorcity = 'London'for building in buildings:    addresses.append(building.street_address, city)

4.去除只使用一次并立即返回的内联变量

很多时候你会看到代码在最后一个函数中定义了一个变量,一行之后它立即返回。如果清楚函数是干什么的,直接返回结果即可。这样更简洁并且避免了不必要的变量。但是,有时如果不是很清楚函数在做什么,它仍然会有帮助,然后您可以给最后一个变量一个有意义的名称并将其用作自文档代码。FQj28资讯网——每日最新资讯28at.com

def state_attributes(self):    """Return the state attributes."""    state_attr = {        ATTR_CODE_FORMAT: self.code_format,        ATTR_CHANGED_BY: self.changed_by,    }    return state_attr# -> refactordef state_attributes(self):    """Return the state attributes."""    return {        ATTR_CODE_FORMAT: self.code_format,        ATTR_CHANGED_BY: self.changed_by,    }

5.用if表达式替换if语句

不用 if else 语句来设置变量的值,你可以像这样用 if 表达式在一行中设置它。不过,这种重构技术有点值得商榷。有些人仍然喜欢第一个选项,这很好。FQj28资讯网——每日最新资讯28at.com

if condition:    x = 1else:    x = 2# -> refactorx = 1 if condition else 2

6.添加保护条款

查看此代码时,很难快速掌握正在发生的事情。有多个 if-else 语句和多个缩进。一旦你仔细观察,你可能会发现第一个 if 语句几乎覆盖了整个函数代码,只是在最后我们有相应的 else 子句,我们只返回 False。FQj28资讯网——每日最新资讯28at.com

我们可以把这个 else 子句移到最开始。这也称为警卫声明。所以如果条件不成立,我们就不会执行其余的函数代码。这样就去掉了一个 else 子句,现在整个代码中的缩进少了一层。这看起来更清晰,也更容易理解。FQj28资讯网——每日最新资讯28at.com

def should_i_wear_this_hat(self, hat):    if isinstance(hat, Hat):        current_fashion = get_fashion()        weather_outside = self.look_out_of_window()        is_stylish = self.evaluate_style(hat, current_fashion)        if weather_outside.is_raining:            print("Damn.")            return True        else:            print("Great.")            return is_stylish    else:        return False# -> refactordef should_i_wear_this_hat(self, hat):    if not isinstance(hat, Hat):        return False    current_fashion = get_fashion()    weather_outside = self.look_out_of_window()    is_stylish = self.evaluate_style(hat, current_fashion)    if weather_outside.is_raining:        print("Damn.")        return True    else:        print("Great.")        return is_stylish

7.将分配移近它们的用途

这是上一个示例的改进代码,但仍然需要一些时间才能理解这里发生的事情。所以我们想检查我们是否应该戴帽子。逻辑是这样的:如果正在下雨,我们总是说 True,如果没有下雨,如果帽子很时尚,我们就说 True。我们可以大大提高此逻辑的可读性的一种简单方法是将分配移至更接近其用法的位置。在使用 if 语句之前让我们先了解天气情况。现在 fashion 和 style 变量只在 else 子句中需要,所以将它们向下移动。现在应该更清楚发生了什么。FQj28资讯网——每日最新资讯28at.com

还记得我的第 4 条提示吗?我们可以进一步缩短代码并立即返回评估样式结果。然而,在这个例子中,我也喜欢 is_stylish 这个名字,因为它让你知道如果帽子很时尚,你就说 True,否则就说 False。所以这里把多余的变量留着就好了。FQj28资讯网——每日最新资讯28at.com

def should_i_wear_this_hat(self, hat):    if not isinstance(hat, Hat):        return False    current_fashion = get_fashion()    weather_outside = self.look_out_of_window()    is_stylish = self.evaluate_style(hat, current_fashion)    if weather_outside.is_raining:        print("Damn.")        return True    else:        print("Great.")        return is_stylish# -> refactordef should_i_wear_this_hat(self, hat):    if not isinstance(hat, Hat):        return False    weather_outside = self.look_out_of_window()    if weather_outside.is_raining:        print("Damn.")        return True    else:        print("Great.")        current_fashion = get_fashion()        return self.evaluate_style(hat, current_fashion)        # is_stylish = self.evaluate_style(hat, current_fashion)        # return is_stylish

8.简化序列检查

这是我经常看到的另一件事。当你需要检查集合中是否有元素时,例如在列表中,你不需要写if len(your_list) > 0. 你可以简单地说if your_list。这是 pep 8 推荐的方法,也称为真值测试。这是可能的,因为在 Python 中,空序列和集合的计算结果为 False。所以这可以应用于字符串、元组、列表、字典和集合。FQj28资讯网——每日最新资讯28at.com

if len(list_of_hats) > 0:    hat_to_wear = choose_hat(list_of_hats)# -> refactorif list_of_hats:    hat_to_wear = choose_hat(list_of_hats)

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-11875-0.html八个重构技巧使得Python代码更Pythonic

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 聊一聊Java 21,虚拟线程、结构化并发和作用域值

下一篇: C++循环优化:提升性能的关键技巧

标签:
  • 热门焦点
  • 俄罗斯:将审查iPhone等外国公司设备 保数据安全

    俄罗斯:将审查iPhone等外国公司设备 保数据安全

    iPhone和特斯拉都属于在各自领域领头羊的品牌,推出的产品也也都是数一数二的,但对于一些国家而言,它们的产品可靠性和安全性还是在限制范围内。近日,俄罗斯联邦通信、信息技术
  • 5月安卓手机好评榜:魅族20 Pro夺冠

    5月安卓手机好评榜:魅族20 Pro夺冠

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年5月1日至5月31日,仅限国内市场。第一名:魅族20 Pro好评率:97.50%不得不感慨魅族老品牌还
  • 三言两语说透设计模式的艺术-简单工厂模式

    三言两语说透设计模式的艺术-简单工厂模式

    一、写在前面工厂模式是最常见的一种创建型设计模式,通常说的工厂模式指的是工厂方法模式,是使用频率最高的工厂模式。简单工厂模式又称为静态工厂方法模式,不属于GoF 23种设计
  • 2023 年的 Node.js 生态系统

    2023 年的 Node.js 生态系统

    随着技术的不断演进和创新,Node.js 在 2023 年达到了一个新的高度。Node.js 拥有一个庞大的生态系统,可以帮助开发人员更快地实现复杂的应用。本文就来看看 Node.js 最新的生
  • 让我们一起聊聊文件的操作

    让我们一起聊聊文件的操作

    文件【1】文件是什么?文件是保存数据的地方,是数据源的一种,比如大家经常使用的word文档、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存数据,它既可以保
  • 破圈是B站头上的紧箍咒

    破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 消费结构调整丨巨头低价博弈,拼多多还卷得动吗?

    消费结构调整丨巨头低价博弈,拼多多还卷得动吗?

    来源:征探财经作者:陈香羽随着流量红利的退潮,电商的存量博弈越来越明显。曾经主攻中高端与品质的淘宝天猫、京东重拾“低价”口号。而过去与他们错位竞争的拼多多,靠
  • 东方甄选单飞:有些鸟注定是关不住的

    东方甄选单飞:有些鸟注定是关不住的

    文/彭宽鸿编辑/罗卿东方甄选创始人俞敏洪带队的“7天甘肃行”直播活动已在近日顺利收官。成立后一年多时间里,东方甄选要脱离抖音自立门户的传闻不绝于耳,“7
  • 2022爆款:ROG魔霸6 冰川散热系统持续护航

    2022爆款:ROG魔霸6 冰川散热系统持续护航

    喜逢开学季,各大商家开始推出自己的新产品,进行打折促销活动。对于忠实的端游爱好者来说,能够拥有一款梦寐以求的笔记本电脑是一件十分开心的事。但是现在的
Top
Baidu
map