一些让Python代码简洁的实用技巧总结


Posted in Python onAugust 23, 2021

前言

众所周知,编写Python代码在开始时十分容易,但随着你在工具包中添加更多的库,你的脚本可能会有不必要的代码行,变得冗长而混乱。可能短期内能够应付工作,但长期来看,麻烦不小。

在这篇文章中,我将与你分享7个技巧,使你在使用Python进行数据科学时更加简洁。这涵盖了我们日常所做的事情,例如修改Pandas数据框中的值,连接字符串,读取文件等操作!

1. 使用Lambda来修改Pandas数据框中的值

假设我们有以下df数据框:

data = [[1,2,3], [4,5,6], [7,8,9]]
df = pd.DataFrame(data, columns=[0,1,2])
IN[1]: print (df)
OUT[1]:    0  1  2
        0  1  2  3
        1  4  5  6
        2  7  8  9

现在由于某种原因,你需要在第0列的数字上添加01的值。一个常见的方法是定义一个函数来完成这个任务,然后用 apply 函数来修改一列的值。

def add_numbers(x):
    return f'{x}01'
df[0] = df[0].apply(add_numbers)
IN[1]: print (df)
OUT[1]:     0   1   2
        0  101  2   3
        1  401  5   6
        2  701  8   9

这并不复杂,但是在数据框中对每一个改变创建一个函数是不切实际的。这时lambda就派上了用场。

lambda函数类似于普通的Python函数,但它可以不使用名称来定义,这使得它成为一个漂亮的单行代码。之前使用的代码可以用以下方式来减少。

df[0] = df[0].apply(lambda x:f'{x}01')

当你不知道是否可以访问一个系列的属性来修改数据时,Lambda变得非常有用。

例如,列0包含字母,我们想把它们大写。

# 如果你知道.str的存在,你可以这样做
df[0] = df[0].str.title()
# 如果你不知道.str,你仍然可以用lambda大写
df[0] = df[0].apply(lambda x: x.title())

2. 使用f-string来连接字符串

字符串连接是Python中非常常见的操作,它可以用不同的方法来完成。最常见的方法是使用+运算符;然而,这个运算符的一个问题是我们不能在字符串之间添加任何分隔符。

当然,如果你想把 "Hello "和 "World "连接起来,一个典型的变通方法是添加一个空白分隔符(" ")。

print("Hello" + " " + "World")

这就完成了工作,但为了写出更可读的代码,我们可以用一个f-string来代替它。

IN[2]: print(f'{Hello} {World}')
OUT[2]: "Hello World"

