您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

你的代码“balance”怎么样?找到简洁性和可读性的平衡点

时间:2020-06-26 12:18:31  来源:  作者:

 

你的代码“balance”怎么样?找到简洁性和可读性的平衡点

图源:unsplash

Python对初学者非常友好,许多人在开始学习编程时都会选择Python。简单易上手是你接触它之后发现的第一个优点。进一步了解之后,你可能会被它的灵活性所吸引——可通过各种方式做同一功能。

事实上,还有更便捷的解决方案。代码越简洁,可读性越高且能够长期存在。用Python编写简洁代码的方法有很多,本文想与大家分享笔者在日常Python项目中发现的特别有用的五个技巧。

你的代码“balance”怎么样?找到简洁性和可读性的平衡点

 

1.列表、字典和集合推导式

列表推导式是众多Python程序员最喜欢的特征之一。这是一种从迭代器创建列表的简洁方法。基本语法是[expression for x in iterable]。可以看一些示例进一步了解其用法:

>>># Create a list for subsequentoperations
          >>> numbers = [1, 2, 3, 4, 5, 6]
          >>>
>>># Typical way to create a list consisting of squares
          >>> squares0 = []
          >>>for number in numbers:
          ...     squares0.Append(number*number)
          ...
          >>># List comprehensions
          >>> squares1 = [number*number for number in numbers]

在不使用列表推导式的情况下,必须创建一个空列表,并通过运行for循环来添加每个数字的平方,这通常需要三行代码。使用列别推导式后,只需一行代码即可构建相同的平方列表。

除了列表推导式,还有字典和集合推导式。字典推导式有该基本语法 {key_expr:value_expr for x in iterable},集合推导式的基本语法是 {expressionfor x in iterable}。与列表推导式示例类似,不使用推导式的情况下,需要多行代码来构建所需的字典和集合。

>>># Dictionary comprehension
             >>> squares_dict = {number: number*number for number in numbers}
             >>> squares_dict
             {1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36}
             >>>
>>># Set comprehension
             >>> numbers_dups = [1, 2, 3, 4, 3, 2, 1]
             >>> squares_set = {number*number for number in numbers_dups}
             >>> squares_set
             {16, 1, 4, 9}
你的代码“balance”怎么样?找到简洁性和可读性的平衡点

 

2.Lambda函数

Lambda函数是Python中的匿名函数,通常用于小规模操作。Lambda函数可以接受一到多个参数,只需一个表达式,其语法为lambda parameters:expression。

你的代码“balance”怎么样?找到简洁性和可读性的平衡点

图源:pixabay

笔者将使用内置sorted()函数演示lambda函数的用法。具体而言,sorted()函数会使用key函数对迭代进行排序,该函数由key参数指定。我们可以将lambda函数作为key参数,而不是用def关键字声明常规函数。

>>># Create a list of students with theirgrading information
           >>> grades = [{'name': 'John', 'grade': 95}, {'name': 'Aaron', 'grade': 92}, {'name': 'Jennifer', 'grade': 100}]
           >>>
>>># Sort using a regular function
           >>>defsort_grade(student):
           ...     return student['grade']
           ...
           >>>sorted(grades, key=sort_grade)
           [{'name': 'Aaron', 'grade': 92}, {'name': 'John', 'grade': 95}, {'name': 'Jennifer', 'grade': 100}]
           >>>
>>># Sort using a lambda
           >>>sorted(grades, key=lambda x: x['grade'])
           [{'name': 'Aaron', 'grade': 92}, {'name': 'John', 'grade': 95}, {'name': 'Jennifer', 'grade': 100}]

如上所示,使用lambda函数可以编写出更简洁的调用sorted()函数的命令。在使用正则表达式之前,必须先声明该函数,然后才能使用sorted()函数,这一定比直接使用lambda函数更繁琐。

你的代码“balance”怎么样?找到简洁性和可读性的平衡点

 

3.命名元组作数据结构

元组可以存储一些相关数据,但是使用起来并不顺手,特别是涉及特定元素时,必须记住顺序并使用特定元素的正确索引。如果不想使用元组,虽然可以构建一个自定义类来管理相关数据,但namedtuple数据类型是一种非常有用的轻量级数据结构。

