1. 如何在Python中使用Lambda函数

艾伦·肖维奇(John Alan Shovic)

Python支持匿名函数(也称为lambda函数)的概念。名称的匿名部分基于以下事实:该函数不需要名称(但是如果需要,可以使用一个名称)。 lambda部分基于使用关键字lambda在Python中进行定义。 Lambda也是希腊字母的第11个字母。

但是在Python中使用该名称的主要原因是因为术语lambda用于描述微积分中的匿名函数。现在我们已经解决了这一问题,您可以使用此信息在办公室聚会上引发令人着迷的对话。

使用Python定义lambda表达式(无名称)的最小语法为:

Lambda参数:表达式

使用时:

  • 用传递到表达式中的数据替换参数。 将表达式替换为定义要返回的lambda的表达式(公式)。

使用该语法的一个相当常见的示例是,当您尝试对文本字符串进行排序时,其中一些名称以大写字母开头,而某些名称以小写字母开头,例如以下名称:

亚当斯,马,迪米拉,赞杜斯基

假设您编写以下代码以将名称放入列表中,对其进行排序,然后打印列表,如下所示:

名称= ['Adams','Ma','diMeola','Zandusky']
names.sort()
打印(名称)

该输出是:

['Adams','Ma','Zandusky','diMeola']

在一些初学者看来,让DiMeola出现在Zandusky之后似乎是错误的。但是计算机并不总是以我们的方式看待事物。 (实际上,他们没有“看到”任何东西是因为他们没有眼睛或大脑……但这不重要。)diMeola出现在Zandusky之后的原因是因为排序基于ASCII,而ASCII是每个字符由数字表示。

所有小写​​字母的数字都大于大写数字。因此,排序时,所有以小写字母开头的单词都排在以大写字母开头的单词之后。如果没有其他要求,则至少应保证较小的嗯。

为了解决这些问题,Python的sort()方法使您可以在括号内包含key =表达式,在其中可以告诉它如何排序。语法为:

.sort(键=变换)

转换部分是对要排序的数据的某些变化。如果您很幸运,并且像len(长度)这样的内置函数可以为您工作,那么您可以使用它来代替转换,如下所示:

names.sort(key = len)

对于我们来说不幸的是,字符串的长度不利于字母顺序化。因此,当您运行该命令时,其顺序为:

['Ma','Adams','diMeola','Zandusky']

排序是从最短的字符串(字符最少的字符串)到最长的字符串。目前没有帮助。

您不能编写key = lower或key = upper来使排序基于所有小写字母或所有大写字母,因为小写和大写都不是内置函数(您可以通过搜索python 3.7内置函数来快速验证功能)。

代替内置函数,您可以使用使用def定义自己的自定义函数。例如,您可以创建一个名为lower()的函数,该函数接受一个字符串并返回该字符串,并将其所有字母都转换为小写字母。这是函数:

def lower(anystring):
“”“将字符串转换为所有小写字母”“”
返回anystring.lower()

小写的名字组成了,anystring是将来传递给它的任何字符串的占位符。 return anystring.lower()返回使用str(字符串)对象的.lower()方法转换为所有小写字母的字符串。 (有关更多信息,请阅读Python字符串方法。)

您不能在sort()括号中使用key = lower,因为lower()不是内置函数。这是一种方法……不一样。所有这些流行语都令人讨厌。

假设您在Jupyter单元或.py文件中编写此函数。然后,使用诸如print(lowercaseof('Zandusky'))之类的函数调用该函数。您将得到的输出是将该字符串转换为所有小写字母的形式,如下所示。

Python中的自定义函数lower()

好的,现在您有了一个自定义函数,可以将任何字符串转换为所有小写字母。您如何将其用作排序键?容易,使用key = transform像以前一样,但是用您的自定义函数名称替换transform。该函数名为lowercaseof,因此您将使用.sort(key = lowercaseof),如下所示:

def lowercaseof(任何字符串):
“”“将字符串转换为所有小写字母”“”
返回anystring.lower()
 
名称= ['Adams','Ma','diMeola','Zandusky']
names.sort(key = lowercaseof)

运行此代码以显示名称列表,会将它们置于正确的顺序,因为它基于全部为小写字母的字符串进行排序。输出与之前相同,因为仅在幕后进行的排序使用小写字母。原始数据仍以其原始的大写和小写字母表示。