在一个基本的例子中,这似乎是不必要的,但是当涉及到连接多个值时(正如你将在提示#3中看到的),f-string将使你免于书写多次+ " " +。我不知道过去有多少次不得不写+运算符,但现在不会了!

其他连接字符串的方法是使用join()方法或format()函数,然而f-string在字符串连接方面做得更好。

3. 用Zip()函数对多个列表进行迭代

你是否曾经想在 Python 中循环遍历一个以上的列表?当你有两个列表时,你可以用 enumerate 来实现。

teams = ['Barcelona', 'Bayern Munich', 'Chelsea']
leagues = ['La Liga', 'Bundesliga', 'Premiere League']
for i, team in enumerate(teams):
    league = leagues[i]
    print(f'{team} plays in {league}')

然而,当你有两个或更多的列表时,这变得不切实际。一个更好的方法是使用zip()函数。zip()函数接收迭代数据,将它们聚集在一个元组中,并返回之。

让我们再增加一个列表,看看zip()的威力!

teams = ['Barcelona', 'Bayern Munich', 'Chelsea']
leagues = ['La Liga', 'Bundesliga', 'Premiere League']
countries = ['Spain', 'Germany', 'UK']
for team, league, country in zip(teams, leagues, countries):
    print(f'{team} plays in {league}. Country: {country}')

上述代码的输出结果为:

Barcelona plays in La Liga. Country: Spain
Bayern Munich plays in Bundesliga. Country: Germany
Chelsea plays in Premiere League. Country: UK

此处你注意到我们在这个例子中使用了f-string吗?代码变得更有可读性,不是吗?

4. 使用列表理解法

清洗和处理数据的一个常见步骤是修改现有的列表。比如,我们有以下需要大写的列表:

words = ['california', 'florida', 'texas']

将words列表的每个元素大写的典型方法是创建一个新的大写列表,执行一次 for 循环,使用.title(),然后将每个修改的值附加到新的列表中。

capitalized = []
for word in words:
    capitalized.append(word.title())

然而,Pythonic的方法是使用列表理解来做到这一点。列表理解有一种优雅的方法来制作列表。

你可以用一行代码重写上面的for循环:

capitalized = [word.title() for word in words]

由此我们可以跳过第一个例子中的一些步骤,结果是一样的。

5. 对文件对象使用with语句

当在一个项目上工作时,我们经常会对文件进行读写操作。最常见的方法是使用open()函数打开一个文件,它会创建一个我们可以操作的文件对象,然后作为一个习惯的做法,我们应该使用close()关闭该文件对象。

f = open('dataset.txt', 'w')
f.write('new_data')
f.close()

这很容易记住,但有时写了几个小时的代码,我们可能会忘记用f.close()关闭f文件。这时,with语句就派上了用场。with语句将自动关闭文件对象f,形式如下:

with open('dataset.txt', 'w') as f:
    f.write('new_data')

有了这个,我们可以保持代码的简短。

你不需要用它来读取CSV文件,因为你可以用pandas的 pd.read_csv()轻松地读取,但在读取其他类型的文件时,这仍然很有用。例如,从pickle文件中读取数据时经常使用它。

import pickle 
# 从pickle文件中读取数据集
with open(‘test', ‘rb') as input:
    data = pickle.load(input)

6. 停止使用方括号来获取字典项, 利用.get()代替

比如,有以下一个字典:

person = {'name': 'John', 'age': 20}

我们可以通过person[name]和person[age]分别获得姓名和年龄。但是,由于某种原因,我们想获得一个不存在的键,如 "工资",运行person[salary]会引发一个`KeyError'。

这时,get()方法就有用了。如果键在字典中,get()方法返回指定键的值,但是如果没有找到键,Python 将返回None。得益于此,你的代码不会中断。

person = {'name': 'John', 'age': 20}
print('Name: ', person.get('name'))
print('Age: ', person.get('age'))
print('Salary: ', person.get('salary'))

输出结果如下:

Name:  John
Age:  20
Salary:  None

7. 多重赋值

你是否曾想减少用于创建多个变量、列表或字典的代码行数?那么,你可以用多重赋值轻松做到这一点。

# 原始操作
a = 1
b = 2
c = 3
# 替代操作
a, b, c = 1, 2, 3
# 代替在不同行中创建多个列表
data_1 = []
data_2 = []
data_3 = []
data_4 = []
# 可以在一行中创建它们的多重赋值
data_1, data_2, data_3, data_4 = [], [], [], []
# 或者使用列表理解法
data_1, data_2, data_3, data_4 = [[] for i in range(4)]

原文链接:

https://towardsdatascience.com/7-tips-to-level-up-your-python-code-for-data-science-4a64dbccd86d

总结

到此这篇关于让Python代码简洁的实用技巧的文章就介绍到这了,更多相关Python代码简洁技巧内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python3编写C/S网络程序实例教程
Aug 25 Python
在Python中使用列表生成式的教程
Apr 27 Python
Python的Twisted框架中使用Deferred对象来管理回调函数
May 25 Python
python实现字符串连接的三种方法及其效率、适用场景详解
Jan 13 Python
selenium2.0中常用的python函数汇总
Aug 05 Python
通过python扫描二维码/条形码并打印数据
Nov 14 Python
python 实现批量替换文本中的某部分内容
Dec 13 Python
基于python实现把json数据转换成Excel表格
May 07 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
Nov 18 Python
jupyter notebook远程访问不了的问题解决方法
Jan 11 Python
python中os.remove()用法及注意事项
Jan 31 Python
Python中文纠错的简单实现
Jul 07 Python
一篇文章搞懂python混乱的切换操作与优雅的推导式
Aug 23 #Python
Python学习开发之图形用户界面详解
Aug 23 #Python
利用Python读取微信朋友圈的多种方法总结
Aug 23 #Python
教你使用一行Python代码玩遍童年的小游戏
一文搞懂Python Sklearn库使用
python库sklearn常用操作
Aug 23 #Python
Python使用psutil库对系统数据进行采集监控的方法
Aug 23 #Python
You might like
PHP4和PHP5共存于一系统
2006/11/17 PHP
PHP数组传递是值传递而非引用传递概念纠正
2013/01/31 PHP
ThinkPHP中html:list标签用法分析
2016/01/09 PHP
PHP操作mysql数据库分表的方法
2016/06/09 PHP
Yii针对添加行的增删改查操作示例
2016/10/18 PHP
在Thinkphp中使用ajax实现无刷新分页的方法
2016/10/25 PHP
PHP+Ajax实现的无刷新分页功能详解【附demo源码下载】
2017/07/03 PHP
如何通过View::first使用Laravel Blade的动态模板详解
2017/09/21 PHP
PHP程序员必须知道的两种日志实例分析
2020/05/14 PHP
深入理解JavaScript作用域和作用域链
2011/10/21 Javascript
javascript检测对象中是否存在某个属性判断方法小结
2013/05/19 Javascript
基于jQuery实现的图片切换焦点图整理
2014/12/07 Javascript
使用javascript实现监控视频播放并打印日志
2015/01/05 Javascript
javascript中Function类型详解
2015/04/28 Javascript
jQuery插件windowScroll实现单屏滚动特效
2015/07/14 Javascript
JS获取当前脚本文件的绝对路径
2016/03/02 Javascript
很棒的js选项卡切换效果
2016/07/15 Javascript
javascript实现无法关闭的弹框
2016/11/27 Javascript
js 作用域和变量详解
2017/02/16 Javascript
JavaScript 中 apply 、call 的详解
2017/03/21 Javascript
收藏AngularJS中最重要的核心功能
2017/07/09 Javascript
JS深入学习之数组对象排序操作示例
2020/05/01 Javascript
vue动态加载SVG文件并修改节点数据的操作代码
2020/08/17 Javascript
Python3批量生成带logo的二维码方法
2019/06/24 Python
python绘制已知点的坐标的直线实例
2019/07/04 Python
详解使用Python下载文件的几种方法
2019/10/13 Python
python 将dicom图片转换成jpg图片的实例
2020/01/13 Python
Python如何将图像音视频等资源文件隐藏在代码中(小技巧)
2020/02/16 Python
英国Amara家居法国网站:家居装饰,现代装饰和豪华礼品
2016/12/15 全球购物
英国美发和美容产品商城:HQhair
2019/02/08 全球购物
考试没考好检讨书
2014/01/31 职场文书
《放小鸟》教学反思
2014/04/20 职场文书
暑期政治学习心得体会
2014/09/02 职场文书
婚礼伴郎致辞
2015/07/28 职场文书
PHP实现创建以太坊钱包转账等功能
2021/04/21 PHP
vue实现拖拽交换位置
2022/04/07 Vue.js