通过集合模块,namedtuple数据类型采用以下基本语法:namedtuple(Typename,field_names)。语法并不直截了当,不过从概念上来说是容易理解的。

来看看示例。理想的特性是创建一个可以存储学生信息的数据结构,包括姓名、性别和学生ID号。

>>># Use a custom class
      >>>classStudent0:
      ...     def__init__(self, name, gender, student_id):
      ...         self.name = name
      ...         self.gender = gender
      ...         self.student_id = student_id
      ...
      >>> s0 =Student0('John', 'M', 2020001)
      >>>f"Name: {s0.name}; Gender: {s0.gender}; ID #: {s0.student_id}"
      'Name: John; Gender: M; ID #: 2020001'
      >>>
>>># Use the namedtuple
      >>>from collections import namedtuple
      >>>Student1=namedtuple("Student1", ["name", "gender", "student_id"])
      >>> s1 =Student1('Jennifer', 'F', 2020002)
      >>>f"Name: {s1.name}; Gender: {s1.gender}; ID #: {s1.student_id}"
      'Name: Jennifer; Gender: F; ID #:2020002'

使用namedtuple模块,可以用更简洁的代码编写轻量级数据结构。当然,请注意,自定义类提供了更多可以操作的功能。但如果只是为了存储和检索数据而创建一个数据结构,完全可以考虑使用namedtuple模块。

你的代码“balance”怎么样?找到简洁性和可读性的平衡点

图源:unsplash


你的代码“balance”怎么样?找到简洁性和可读性的平衡点

 

4.使用enumerate()和zip()进行迭代

编码的一个关键原则是精简。当处理一系列数据(如数字列表)时,通常需要对列表中的每个数字执行相同的操作。为了避免重复相同的代码,可以使用for循环loop来运行整个列表的迭代。

当迭代一个列表或任何序列时,有时还需要知道该项在序列中的位置。下面几种方法可以做到这一点。

>>># Create a list of students based ontheir arrival sequence
        >>> students = ['John', 'Aaron', 'Jennifer', 'Ashley']
        >>>
>>># Lengthy way
        >>>for index inrange(len(students)):
        ...     student = students[index]
        ...     print(f"Arrival # {index+1}: {student}")
        ...
        Arrival# 1: John
        Arrival# 2: Aaron
        Arrival# 3: Jennifer
        Arrival# 4: Ashley
        >>>
>>># Concise way
        >>>for index, student inenumerate(students, 1):
        ...     print(f"Arrival # {index}: {student}")
        ...
        Arrival# 1: John
        Arrival# 2: Aaron
        Arrival# 3: Jennifer
        Arrival# 4: Ashley

通过使用内置函数enumerate(),可以轻松访问序列中的索引和元素,这比第一次迭代更简洁。更重要的是,它可以设置开始计数的数字。在上面的示例中设置为了1。

除了enumerate()函数,zip()函数在迭代中也颇为有用。此函数可以从多个迭代中创建元组,而无需特意为这些迭代创建复合迭代。

>>># Create two lists for zip(), with oneto one match
      >>> names = ['John', 'Danny', 'Jennifer']
      >>> scores = [95, 99, 100]
      >>>
>>># Lengthy way
      >>>for index inrange(len(names)):
      ...     name, score = names[index], scores[index]
      ...     print(f"Name: {name}; Score: {score}")
      ...
      Name: John; Score: 95
      Name: Danny; Score: 99
      Name: Jennifer; Score: 100
      >>>
>>># Concise way
      >>>for name, score inzip(names, scores):
      ...     print(f"Name: {name}; Score: {score}")
      ...
      Name: John; Score: 95
      Name: Danny; Score: 99
      Name: Jennifer; Score: 100

基本上,zip()函数所做的就是从迭代中获取每个元素,以便在每次迭代中形成一个有顺序的元组。这样一来代码会更简洁,可读性也更高。

你的代码“balance”怎么样?找到简洁性和可读性的平衡点

图源:unsplash


你的代码“balance”怎么样?找到简洁性和可读性的平衡点

 

5.f字符串格式化

字符串太基础了,我们基本上在哪都会用它。字符串的一个基本应用是与某些格式一并使用。有几种格式化字符串的方法,笔者想介绍的是f字符串,这个方法非常简单。