“亚当斯”,“迪梅拉”,“马”,“赞达斯基”

阅读完所有这些内容后,如果您仍然清醒和有意识,您可能会想:“好了,您解决了排序问题。但是我以为我们在这里谈论的是lambda函数。 lambda函数在哪里?”尚无lambda函数。

但这是一个可以使用lambda函数的完美示例,因为您要调用的Python函数lowercaseof()仅用一行代码即可完成所有工作:return anystring.lower()。

当您的函数可以使用像这样的简单单行表达式执行其操作时,您可以跳过def和函数名称,而仅使用以下语法:

lambda参数:表达式

将参数替换为您自己编写的一个或多个参数名称(def后面的括号内的名称以及常规函数中的函数名称)。将表达式替换为您希望函数返回而不带单词return的内容。因此,在此示例中,使用lambda表达式的键为:

lambda anystring:anystring.lower()

现在,您可以了解为什么它是匿名函数。函数名称为lowercaseof()的第一行已删除。因此,使用lambda表达式的优势在于,您甚至根本不需要外部自定义函数。您只需要参数,后跟一个冒号和一个告诉它返回什么的表达式。

下图显示了完整的代码以及运行它的结果。您可以获得正确的排序顺序,而无需使用诸如lowercaseof()之类的客户外部函数。您只需要使用anystring:anystring.lower()(在lambda一词之后)作为排序键。

Python Lambda表达式

我们还要补充一点,anystring是比大多数Pythonista用户使用的参数名称更长的名称。 Python的人喜欢短名称,甚至是单字母名称。例如,您可以使用s(或任何其他字母)替换anystring,如下所示,并且代码将完全相同:

名称= ['Adams','Ma','diMeola','Zandusky']
names.sort(key = lambda s:s.lower())
打印(名称)

追溯到这一故事的开始,有人提到lambda函数不必是匿名的。您可以给它们命名并像调用其他函数一样调用它们。

例如,以下是一个名为currency的lambda函数,该函数可以接受任何数字并返回货币格式的字符串(即,带有前导美元符号,数千之间的逗号和美分的两位数):

货币= lambda n:f“ $ {n:,。2f}”

这是一个命名的百分比,它将您发送给它的任何数字乘以100,并在末尾显示两个百分号:

percent = lambda n:f“ {n:.2%}”

下图显示了在Jupyter单元顶部定义的两个函数的示例。然后,一些打印语句按名称调用函数,并将一些样本数据传递给它们。每个print()语句以所需的格式显示数字。

Python格式化数字

之所以将它们定义为单行lambda,是因为您可以在一行中完成所有工作,其中第一行为f“ $ {n:,。2f}”,第二行为f“ {n:.2%}”。第二个。但是,仅仅因为您可以那样做,并不意味着您必须这样做。您也可以使用常规函数,如下所示:

#以货币格式显示数字。
def货币(n):
返回f“ $ {n:,。2f}”
 
定义百分比(n):
#以百分比格式显示数字。
返回f“ {n:.2%}”

使用这种更长的语法,您也可以传递更多信息。例如,您可以默认使用一定宽度(例如15个字符)内的右对齐格式,以便所有数字都以相同的宽度右对齐。该图显示了这两种功能的这种变化。

Python格式化功能固定宽度

在上图中,第二个参数是可选的,如果省略则默认为15。因此,如果您这样称呼它:

打印(currency(9999))

…您将获得$ 9,999.00的填充,左侧有足够的空格以使其宽15个字符。如果您这样称呼它:

