前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python那些熟悉又陌生的函数,每次看别人用得很溜,自己却不行?

Python那些熟悉又陌生的函数,每次看别人用得很溜,自己却不行?

作者头像
HuangWeiAI
发布2019-12-25 17:06:48
1.3K0
发布2019-12-25 17:06:48
举报
文章被收录于专栏:浊酒清味

前言

如果您曾经发现自己在编程时一次又一次地查找相同的问题、概念或语法,那么您并不孤单。我发现自己经常这样做。我们生活在一个世界里,似乎有无限数量的可访问的。然而,这既是福也是祸。如果没有有效地管理,过度依赖这些资源会养成坏习惯,让你长期停滞不前。

就我个人而言,我发现自己多次在网上查询同一个函数,而不是花时间去学习和巩固这个概念。这种方法是懒惰的,虽然它可能是短期内阻力最小的方法,但它最终会损害您的成长、生产力的能力。

一行代码创建列表

每次需要定义某种列表时都要编写一个for循环,这是一件乏味的事情,幸运的是Python有一种内置的方法可以在一行代码中解决这个问题。语法可能有点难理解,但是一旦您熟悉了这种技术,就会经常用到它。

代码语言:javascript
复制
x = [1,2,3,4]
out = []
for item in x:
    out.append(item**2)
print(out)
代码语言:javascript
复制
x = [1,2,3,4]
out = [item**2 for item in x]
print(out)

请参阅上面两段代码示例,了解您通常如何使用for循环进行列表理解,以及如何使用一行简单的代码创建列表,而不需要使用循环。

lambda函数

曾经厌倦为有限的用例创建一个又一个函数吗?Lambda函数来拯救!Lambda函数用于在Python中创建小型的、一次性的和匿名的函数对象。基本上,它们让你创建一个函数,而不是创建一个函数。

lambda函数的基本语法是:

代码语言:javascript
复制
lambda arguments: expression

注意,lambda函数可以完成常规函数所能完成的所有工作,只要有一个表达式即可。查看下面的简单例子和即将到来的视频,以更好地感受lambda函数的强大功能:

代码语言:javascript
复制
double = lambda x: x * 2
print(double(5))

Map和Filter

一旦您掌握了lambda函数,学习将它们与映射和筛选函数配对可能是一个强大的工具。具体来说,map接受一个列表,并通过对每个元素执行某种操作将其转换为一个新列表。在本例中,它遍历每个元素并将自身的结果乘以2映射到一个新列表。注意,list函数只是将输出转换为list类型。

代码语言:javascript
复制
# Map
seq = [1, 2, 3, 4, 5]
result = list(map(lambda var: var*2, seq))
print(result)

filter函数接受一个列表和一个规则,很像map,但是它通过将每个元素与布尔过滤规则进行比较来返回原始列表的一个子集。

代码语言:javascript
复制
# Filter
seq = [1, 2, 3, 4, 5]
result = list(filter(lambda x: x > 2, seq))
print(result)

arange 和 Linspace

要创建快速、简单的Numpy数组,只需使用arange和linspace函数。每个数组都有其特定的用途,但是这里的吸引力(而不是使用range)是它们输出NumPy数组,这对于数据科学来说通常更容易使用。

Arange返回给定间隔内的均匀间隔值。除了起始点和停止点之外,还可以根据需要定义步长或数据类型。注意,停止点是一个“截止”值,因此它不会包含在数组输出中。

代码语言:javascript
复制
# np.arange(start, stop, step)
np.arange(3, 7, 2)

Linspace与之非常相似,但略有不同。Linspace返回在指定间隔内均匀间隔的数字。因此,给定一个起始点和停止点,以及一些值,linspace将在NumPy数组中为您均匀地分隔它们。这对于绘图时的数据可视化和轴声明特别有用。

代码语言:javascript
复制
# np.linspace(start, stop, num)
np.linspace(2.0, 3.0, num=5)

Axis真正含义是什么

当您在pandas中删除一列或在NumPy矩阵中添加值时,可能会遇到这种情况。如果不是,那么你一定会在某个时候。现在让我们以删除一个列为例:

代码语言:javascript
复制
df.drop('Row A', axis=0)
df.drop('Column A', axis=1)

我不知道我写了多少次这行代码,直到我真正知道为什么我要声明轴是什么。根据上面的推导,如果要处理列,可以将轴设置为1,如果要处理行,可以将轴设置为0。但这是为什么呢?我最喜欢的理由,或者至少我是怎么记得的:

代码语言:javascript
复制
df.shape
(# of Rows, # of Columns)

从pandas dataframe调用shape属性将返回一个tuple,其中第一个值表示行数,第二个值表示列数。如果您考虑一下如何在Python中对其进行索引,行是0,列是1,这与我们声明axis值的方式非常相似。疯狂的,对吗?

zip函数

zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。

zip的语法:

代码语言:javascript
复制
zip([iterable, ...])

举例:

代码语言:javascript
复制
a = [1,2,3]
b = [4,5,6]
c = [4,5,6,7,8]

zipped = zip(a,b) # 打包为元组的列表
# 输出 [(1, 4), (2, 5), (3, 6)]

zip(a,c) # 元素个数与最短的列表一致
# 输出 [(1, 4), (2, 5), (3, 6)]

zip(*zipped) # 与 zip 相反,*zipped 可理解为解压,返回二维矩阵式
# 输出 [(1, 2, 3), (4, 5, 6)]
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python与机器学习之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档