每一节Python入门课上,经常都会被问道像“我们如何才能知道所有这些”这样的问题。
通常还伴随着这些问题:
1.Python中有很多函数,记住这些函数的最好方法是什么?
2.学习我们日常需要的函数,如enumerate 和 range,最好的方法是什么?
3.你是如何知道Python中解决问题的所有方法的?你记下来了吗?
有几十个内置函数和类,数百个工具捆绑在Python的标准库中,以及PyPI上的数千个第三方库。任何人都不可能记住所有这些东西。
我建议你对你的知识进行分类:
1.我应该记住的东西,这样我就能很好地理解它们
2.我应该知道的东西,这样我以后才能更有效地查找它们
3.我根本不应该为之烦恼的东西,除非有一天我需要它们
将这个方法记在脑海中,我们来浏览Python文档中的内置函数页面。
这将是一篇很长的文章,所以在下一节中我将链接到5个子部分和20个特定的内置函数,所以如果你有时间或者正在寻找一个内置函数,你可以提前跳过去查看。
你应该了解哪些内置组件?
我估计大多数Python开发人员只需要大约30个内置函数,但是哪30个取决于你实际使用Python做什么。
我们将以鸟瞰的方式来看看Python中的所有的69个内置函数。
我将尝试把这些内置组件分成五类:
-
众所周知: 大多数python初学者会因为需要而很快地接触到这些内置组件
-
初学者所忽略的: 了解这些函数很有用,但是当你是Python新手时,就会很容易忽略它们
-
稍后再学习的: 了解这些内置组件通常很有用,但是当/如果你需要它们时,你就会找到它们
-
也许最终会学的: 这些东西迟早会派上用场,但只是在特定的情况下
-
你可能不需要这些: 除非你在做一些相当专业的事情,否则你不太可能会需要这些
类别1和类别2中的内置函数几乎是所有Python程序员最终都应该学习的基本内置函数。类别3和类别4中的内置函数是专门的内置函数,它们通常非常有用,但是你对它们的需求会根据你对Python的使用情况而有所不同。类别5是神秘的内置函数,当你需要它们时,这可能非常方便,但是许多Python程序员可能永远都不需要它们。
Python高手请注意: 我将把所有这些内置组件都称为函数,尽管其中的27个实际上并不是函数(如我的函数和callables文章中所讨论的)。
常见的内置函数(你可能已经很熟悉了):
-
print
-
len
-
str
-
int
-
float
-
list
-
tuple
-
dict
-
set
-
range
经常被新的Python编程者所忽略的内置函数:
-
sum
-
enumerate
-
zip
-
bool
-
reversed
-
sorted
-
min
-
max
-
any
-
all
还有5个通常被忽略的内置函数,我建议你自己去了解它们,因为它们使调试更容易: dir、vars、breakpoint、type和help。
除了上面的25个内置函数之外,我们还将在稍后的“以后学习并可能最终会学习的”和“你可能不需要这些”部分中简要介绍其他的44个内置函数。
10个常见的内置函数
如果你一直在编写Python代码,那么这些内置程序对你来说可能已经很熟悉了。
你已经知道了print函数。实现hello world需要用到print。
你可能不了解print所接受的各种关键字参数:
你可以自己查看print函数。
len
在Python中,我们不写像my_list.length()或my_string.length()这样的函数; 相反,我们会奇怪地(至少对于新的python开发者来说)使用len(my_list)和len(my_string)。
无论你是否喜欢这个类似于操作符的len函数,你都必须使用它,所以你需要习惯它。
str
与许多其他编程语言不同,你不能在Python中连接字符串和数字。
Python拒绝将3个整数强制作为一个字符串,所以我们需要自己手动执行,使用内置的str函数(技术上来说是类,但正如我所说的,我将所有这些都称为函数):
int
你是否有用户输入并需要将其转换为数字?那你就需要int函数!
int函数可以将字符串转换为整数:
你还可以使用int将浮点数截断为整数:
注意,如果你在进行除法运算时需要截断,//操作符可能更合适(尽管它对负数的运行情况会不同):int(3 / 2) == 3 // 2。
float
你要转换为数字的字符串实际上不是一个整数吗?那么你将使用float而不是int来进行转换。
你还可以使用float将整数转换为浮点数。
在python2中,我们常常使用float将整数转换为浮点数来强制进行浮点除法而不是整数除法。“整数除法”在Python 3中已经不存在了(除非你专门使用//运算符),因此我们不再需要float来实现这个目的。如果你一旦在Python3代码中看到float(x) / y,你就可以把它改成x / y。
list
想要创建一个其他一些可迭代对象的列表吗?
list函数就是做这些的:
如果你知道你在处理一个列表,你可以使用copy方法来创建一个该列表的新副本:
但是如果你不知道你正在处理的可迭代对象是什么,list函数是循环一个可迭代对象并复制它的更通用的方法:
你也可以使用一个列表推导式,但我不推荐这样做。
注意,当你想要创建一个空列表时,建议使用列表字面量语法(那些[]括号):
使用[]被认为更符合习惯,因为那些方括号([])实际上看起来像一个Python列表。
tuple
tuple函数与list函数非常相似,只是它会创建元组:
如果你需要一个元组而不是列表,比如是因为你正在尝试创建一个可在字典的键中使用的可哈希集合,那你可能会想要使用tuple而不是list。
dict
dict函数用于创建一个新字典。
与list和tuple类似,dict函数等价于在一个具有键值对的迭代器上进行循环,并从中生成一个字典。
给定一个两项元组的列表:
这个:
可以用dict函数代替来生成:
dict函数接受两种类型的参数:
1.另一个字典(通用术语是映射),在这种情况下,该字典将被复制
2.一个由键值元组组成的列表(更准确地说,是由两项迭代器组成的一个迭代器),在这种情况下,将从这些元素构造一个新字典
所以这也是可行的:
dict函数还可以接受关键字参数来创建一个带有基于字符串键的字典:
但我更喜欢用字典字面量来代替:
字典字面量语法更灵活,速度更快,但最重要的是,我发现它更清楚地传达了我们正在创建一个字典的事实。
就像list和tuple一样,一个空字典也应该使用字面量语法来创建:
使用{}稍微提高了CPU效率,但更重要的是,它更符合人们的习惯: 使用大括号({})创建字典是很常见的,但是dict出现的频率要低得多。
set
set函数生会成一个新的集合,它接受一个带有可哈希值的迭代器(字符串、数字或其他不可变类型),并返回一个set:
使用{}集合字面量语法(纯 {} 会创建一个字典)无法生成空集合,因此set函数是生成空集的唯一方法:
事实上,这是一个谎言,因为我们有这个:
但是这种语法令人困惑(它依赖于*操作符的一个不太常用的特性),所以我不推荐使用它。
range
range函数给我们返回一个range对象,它表示一个数字范围:
得到的数字范围包括开始数字,但不包括停止数字(range(0,10)不包括10)。
当你想对一些数字进行循环时,range函数很有用。
一个常见的用例是执行一个操作n次(顺便说一下,这是一个列表推导式):
Python 2的range函数会返回一个列表,这意味着上面的表达式将生成非常非常大的列表。python3的range运行方式与python2的xrange类似(尽管它们有一点不同),因为当我们在这些range对象上循环时,数字是延迟计算的。
被新进的Python高手忽略的内置函数
如果你已经使用Python编程了一段时间,或者刚刚学习了Python类的介绍,那么你可能已经了解了上面的内置函数。
现在,我想展示15个内置函数,这些函数非常便于了解,但是常常被新进的Python高手所忽略。
你将在Python代码中发现前10个函数,但最后5个函数最常在调试时使用。
bool
bool函数会检查一个Python对象的真实性。
对于数字,真实性是一个非零的问题:
对于集合,真实性通常是一个非空的问题(集合的长度是否大于0):
真实性(在文档中称为真值测试)在Python中非常重要。
代替询问一些关于一个容器长度的问题,许多Python高手会问一些有关真实性的问题:
你可能不会经常看到bool的使用,但是在需要将值强制转换为布尔值以询问其真实性的情况下,你会想要了解bool。
enumerate
每当你需要向上计数时,每次一个数字,同时循环遍历一个迭代器, enumerate函数就会派上用场。
这似乎是一个非常小众的任务,但它经常出现。
例如,我们可能想要跟踪一个文件中的行号:
enumerate函数也常常用来跟踪序列中项目的索引。
注意,你可能会看到较新的Python专家在Python中使用range(len(sequence))。如果你看到带有range(len(…))的代码,那你几乎总是希望使用enumerate来代替。
如果enumerate对你来说是一个新用法(或者如果你经常使用range(len(…)),请查看我关于在Python中使用索引进行循环的文章。
zip
zip函数甚至比enumerate函数更加专门化。
zip函数用于同时循环多个迭代器。
如果你必须同时循环两个列表(或任何其他迭代器),则首选zip而不是enumerate。当你在循环时需要索引时,enumerate函数非常方便,但是当我们特别关心同时循环两个迭代器时,zip就非常棒了。
如果你是zip新手,我还将在我的“使用索引进行循环”文章中讨论它。
enumerate 和 zip都会向我们返回迭代器。迭代器是用来增强for循环的延迟可迭代对象。我有一个关于迭代器的完整讨论,以及一篇关于如何创建自己的迭代器的高级文章。
顺便说一下,如果你需要对不同长度的迭代器使用zip,你可能需要在Python标准库中查看 itertools.zip_longest。
reversed
reversed函数,像enumerate和zip一样,也会返回一个迭代器。
我们可以对这个迭代器做的唯一一件事就是对它进行循环(但只能循环一次):
与enumerate和zip类似,reversed是一种循环辅助函数。你会更多的发现,reversed专门用于for循环的for部分中:
除了reversed函数外,还有其他方法可以反转Python列表:
但是reversed函数通常是反转Python中任何可迭代对象的最佳方法。
与列表的reverse方法(例如numbers.reverse())不同,reversed方法不会改变列表(相反,它返回一个反转项的迭代器)。
与numbers[::-1]切片语法不同,reverse (numbers)不会构建一个全新的列表:它返回的延迟迭代器会在我们进行循环时逆向地检索下一项。此外,reversed(numbers) 比numbers[::-1]更具可读性(如果你以前从未见过这种特殊的切片用法,那么它看起来会很奇怪)。
如果我们结合了reversed 和 zip函数的非复制特性,我们就可以重写palindromic函数(来自上面的enumerate),而不需要占用任何额外的内存(这里不会复制列表):
sum
sum函数接受一个带有数字的迭代器,并返回这些数字的和。
没有比这更多的了。
Python有很多帮助函数可以为你执行循环,部分原因是它们与生成器表达式能很好地匹配:
如果你对生成器表达式感兴趣,我在我的“可理解的推导式”演讲(以及我3小时的关于“推导式和生成器表达式“的教程)中讨论了它们。
min 和 max
min和max函数实现了你所期望的功能:它们会为你返回一个迭代器中的最小和最大项。
min和max函数使用<操作符来比较传给它们的项。因此,所有的值都要是可排序的,并且彼此之间是可比较的(幸运的是,Python中的许多对象是可排序的)。
min和max函数还可以接受一个key函数,允许你自定义特定对象的“最小”和“最大值”的真正含义。
sorted
sorted函数接受任何可迭代的对象,并以排序后的顺序返回该可迭代对象中所有值的一个新列表。
与min和max类似,sorted函数使用<操作符来比较传给它的项,因此,所有传给它的值都需要是可排序的。
sorted函数还允许通过一个key函数来自定义排序过程(就像min和max)。
顺便说一下,如果你对sorted和list.sort方法的比较感兴趣的话,Florian Dahlitz写了一篇文章来比较这两种方法。
any 和 all
any和all函数可以与生成器表达式配对,以确定一个可迭代对象中的任意项和所有项是否与给定条件相匹配。
我们前面的palindromic函数会检查所有项是否与它们的反转序列中的对应项相等(第一个值是否等于最后一个值,第二个值是否等于倒数第二个值,等等)。
我们可以使用all函数像这样来重写palindromic函数:
将all函数中的条件和返回值全部否定时,我们可以等价地使用any(尽管在这个例子中这有点令人困惑):
如果any和all函数对你来说是新的,那么你可能想阅读我关于它们的文章:《在Python中检查所有项是否与一个条件相匹配》。
品略图书馆 http://www.pinlue.com/