打印(货币(9999,20)

…您仍然可以获得$ 9,999.00,但在左侧填充足够的空间以使其宽20个字符。

上面使用的.ljust()是Python内置的字符串方法,该方法用足够的空格填充字符串的左侧以使其达到指定的宽度。还有一个rjust()方法来填充右侧。您还可以指定空格以外的其他字符。如果您需要更多信息,请使用Google python 3。

这样就可以在Python中创建自己的自定义函数。在现实生活中,您想要做的是,每当发现需要在应用程序中一遍又一遍地访问同一段代码(相同的登录位)时,不要简单地复制/粘贴该段代码。一遍又一遍地编码。而是将所有代码放在可以按名称调用的函数中。

这样,如果您决定更改Python字符串代码,则无需深入研究应用程序以查找所有需要更改的位置。只需在全部定义在一个地方的函数中进行更改即可。

  1. 编程Python如何定义和使用Python列表

艾伦·肖维奇(John Alan Shovic)

Python中最简单的数据收集是一个列表。列表是方括号内用逗号分隔的任何数据项列表。通常,就像使用变量一样,使用=符号为Python列表分配名称。如果列表中包含数字,则不要在其周围使用引号。例如,这是测试成绩的列表:

分数= [88,92,78,90,98,84]

如果列表中包含字符串,则应像往常一样,将这些字符串括在单引号或双引号中,如下例所示:

要在屏幕上显示列表的内容,可以像打印任何常规变量一样进行打印。例如,在定义该列表后在代码中执行print(学生)会在屏幕上显示此信息。

['Mark','Amber','Todd','Anita','Sandy']

这可能与您的想法不完全相同。但请放心,Python提供了许多很棒的方式来访问列表中的数据并根据需要显示它们。

按位置引用Python列表项

即使您看不到任何数字,列表中的每个项目也都有一个以零开头的位置编号。您可以使用列表名称,列表名称后跟方括号中的数字来按列表中的项目编号进行引用。换句话说,使用以下语法:

清单名称[x]

将listname替换为要访问的列表的名称,并将x替换为所需项的位置编号。请记住,第一个项目始终是数字零,而不是一个。例如,在下面的第一行中,我定义了一个名为“ students”的列表,然后从该列表中打印零项目。执行代码时,结果是显示名称Mark。
学生= [“马克”,“琥珀”,“托德”,“阿妮塔”,“桑迪”]
打印(学生[0])
标记

<技术资料>

阅读访问列表项目时,专业人员在数字前使用“ sub”一词。例如,students [0]被说成是低于零的学生。

下一个示例显示一个名为scores的列表。 print()函数打印列表中最后一个分数的位置编号,该位置编号为4(因为第一个始终为零)。

分数= [88,92,78,90,84]
打印(分数[4])
84

如果您尝试访问一个不存在的列表项,则会收到“索引超出范围”错误。索引部分是对方括号内数字的引用。例如,下图显示了在Jupyter笔记本中的一个小实验,其中创建了乐谱列表,然后尝试打印乐谱[5]。

由于没有分数[5],它失败并产生了错误。只有分数[0],分数[1],分数[2],分数[3]和分数[4],因为计数始终从零开始,列表中的第一个开始。

Python索引范围

遍历Python列表

要访问列表中的每个项目,只需使用带有以下语法的for循环:

对于列表中的x:

x替换为您选择的变量名。用列表名称替换list。使代码可读的一种简单方法是始终对列表名称使用复数形式(例如学生,分数)。然后,您可以使用单数名称(学生,分数)作为变量名称。您也不需要通过这种方法使用下标数字(方括号中的数字)。例如,以下代码将打印分数列表中的每个分数:

分数中的分数:
打印(分数)

请记住,始终缩进要在循环中执行的代码。此图显示了一个更完整的示例,您可以在其中查看在Jupyter笔记本中运行代码的结果。

遍历Python列表

查看Python列表是否包含项目

如果要让代码检查列表的内容以查看其是否已包含某些项目,请在if语句或变量赋值的listname中使用。

例如,下图中的代码创建一个名称列表。然后,两个变量存储在列表中搜索名称Anita和Bob的结果。对于名称(Anita)在列表中的变量,打印每个变量的内容均显示True。判断鲍勃是否在列表中的测试被证明为False。

查看某项是否在Python列表中

获取Python列表的长度

要确定列表中有多少项,请使用len()函数(长度的缩写)。将列表的名称放在括号内。例如,在Jupyter笔记本或Python提示符或任何其他内容中键入以下代码:

学生= [“马克”,“琥珀”,“托德”,“阿妮塔”,“桑迪”]
打印(len(学生))

运行该代码将产生以下输出:

5

列表中确实有五项,尽管最后一项总是比数字少一,因为Python开始从零开始计数。因此,最后一个,桑迪,实际上是指学生[4],而不是学生[5]。

将项目追加到Python列表的末尾

当您希望Python代码将新项目添加到列表末尾时,请使用.append()方法,并将其添加到括号内。您可以在引号内使用变量名或文字值。

例如,在下图中,读取students.append(“ Goober”)的行将名称Goober添加到列表中。读取students.append(new_student)的行会将存储在名为new_student的变量中的任何名称添加到列表中。 .append()方法始终添加到列表的末尾。因此,当您打印列表时,您会在末尾看到这两个新名称。

Python附加列表

您可以使用测试来查看某项是否在列表中,然后仅在该项不在列表中时再添加。例如,下面的代码不会将名称Amber添加到列表中,因为该名称已在列表中:

student_name =“阿曼达”

#仅在列表中尚未添加学生名时添加。
如果学生中的student_name:
    打印(学生名+“已经在列表中”)
其他:
    students.append(学生姓名)
    打印(student_name +“添加到列表”)

将项目插入Python列表

尽管append()方法允许您将项目添加到列表的末尾,但是insert()方法允许您将项目添加到列表的任何位置。 insert()的语法是

listname.insert(位置,项目)

将listname替换为列表名称,将position替换为要插入项目的位置(例如,0使其成为第一个项目,1使其成为第二个项目,依此类推)。将项目替换为要放入列表中的值或包含该值的变量的名称。

例如,以下代码使Lupe成为列表中的第一项:

#创建一个字符串(名称)列表。
学生= [“马克”,“琥珀”,“托德”,“阿妮塔”,“桑迪”]

student_name =“卢佩”
#将学生姓名添加到列表的前面。
students.insert(0,student_name)

#向我显示新列表。
打印(学生)

如果运行代码,则在插入新名称后,print(students)将显示列表,如下所示:

['Lupe','Mark','Amber','Todd','Anita','Sandy']

更改Python列表中的项目

就像使用变量一样,您可以使用=赋值运算符(查看这些常见的Python运算符)来更改列表中的项目。只要确保将索引号包括在要更改的项目的方括号中即可。语法为:

listname [index] = newvalue

将listname替换为列表名称;用您要更改的项目的下标(索引号)替换索引;并将newvalue替换为要放入列表项的任何值。例如,看下面的代码:

#创建一个字符串(名称)列表。
学生= [“马克”,“琥珀”,“托德”,“阿妮塔”,“桑迪”]
学生[3] =“霍巴特”
打印(学生)

运行此代码时,输​​出如下,因为Anita的名称已更改为Hobart。

[“马克”,“琥珀”,“托德”,“霍巴特”,“桑迪”]

结合Python列表

如果要将两个列表合并为一个列表,请使用带有以下语法的extend()函数:

original_list.extend(additional_items_list)

在代码中,将original_list替换为要添加新列表项的列表的名称。将list_name替换为包含要添加到第一个列表的项目的列表名称。这是一个使用名为list1和list2的列表的简单示例。执行list1.extend(list2)之后,第一个列表包含两个列表中的项目,如您在最后的print()语句的输出中所见。

#创建两个名称列表。
list1 = [“ Zara”,“ Lupe”,“ Hong”,“ Alberto”,“ Jake”]
list2 = [“ Huey”,“ Dewey”,“ Louie”,“ Nader”,“ Bubba”]

#将list2名称添加到list1。
list1.extend(list2)

#打印清单1。
打印(列表1)

['Zara','Lupe','Hong','Alberto','Jake','Huey','Dewey','Louie','Nader','Bubba']

Easy Parcheesi,不是吗?

删除Python列表项

Python提供了remove()方法,因此您可以从列表中删除任何值。如果该项目多次在列表中,则仅删除第一个匹配项。例如,以下代码显示了一个字母列表,其中字母C重复了几次。然后代码使用letters.remove(“ C”)从列表中删除字母C:

#从列表中删除“ C”。
letter.remove(“ C”)

#向我显示新列表。
打印(字母)

当您实际执行此代码并打印列表时,您会看到仅删除了第一个字母C:

['A','B','D','C','E','C']

如果您需要删除所有项目,则可以使用while循环重复.remove,只要该项目仍保留在列表中即可。例如,只要“ C”仍在列表中,此代码就会重复.remove。

#创建一个字符串列表。
字母= [“ A”,“ B”,“ C”,“ D”,“ C”,“ E”,“ C”]

如果要根据项目在列表中的位置删除项目,请使用带有索引号的pop()而不是使用带有值的remove()。如果要从列表中删除最后一项,请使用没有索引号的pop()。

例如,以下代码创建一个列表,一行删除第一项(0),另一行删除最后一项(pop()括号中没有任何内容)。打印列表显示这两项已被删除:

#创建一个字符串列表。
字母= [“ A”,“ B”,“ C”,“ D”,“ E”,“ F”,“ G”]
 
#删除第一项。
letters.pop(0)
#删除最后一项。
letter.pop()
 
#向我显示新列表。
打印(字母)

运行代码表明,弹出第一个和最后一个项目确实有效:

['B','C','D','E','F']

当pop()列表中的某个项目时,可以将该值的副本存储在某个变量中。例如,此图像显示与上面相同的代码。但是,它将删除的内容的副本存储在名为first_removed和last_removed的变量中。最后,它会打印Python列表,并显示已删除的字母。

从Python列表中删除项目

Python还提供了del(删除的缩写)命令,该命令根据索引号(位置)从列表中删除任何项目。但是同样,您必须记住,第一项为零。因此,假设您运行以下代码以从列表中删除商品编号2:

#创建一个字符串列表。
字母= [“ A”,“ B”,“ C”,“ D”,“ E”,“ F”,“ G”]
 
#删除子项2。
德尔字母[2]
 
打印(字母)

运行该代码将再次显示该列表,如下所示。字母C已被删除,这是要删除的正确项目,因为字母的编号为0、1、2、3等。

['A','B','D','E','F','G']

您也可以使用del删除整个列表。只是不要使用方括号和索引号。例如,您在下面看到的代码创建一个列表,然后将其删除。删除后尝试打印列表会导致错误,因为在执行print()语句时列表不再存在。

删除Python列表

清除Python清单

如果要删除列表的内容而不是列表本身,请使用.clear()。该列表仍然存在;但是,它不包含任何项目。换句话说,这是一个空列表。以下代码显示了如何进行测试。运行代码的末尾显示[],可让您知道列表为空:

#创建一个字符串列表。
字母= [“ A”,“ B”,“ C”,“ D”,“ E”,“ F”,“ G”]
 
#清除所有列表。
letter.clear()
 
#给我看新清单。
打印(字母)

[]

计算项目在Python列表中出现的次数

您可以使用Python count()方法计算项目在列表中出现的次数。与其他列表方法一样,语法很简单:

listname.count(x)

将listname替换为列表名称,将x替换为您要查找的值(或包含该值的变量的名称)。

下图中的代码使用.count()括号内的文字B来计算字母B在列表中出现的次数。相同的代码也计算C级的数量,但是该值存储在变量中只是为了显示语法上的差异。正如您在底部的程序输出中所看到的,这两种计数均有效。添加了一个以计算F的数量,而不使用任何变量。 F在显示消息的代码中被正确计数。没有F等级,因此返回零,如您在输出中看到的。

计算Python列表项

当尝试将数字和字符串组合成一条消息时,请记住,您必须使用str()函数将数字转换为字符串。否则,您将收到一条错误消息,内容为只能将str(而不是“ int”)连接到str。在该消息中,int是整数的缩写,而str是字符串的缩写。

查找Python列表项的索引

Python提供了一个.index()方法,该方法根据索引号返回一个数字,该数字指示索引项在列表中的位置。语法为:

listname.index(x)

与往常一样,将listname替换为要搜索的列表的名称。将x替换为您要查找的内容(一如既往,以文字或变量名形式)。当然,我们无法保证该项目在列表中,即使存在,也无法保证该项目仅在列表中一次。如果该项目不在列表中,则会发生错误。如果该项目多次在列表中,则返回第一个匹配项目的索引。

下图显示了一个示例,其中该程序在f_index = grades.index(look_for)行崩溃,因为列表中没有F。

Python列表项索引

解决该问题的一种简单方法是使用if语句在尝试获取其索引号之前先查看该项目是否在列表中。如果该项目不在列表中,请显示一条消息。否则,获取索引号并在消息中显示它。该代码如下:

#创建一个字符串列表。
等级= [“ C”,“ B”,“ A”,“ D”,“ C”,“ B”,“ C”]
#决定寻找什么
look_for =“ F”
#查看项目是否在列表中。
如果look_for为等级:
    #如果在列表中,请获取并显示索引。
    print(str(look_for)+“位于索引” + str(grades.index(look_for))))
