python循环3次停止_一些值得学习的Python内置函数

0624e007a368b6dde471c85897b53d9c.png

在我教的每一节Python入门课上,经常都会被问道像“我们如何才能知道所有这些”这样的问题。

通常还伴随着这些问题:

1.Python中有很多函数,记住这些函数的最好方法是什么?

2.学习我们日常需要的函数,如enumerate 和 range,最好的方法是什么?

3.你是如何知道Python中解决问题的所有方法的?你记下来了吗?

有几十个内置函数和类,数百个工具捆绑在Python的标准库中,以及PyPI上的数千个第三方库。任何人都不可能记住所有这些东西。

我建议你对你的知识进行分类:

1.我应该记住的东西,这样我就能很好地理解它们

2.我应该知道的东西,这样我以后才能更有效地查找它们

3.我根本不应该为之烦恼的东西,除非有一天我需要它们

将这个方法记在脑海中,我们来浏览Python文档中的内置函数页面。

这将是一篇很长的文章,所以在下一节中我将链接到5个子部分和20个特定的内置函数,所以如果你有时间或者正在寻找一个内置函数,你可以提前跳过去查看。

你应该了解哪些内置组件?

我估计大多数Python开发人员只需要大约30个内置函数,但是哪30个取决于你实际使用Python做什么。

我们将以鸟瞰的方式来看看Python中的所有的69个内置函数。

我将尝试把这些内置组件分成五类:

  1. 众所周知: 大多数python初学者会因为需要而很快地接触到这些内置组件

  2. 初学者所忽略的: 了解这些函数很有用,但是当你是Python新手时,就会很容易忽略它们

  3. 稍后再学习的: 了解这些内置组件通常很有用,但是当/如果你需要它们时,你就会找到它们

  4. 也许最终会学的:  这些东西迟早会派上用场,但只是在特定的情况下

  5. 你可能不需要这些: 除非你在做一些相当专业的事情,否则你不太可能会需要这些

类别1和类别2中的内置函数几乎是所有Python程序员最终都应该学习的基本内置函数。类别3和类别4中的内置函数是专门的内置函数,它们通常非常有用,但是你对它们的需求会根据你对Python的使用情况而有所不同。类别5是神秘的内置函数,当你需要它们时,这可能非常方便,但是许多Python程序员可能永远都不需要它们。

Python高手请注意: 我将把所有这些内置组件都称为函数,尽管其中的27个实际上并不是函数(如我的函数和callables文章中所讨论的)。

常见的内置函数(你可能已经很熟悉了):

  1. print

  2. len

  3. str

  4. int

  5. float

  6. list

  7. tuple

  8. dict

  9. set

  10. range

经常被新的Python编程者所忽略的内置函数:

  1. sum

  2. enumerate

  3. zip

  4. bool

  5. reversed

  6. sorted

  7. min

  8. max

  9. any

  10. all

还有5个通常被忽略的内置函数,我建议你自己去了解它们,因为它们使调试更容易:  dir、vars、breakpoint、type和help。

除了上面的25个内置函数之外,我们还将在稍后的“以后学习并可能最终会学习的”和“你可能不需要这些”部分中简要介绍其他的44个内置函数。

10个常见的内置函数

如果你一直在编写Python代码,那么这些内置程序对你来说可能已经很熟悉了。

print

你已经知道了print函数。实现hello world需要用到print。

你可能不了解print所接受的各种关键字参数:

164a13dd8c109668168c1d1405fed3a5.png

你可以自己查看print函数。

len

在Python中,我们不写像my_list.length()或my_string.length()这样的函数; 相反,我们会奇怪地(至少对于新的python开发者来说)使用len(my_list)和len(my_string)。

027f1850f1f9141349eddcd15f58d99e.png

无论你是否喜欢这个类似于操作符的len函数,你都必须使用它,所以你需要习惯它。

str

与许多其他编程语言不同,你不能在Python中连接字符串和数字。

bcdb6ece76912bbaa46499dbd7335572.png

Python拒绝将3个整数强制作为一个字符串,所以我们需要自己手动执行,使用内置的str函数(技术上来说是类,但正如我所说的,我将所有这些都称为函数):

0e4d3e024dc010bd5516a1dac44587ee.png

int

你是否有用户输入并需要将其转换为数字?那你就需要int函数!

int函数可以将字符串转换为整数:

c37cd2349ee1d1b45e3eda442168a449.png

你还可以使用int将浮点数截断为整数:

950b4e5b44ac2ee989ac7827e55c7295.png

注意,如果你在进行除法运算时需要截断,//操作符可能更合适(尽管它对负数的运行情况会不同):int(3 / 2) == 3 // 2。

float

你要转换为数字的字符串实际上不是一个整数吗?那么你将使用float而不是int来进行转换。

71a0c486858bcaa5f739b335c5c8ac07.png

你还可以使用float将整数转换为浮点数。

