ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-02-02 12:01:31  阅读:184  来源: 互联网

标签:10 dist Python self yield candidates ._ 搞懂


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

在这里插入图片描述
这么多人点赞,说明两个问题:

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

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

在这里插入图片描述

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

1.Yield关键词是做什么的?

2.ifname== 'main’是做什么的 ?

3.Python有三元运算符吗?

4.Python的metaclasses是做什么的?

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

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

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

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

9.循环中如何访问下标?

10.staticmethod和classmethod的区别?

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

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

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

yield关键词是做什么的?

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

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

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

3.有超过2百40万的浏览。

问题详细内容?

Yield关键词是做什么的?

比如下面的代码:

def _get_child_candidates(self, distance, min_dist, max_dist):
    if self._leftchild and distance - max_dist < self._median:
        yield self._leftchild
    if self._rightchild and distance + max_dist >= self._median:
        yield self._rightchild  
        

这是调用的代码:

result, candidates = [], [self]
while candidates:
    node = candidates.pop()
    distance = node._get_dist(obj)
    if distance <= max_dist and distance >= min_dist:
        result.extend(node._values)
    candidates.extend(node._get_child_candidates(distance, min_dist, max_dist))
return result

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

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

最高赞回答 (15000多赞)

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

Iterables

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

>>> mylist = [1, 2, 3]
>>> for i in mylist:
...    print(i)
1
2
3

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

>>> mylist = [x*x for x in range(3)]
>>> for i in mylist:
...    print(i)
0
1
4

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

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

Generators

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

>>> mygenerator = (x*x for x in range(3))
>>> for i in mygenerator:
...    print(i)
0
1
4

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

Yield

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


>>> def createGenerator():
...    mylist = range(3)
...    for i in mylist:
...        yield i*i
...
>>> mygenerator = createGenerator() # create a generator
>>> print(mygenerator) # mygenerator is an object!
<generator object createGenerator at 0xb7555c34>
>>> for i in mygenerator:
...     print(i)
0
1
4

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

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

然后是关键的地方:

  • 当for循环第一次调用generator的时候,它会从头开始执行,直到yield关键词,返回第一个值,也就是0。
  • 然后记住执行到哪一行代码,也就是yield的位置。
  • 下次for循环再次调用它,它从yield的下一行继续执行,直到再次碰到yield,返回下一个值,也就是1.
  • 这个过程一直重复,直到generator中没有内容了。例子中就是range里的数字被用完。

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

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

Generator:

# 这个函数会返回一个生成器(Generator),这是一个二叉树的node对象中的方法
def _get_child_candidates(self, distance, min_dist, max_dist):

    # 如果还有左孩子,并且距离符合条件,返回左孩子,然后暂停在这里
    if self._leftchild and distance - max_dist < self._median:
        yield self._leftchild

    # 如果还有右孩子,并且距离符合条件,返回右孩子,然后暂停在这里
    if self._rightchild and distance + max_dist >= self._median:
        yield self._rightchild

    # 如果执行到了这里,说明没有符合条件的左右孩子了,生成器空了,就迭代结束了。

Caller:

# 创建一个空的列表,和当前对象节点
result, candidates = list(), [self]

# 循环,开始里面只有自己
while candidates:

    # 弹出最后一个节点
    node = candidates.pop()

    # 获得obj对象和目标节点的距离
    distance = node._get_dist(obj)

    # 如果距离ok,写入到结果列表中
    if distance <= max_dist and distance >= min_dist:
        result.extend(node._values)

    # 把自己的子节点加入到candidates中,这样循环会继续,直到树上的所有节点都被遍历
    candidates.extend(node._get_child_candidates(distance, min_dist, max_dist))

return result

关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

五、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。


这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

在这里插入图片描述

标签:10,dist,Python,self,yield,candidates,._,搞懂
来源: https://blog.csdn.net/m0_59235945/article/details/122759887

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有