首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

10万人不会这几个Python问题,搞懂超过90%的学习者

本文挑选了全球第二大同性交友网站StackOverflow上被点赞最多的10个问题,其中总点赞数超过了5万,考虑到很多白嫖党,至少有10万人对这些问题感兴趣!

这么多人点赞,说明两个问题:

这些问题很常用,编程的时候经常碰到

这些问题不简单,否则不用去论坛上文

10个问题,看看你会几个?

Yield关键词是做什么的?

ifname== 'main'是做什么的 ?

Python有三元运算符吗?

Python的metaclasses是做什么的?

如果在不出异常的情况下检查文件是否存在?

如何一句话合并两个字典?

Python如何调用外部命令,比如启动QQ?

如何安全的创建一个多层文件夹?

循环中如何访问下标?

staticmethod和classmethod的区别?

这10个问题,有的复杂,有的简单。你会几个呢?可以在评论区留言。

我原本打算讲解10个问题,但由于篇幅原因,本文只涵盖了被问最多的一个问题,后续文章可能会涵盖多个问题。

下面我们重点看第一个问题:

yield关键词是做什么的?

这个问题是所有Python问题的排名第一:

有10000多人对问题点赞,表示有同样疑问。

其中高赞回答有15000多点赞。

有超过2百40万的浏览。

我曾经录制过一个关于Yield关键词的视频,自认为比高赞答案还要更清楚一点,建议视频和答案一起看。

问题详细内容?

Yield关键词是做什么的?

比如下面的代码:

这是调用的代码:

当_get_child_candidates被调用时,发生了什么?返回了一个list吗?还是一个元素?它会被反复调吗?后续调用什么时候停止?

看着有点懵?可以继续往下看解答,然后再回来看问题。

最高赞回答 (15000多赞)

要理解yield,先理解generators,要理解generators先理解iterable(可迭代的)。

Iterables

当你创建1个list,你可以一个个读取它的值,这叫做迭代:

上面mylist是一个iterable(可以被迭代的)。当你使用一个列表推导式,你创建了一个列表,也就是一个iterable:

所以可以使用for...in...语法遍历的就是iterable:list, str, file等等

这些iterable很有用,你可以循环访问他们。但是它们所有的值都保存在内存中。如果你的list中有10亿个字符串的时候,创建这个list会很慢,而且会很占用内存,所以我们需要Genertor.

Generators

Generator是iterable,可以被循环。但和上面不一样,它一般只能被循环一次。它不会把所有的值保存在内存中,他们在循环中动态产生元素的值。

这个生成器和列表推导式几乎一样,唯一区别使用小括号(),而不是中括号[]. 但,你不能两次使用for i in mygenerator,因为生成器只能被循环一次:他们计算0x0,返回结果,自己并不保存,下一次调用它,他计算1x1,以此类推。

Yield

Yields是一个关键词,可以先理解成和return一样,区别是它返回一个generator.

上面这个例子先创建了range,已经占用了内存,但平方数没有占用。这个例子不是很好,这是原作者举的,我的视频中应该有更好的例子。

首先,因为yield的存在,当你调用上面的函数,里面的代码并没有执行,而不是返回了一个Generator。

然后是关键的地方:

当for循环第一次调用generator的时候,它会从头开始执行,直到yield关键词,返回第一个值,也就是0。

然后记住执行到哪一行代码,也就是yield的位置。

下次for循环再次调用它,它从yield的下一行继续执行,直到再次碰到yield,返回下一个值,也就是1.

这个过程一直重复,直到generator中没有内容了。例子中就是range里的数字被用完。

现在再看看最开始的问题:

这是一个对树的遍历算法,查找树上符合条件的节点。代码中加了详细的中文注释。

Generator:

Caller:

点赞是美德

快速翻看这篇文章很容易,但只有实在掌握了这些问题才能对你有帮助!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20210117A0290Y00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券