其他:
    #如果不在列表中,甚至不要尝试输入索引号。
    print(str(look_for)+“不在列表中。”)

按字母顺序排列和排序Python列表

Python提供了sort()方法来对列表进行排序。它以最简单的形式按字母顺序排列列表中的项目(如果它们是字符串)。如果列表中包含数字,则按照从小到大的顺序对它们进行排序。对于像这样的简单排序,只需在带空括号的情况下使用sort():

listname.sort()

将listname替换为列表名称。下图显示了一个使用字符串列表和数字列表的示例。在该示例中,只需将每个已排序的列表分配给新的列表名称,就可以为每个列表创建一个新列表。然后,代码将打印每个已排序列表的内容。

排序Python清单

如果您的列表包含大小写字母混合的字符串,并且排序结果看起来不正确,请尝试用.sort(key = lambda s:s.lower())替换.sort()再次运行代码。

日期有点棘手,因为您不能只将它们作为字符串输入,例如“ 12/31/2020”。它们必须是日期数据类型才能正确排序。这意味着使用datetime模块和date()方法来定义每个日期。您可以像其他任何列表一样将日期添加到列表中。例如,在下面的代码行中,该代码创建了一个包含四个日期的列表,并且该代码非常完美。

date = [dt.date(2020,12,31),dt.date(2019,1,31),dt.date(2018,2,28),dt.date(2020,1,1)]

