一些让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 相关文章推荐
python实现通过代理服务器访问远程url的方法
Apr 29 Python
Python实现简单截取中文字符串的方法
Jun 15 Python
Python实现监控程序执行时间并将其写入日志的方法
Jun 30 Python
python3操作mysql数据库的方法
Jun 23 Python
pytorch 数据集图片显示方法
Jul 26 Python
Python中分支语句与循环语句实例详解
Sep 13 Python
详解通过API管理或定制开发ECS实例
Sep 30 Python
Python实现 PS 图像调整中的亮度调整
Jun 28 Python
python输出第n个默尼森数的实现示例
Mar 08 Python
对python中各个response的使用说明
Mar 28 Python
python 装饰器的基本使用
Jan 13 Python
python 进阶学习之python装饰器小结
Sep 04 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
PHP跨时区(UTC时间)应用解决方案
2013/01/11 PHP
php 判断字符串中是否包含html标签
2014/02/17 PHP
php异常处理方法实例汇总
2015/06/24 PHP
symfony2.4的twig中date用法分析
2016/03/18 PHP
PHP实现的下载远程文件类定义与用法示例
2017/07/05 PHP
PHP 面向对象程序设计之类属性与类常量实现方法分析
2020/04/13 PHP
解决jquery插件冲突的问题
2014/01/23 Javascript
举例简介AngularJS的内部语言环境
2015/06/17 Javascript
jquery实现的Accordion折叠面板效果代码
2015/09/02 Javascript
JS实现简单的右下角弹出提示窗口完整实例
2016/06/21 Javascript
jQuery实现微信长按识别二维码功能
2016/08/26 Javascript
Jquery Easyui验证组件ValidateBox使用详解(20)
2016/12/18 Javascript
javascript 中iframe高度自适应(同域)实例详解
2017/05/16 Javascript
Vue form表单动态添加组件实战案例
2019/09/02 Javascript
使用vue实现一个电子签名组件的示例代码
2020/01/06 Javascript
Jquery滑动门/tab切换实现方法完整示例
2020/06/05 jQuery
vue使用axios实现excel文件下载的功能
2020/07/16 Javascript
一键搞定python连接mysql驱动有关问题(windows版本)
2016/04/23 Python
Python提取Linux内核源代码的目录结构实现方法
2016/06/24 Python
python如何拆分含有多种分隔符的字符串
2018/03/20 Python
详解python使用pip安装第三方库(工具包)速度慢、超时、失败的解决方案
2018/12/02 Python
win10系统Anaconda和Pycharm的Tensorflow2.0之CPU和GPU版本安装教程
2019/12/03 Python
Python 读取 YUV(NV12) 视频文件实例
2019/12/09 Python
python用Tkinter做自己的中文代码编辑器
2020/09/07 Python
使用css3实现的tab选项卡代码分享
2014/12/09 HTML / CSS
一款基于css3麻将筛子3D翻转特效的实例教程
2014/12/31 HTML / CSS
css3中仿放大镜效果的几种方式原理解析
2020/12/03 HTML / CSS
用你熟悉的语言写一个连接ORACLE数据库的程序,能够完成修改和查询工作
2012/06/11 面试题
门卫岗位职责
2013/11/15 职场文书
教师年度考核自我鉴定
2014/01/19 职场文书
上班上网检讨书
2014/01/29 职场文书
农贸市场管理制度
2014/01/31 职场文书
2014年外联部工作总结
2014/11/17 职场文书
2015年教师教学工作总结
2015/04/28 职场文书
Python 解决空列表.append() 输出为None的问题
2021/05/23 Python
Python实现数据的序列化操作详解
2022/07/07 Python