在python2中,我们常常使用float将整数转换为浮点数来强制进行浮点除法而不是整数除法。“整数除法”在Python 3中已经不存在了(除非你专门使用//运算符),因此我们不再需要float来实现这个目的。如果你一旦在Python3代码中看到float(x) / y,你就可以把它改成x / y。

list

想要创建一个其他一些可迭代对象的列表吗?

list函数就是做这些的:

5e2629a6251a6536af358d09f8971a10.png

如果你知道你在处理一个列表,你可以使用copy方法来创建一个该列表的新副本:

8254f41967d117132fe306a171183e49.png

但是如果你不知道你正在处理的可迭代对象是什么,list函数是循环一个可迭代对象并复制它的更通用的方法:

7916a50bbb3632ada268dd72ca710cf7.png

你也可以使用一个列表推导式,但我不推荐这样做。

注意,当你想要创建一个空列表时,建议使用列表字面量语法(那些[]括号):

109a9aa52111eff43f1a35cb0ea0b1e7.png

使用[]被认为更符合习惯,因为那些方括号([])实际上看起来像一个Python列表。

tuple

tuple函数与list函数非常相似,只是它会创建元组:

e8076e3cb0a99e47df950176209e7538.png

如果你需要一个元组而不是列表,比如是因为你正在尝试创建一个可在字典的键中使用的可哈希集合,那你可能会想要使用tuple而不是list。

dict

dict函数用于创建一个新字典。

与list和tuple类似,dict函数等价于在一个具有键值对的迭代器上进行循环,并从中生成一个字典。

给定一个两项元组的列表:

865a80b78cedd541bd6adfc8a0860cb3.png

这个:

a9fc4437708978e7d1009c6300854663.png

可以用dict函数代替来生成:

fe5cc2b304b01c371ab53b5406d5fb24.png

dict函数接受两种类型的参数:

1.另一个字典(通用术语是映射),在这种情况下,该字典将被复制

2.一个由键值元组组成的列表(更准确地说,是由两项迭代器组成的一个迭代器),在这种情况下,将从这些元素构造一个新字典

所以这也是可行的:

8f4d04a5229d56624ebe8991ae89eee0.png

dict函数还可以接受关键字参数来创建一个带有基于字符串键的字典:

cbd520d6796aabd68289317a7d75ce9f.png

但我更喜欢用字典字面量来代替:

47f349ee0941d2bb4977ef23b7ea918c.png

字典字面量语法更灵活,速度更快,但最重要的是,我发现它更清楚地传达了我们正在创建一个字典的事实。

就像list和tuple一样,一个空字典也应该使用字面量语法来创建:

35b54b1d8057c82ccdd7bb5faa8db81e.png

使用{}稍微提高了CPU效率,但更重要的是,它更符合人们的习惯: 使用大括号({})创建字典是很常见的,但是dict出现的频率要低得多。

set

set函数生会成一个新的集合,它接受一个带有可哈希值的迭代器(字符串、数字或其他不可变类型),并返回一个set:

3f45da723e1f3141332122a5ce5de745.png

使用{}集合字面量语法(纯 {} 会创建一个字典)无法生成空集合,因此set函数是生成空集的唯一方法:

0566e06c8b2ec6f144144ee65f55400a.png

事实上,这是一个谎言,因为我们有这个:

37bbb54d596351ee13f3a3ee72abe7bd.png

但是这种语法令人困惑(它依赖于*操作符的一个不太常用的特性),所以我不推荐使用它。

range

range函数给我们返回一个range对象,它表示一个数字范围:

0aec5ae89b3c4f40a425aaaaa0d0ab61.png

得到的数字范围包括开始数字,但不包括停止数字(range(0,10)不包括10)。

当你想对一些数字进行循环时,range函数很有用。

a5b2b801c41b93b017d8478503ac2b56.png

一个常见的用例是执行一个操作n次(顺便说一下,这是一个列表推导式):

c9c6e30d94ffc9e183862c2c6c9ab4c7.png

Python 2的range函数会返回一个列表,这意味着上面的表达式将生成非常非常大的列表。python3的range运行方式与python2的xrange类似(尽管它们有一点不同),因为当我们在这些range对象上循环时,数字是延迟计算的。

被新进的Python高手忽略的内置函数

如果你已经使用Python编程了一段时间,或者刚刚学习了Python类的介绍,那么你可能已经了解了上面的内置函数。

现在,我想展示15个内置函数,这些函数非常便于了解,但是常常被新进的Python高手所忽略。

你将在Python代码中发现前10个函数,但最后5个函数最常在调试时使用。

bool

bool函数会检查一个Python对象的真实性。

对于数字,真实性是一个非零的问题:

a93a100f34168f9e6222eb3b9a265d8a.png

对于集合,真实性通常是一个非空的问题(集合的长度是否大于0):

9a0d328a08a9065ed7fcb81a19ca1e4e.png

真实性(在文档中称为真值测试)在Python中非常重要。

代替询问一些关于一个容器长度的问题,许多Python高手会问一些有关真实性的问题:

ee0f06b57bdd274267921cd3fcfff260.png

你可能不会经常看到bool的使用,但是在需要将值强制转换为布尔值以询问其真实性的情况下,你会想要了解bool。

enumerate

每当你需要向上计数时,每次一个数字,同时循环遍历一个迭代器, enumerate函数就会派上用场。

这似乎是一个非常小众的任务,但它经常出现。

例如,我们可能想要跟踪一个文件中的行号:

75320740591e977b1c690cde4d228b9a.png

enumerate函数也常常用来跟踪序列中项目的索引。

ea416ffb860de77464767bb164ff432f.png

注意,你可能会看到较新的Python专家在Python中使用range(len(sequence))。如果你看到带有range(len(…))的代码,那你几乎总是希望使用enumerate来代替。

214a013a7023ce65f89a917143737f14.png

如果enumerate对你来说是一个新用法(或者如果你经常使用range(len(…)),请查看我关于在Python中使用索引进行循环的文章。

zip

zip函数甚至比enumerate函数更加专门化。

zip函数用于同时循环多个迭代器。

d6edde29ca961c54d4ea17730dde6557.png

如果你必须同时循环两个列表(或任何其他迭代器),则首选zip而不是enumerate。当你在循环时需要索引时,enumerate函数非常方便,但是当我们特别关心同时循环两个迭代器时,zip就非常棒了。

如果你是zip新手,我还将在我的“使用索引进行循环”文章中讨论它。

enumerate 和 zip都会向我们返回迭代器。迭代器是用来增强for循环的延迟可迭代对象。我有一个关于迭代器的完整讨论,以及一篇关于如何创建自己的迭代器的高级文章。

顺便说一下,如果你需要对不同长度的迭代器使用zip,你可能需要在Python标准库中查看 itertools.zip_longest。

reversed

reversed函数,像enumerate和zip一样,也会返回一个迭代器。

129ed821e99fa8bf8d13c7959b5b95da.png

我们可以对这个迭代器做的唯一一件事就是对它进行循环(但只能循环一次):

ac0a9391fac2caf9624988653202e37f.png

与enumerate和zip类似,reversed是一种循环辅助函数。你会更多的发现,reversed专门用于for循环的for部分中:

c5f849ef16ab381182d0dc4dd047c6d4.png

除了reversed函数外,还有其他方法可以反转Python列表:

95e2aeca474edc7b39139f239cd140b8.png

但是reversed函数通常是反转Python中任何可迭代对象的最佳方法。

与列表的reverse方法(例如numbers.reverse())不同,reversed方法不会改变列表(相反,它返回一个反转项的迭代器)。

与numbers[::-1]切片语法不同,reverse (numbers)不会构建一个全新的列表:它返回的延迟迭代器会在我们进行循环时逆向地检索下一项。此外,reversed(numbers) 比numbers[::-1]更具可读性(如果你以前从未见过这种特殊的切片用法,那么它看起来会很奇怪)。

如果我们结合了reversed 和 zip函数的非复制特性,我们就可以重写palindromic函数(来自上面的enumerate),而不需要占用任何额外的内存(这里不会复制列表):

ef638a0b4df6b87e89f97949d3f3698d.png

sum

sum函数接受一个带有数字的迭代器,并返回这些数字的和。

a26df7f3ef5618a19a8fd0a3f9649c15.png

没有比这更多的了。

Python有很多帮助函数可以为你执行循环,部分原因是它们与生成器表达式能很好地匹配:

011754c7df698cb199f34526951ac908.png

如果你对生成器表达式感兴趣,我在我的“可理解的推导式”演讲(以及我3小时的关于“推导式和生成器表达式“的教程)中讨论了它们。

min 和 max

min和max函数实现了你所期望的功能:它们会为你返回一个迭代器中的最小和最大项。

8837d2b69e9c6892b8894261a25fa310.png

min和max函数使用

min和max函数还可以接受一个key函数,允许你自定义特定对象的“最小”和“最大值”的真正含义。

sorted

sorted函数接受任何可迭代的对象,并以排序后的顺序返回该可迭代对象中所有值的一个新列表。

0f6f27ea56d0df3a9158e26228eebb36.png

与min和max类似,sorted函数使用

sorted函数还允许通过一个key函数来自定义排序过程(就像min和max)。

顺便说一下,如果你对sorted和list.sort方法的比较感兴趣的话,Florian Dahlitz写了一篇文章来比较这两种方法。

any 和 all

any和all函数可以与生成器表达式配对,以确定一个可迭代对象中的任意项和所有项是否与给定条件相匹配。

我们前面的palindromic函数会检查所有项是否与它们的反转序列中的对应项相等(第一个值是否等于最后一个值,第二个值是否等于倒数第二个值,等等)。

我们可以使用all函数像这样来重写palindromic函数:

2a4117cf04c4a616919006dddd2363ee.png

将all函数中的条件和返回值全部否定时,我们可以等价地使用any(尽管在这个例子中这有点令人困惑):

da21e2985477b5c4490e028ea21effb5.png

如果any和all函数对你来说是新的,那么你可能想阅读我关于它们的文章:《在Python中检查所有项是否与一个条件相匹配》。

英文原文:https://treyhunner.com/2019/05/python-builtins-worth-learning/ 
译者:测试
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值