如果您以此方式创建列表,计算机当然不会介意。但是,如果您想使代码对自己或其他开发人员更具可读性,则可能希望一次创建并附加每个日期,这样就可以更轻松地了解正在发生的事情,因此您不必在一行代码中处理这么多逗号。下图显示了一个示例,其中创建了一个名为datelist的空列表:

日期列表= []
在Python中显示日期

然后使用dt.date(year,month,day)语法将一个日期一次附加到列表中。

创建列表后,代码使用datelist.sort()将它们按时间顺序排序(最早到最新)。您无需在该代码中使用print(datelist),因为该方法将显示包含数据类型信息的日期,例如:

[datetime.date(2018,2,28),datetime.date(2019,1,31),datetime.date(2020,1,1),datetime.date(2020,12,31)]

不是最容易阅读的列表。因此,您不必遍历整个列表,而可以使用一个print()语句遍历列表中的每个日期,并使用f字符串%m /%d /%Y格式化每个日期。如上图底部所示,它以mm / dd / yyyy

如果您想按相反的顺序对项目进行排序,请在sort()括号内放入reverse = True(并且不要忘记将首字母大写)。下图显示了使用reverse = True对三个列表进行降序排列的示例。

反向在Python列表中排序信息

反转Python列表

您还可以使用.reverse方法反转列表中项目的顺序。这与反向排序不同,因为当您反向排序时,您实际上仍在排序:Z–A表示字符串,数字的最大到最小,日期的最早到最早。反转列表时,您只需反转列表中的项目(无论其顺序如何),而无需尝试以任何方式对它们进行排序。

下面的代码显示了一个示例,其中您可以颠倒列表中名称的顺序,然后打印列表。输出显示列表项与原始顺序相反:

#创建一个字符串列表。
名称= [“ Zara”,“ Lupe”,“ Hong”,“ Alberto”,“ Jake”]
#反转列表
names.reverse()
#打印列表
打印(名称)
 
['Jake','Alberto','Hong','Lupe','Zara']

复制Python列表

如果您需要使用列表的副本,请使用.copy()方法,以免更改原始列表。例如,下面的代码与前面的代码类似,不同之处在于,您制作了一个列表副本并反转了该列表,而不是反转原始列表的顺序。打印每个列表的内容将显示第一个列表仍保持原始顺序,而第二个列表则相反:

#创建一个字符串列表。
名称= [“ Zara”,“ Lupe”,“ Hong”,“ Alberto”,“ Jake”]
 
#复制清单
向后名称= names.copy()
#反转副本
forward_names.reverse()
 
#打印列表
打印(名称)
打印(backward_names)
 
['Zara','Lupe','Hong','Alberto','Jake']
['Jake','Alberto','Hong','Lupe','Zara']

为了将来提供参考,下表总结了您所了解的方法。