f字符串是使用字母f(或F)作为字符串文本的前缀插入的字符串文本。为了编写简洁的代码,下面两个用例首选f字符串:

· 显示变量。最基本的用法是显示一些变量的值,以便在开发过程中进行调试。如果使用传统的format()方法,代码会偏长。

>>># Construct a list for formatting/debugging
                            >>> prime_numbers = [2, 3, 5, 7, 11]
                            >>>
>>># Show the list using format
                            >>>print("Prime Numbers: {}".format(prime_numbers))
                            PrimeNumbers: [2, 3, 5, 7, 11]
                            >>>
>>># Show the list using f-string
                            >>>print(f"Prime Numbers: {prime_numbers}")
                            PrimeNumbers: [2, 3, 5, 7, 11]

· 加入变量/连接字符串。f字符串不是使用+和字符串的join()方法,而是非常直接地用于字符串连接,并且它们具有最高的可读性。在实际操作中可用于构造文件路径,如下所示:

>>># The folder and extension
                 >>> folder ='./usr/images'
                 >>> ext ='.jpg'
                 >>>
>>># File name is computed from this list
                 >>> names = [10, 11, 12]
                 >>>
>>># Construct File paths
                 >>># Use + for concatenation
                 >>> paths0 = [folder +'/'+str(x) + ext for x in names]
                 >>>
>>># Use join()
                 >>> paths1 = [''.join([folder, '/', str(x), ext]) for x in names]
                 >>>
>>># Use f strings
                 >>> paths2 = [f"{folder}/{x}{ext}"for x in names]
你的代码“balance”怎么样?找到简洁性和可读性的平衡点

图源:pixabay

编写越简短,代码的可读性和可维护性就会得到实际的提高,这是亘古不变的真理。但请记住,简洁的代码不应该带来任何潜在的歧义或混淆。

你必须在简洁性和可读性之间寻求平衡点。一旦发生冲突,首先考虑可读性,哪怕这会需要更多的代码。

 

 



Tags:代码   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
前言几乎所有.NET序列化程序的实现基础都是反射。下列代码是Newtonsoft.Json的实现:protectedvirtualJsonPropertyCreateProperty(MemberInfomember,MemberSerializationmemb...【详细内容】
2021-12-28  Tags: 代码  点击:(2)  评论:(0)  加入收藏
在SEO优化中,最重要的评估之一就是确定网站上存在哪些HTTP状态代码。这些代码可能会变得很复杂,成为一个难题,必须先解决这些难题,然后才能完成其他任务。例如,如果你放置的页面...【详细内容】
2021-12-24  Tags: 代码  点击:(5)  评论:(0)  加入收藏
1、通过条件判断给变量赋值布尔值的正确姿势// badif (a === 'a') { b = true} else { b = false}// goodb = a === 'a'2、在if中判断数组长度不为零...【详细内容】
2021-12-24  Tags: 代码  点击:(6)  评论:(0)  加入收藏
前言本文提供将视频调整分辨率的Python代码,一如既往的实用主义。环境依赖ffmpeg环境安装,可以参考我的另一篇文章: windows ffmpeg安装部署_阿良的博客-CSDN博客ffmpy安装:pip...【详细内容】
2021-12-14  Tags: 代码  点击:(15)  评论:(0)  加入收藏
大家好, 我是林路,今天就给大家介绍Python代码都是用的什么编辑器写的?Jupyter Notebook ,没有Pycharm,没有Vscode,没有Sublime text。 只有一款工具:Jupyter Notebook 。工欲善其...【详细内容】
2021-12-09  Tags: 代码  点击:(27)  评论:(0)  加入收藏
在这篇文章中,我将与你分享一些关于JS的技巧,可以提高你的JS技能。1.避免if过长如果判断值满足多个条件,我们可能会这么写:if (value === 'a' || value === 'b'...【详细内容】
2021-11-17  Tags: 代码  点击:(22)  评论:(0)  加入收藏
一、为什么需要使用内存池在C/C++中我们通常使用malloc,free或new,delete来动态分配内存。一方面,因为这些函数涉及到了系统调用,所以频繁的调用必然会导致程序性能的损耗;另一...【详细内容】
2021-11-17  Tags: 代码  点击:(38)  评论:(0)  加入收藏
《开源精选》是我们分享Github、Gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐的是一个由百度开源的低代码前端框架——amis...【详细内容】
2021-11-05  Tags: 代码  点击:(68)  评论:(0)  加入收藏
程序员是青春饭,这在国内似乎是公认的。所以很多公司不愿招大龄程序员,很多程序员也“知趣”地及早转型。有的做管理,有的做架构,我还见过改行卖保险的。总之,年龄大了不想敲代码...【详细内容】
2021-10-27  Tags: 代码  点击:(30)  评论:(0)  加入收藏
我们来看看我们拨号键盘除了能打电话还能干什么iphone 的拨号键盘除了用来拨号,其实暗藏代码输入星井06井可以查询手机真实的IMEI码,这个码是独一无二的没有双胞胎 输入星3001...【详细内容】
2021-10-25  Tags: 代码  点击:(78)  评论:(0)  加入收藏
▌简易百科推荐
本文分为三个等级自顶向下地分析了glibc中内存分配与回收的过程。本文不过度关注细节,因此只是分别从arena层次、bin层次、chunk层次进行图解,而不涉及有关指针的具体操作。前...【详细内容】
2021-12-28  linux技术栈    Tags:glibc   点击:(3)  评论:(0)  加入收藏
摘 要 (OF作品展示)OF之前介绍了用python实现数据可视化、数据分析及一些小项目,但基本都是后端的知识。想要做一个好看的可视化大屏,我们还要学一些前端的知识(vue),网上有很多比...【详细内容】
2021-12-27  项目与数据管理    Tags:Vue   点击:(2)  评论:(0)  加入收藏
程序是如何被执行的  程序是如何被执行的?许多开发者可能也没法回答这个问题,大多数人更注重的是如何编写程序,却不会太注意编写好的程序是如何被运行,这并不是一个好...【详细内容】
2021-12-23  IT学习日记    Tags:程序   点击:(9)  评论:(0)  加入收藏
阅读收获✔️1. 了解单点登录实现原理✔️2. 掌握快速使用xxl-sso接入单点登录功能一、早期的多系统登录解决方案 单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器...【详细内容】
2021-12-23  程序yuan    Tags:单点登录(   点击:(8)  评论:(0)  加入收藏
下载Eclipse RCP IDE如果你电脑上还没有安装Eclipse,那么请到这里下载对应版本的软件进行安装。具体的安装步骤就不在这赘述了。创建第一个标准Eclipse RCP应用(总共分为六步)1...【详细内容】
2021-12-22  阿福ChrisYuan    Tags:RCP应用   点击:(7)  评论:(0)  加入收藏
今天想简单聊一聊 Token 的 Value Capture,就是币的价值问题。首先说明啊,这个话题包含的内容非常之光,Token 的经济学设计也可以包含诸多问题,所以几乎不可能把这个问题说的清...【详细内容】
2021-12-21  唐少华TSH    Tags:Token   点击:(10)  评论:(0)  加入收藏
实现效果:假如有10条数据,分组展示,默认在当前页面展示4个,点击换一批,从第5个开始继续展示,到最后一组,再重新返回到第一组 data() { return { qList: [], //处理后...【详细内容】
2021-12-17  Mason程    Tags:VUE   点击:(14)  评论:(0)  加入收藏
什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How) 硬件配...【详细内容】
2021-12-16  软件测试小p    Tags:性能调优   点击:(20)  评论:(0)  加入收藏
Tasker 是一款适用于 Android 设备的高级自动化应用,它可以通过脚本让重复性的操作自动运行,提高效率。 不知道从哪里听说的抖音 app 会导致 OLED 屏幕烧屏。于是就现学现卖,自...【详细内容】
2021-12-15  ITBang    Tags:抖音防烧屏   点击:(25)  评论:(0)  加入收藏
11 月 23 日,Rust Moderation Team(审核团队)在 GitHub 上发布了辞职公告,即刻生效。根据公告,审核团队集体辞职是为了抗议 Rust 核心团队(Core team)在执行社区行为准则和标准上...【详细内容】
2021-12-15  InfoQ    Tags:Rust   点击:(25)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条