10万人不会这几个Python问题,搞懂超过90%的学习者10个问题,看看你会几个?yield关键词是做什么的?问题详细内容?最高赞回答 (15000多赞)IterablesGeneratorsYie
原标题: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关键词是做什么的?
比如下面的代码:
def_get_child_candidates(self,distance,min_dist,max_dist):
ifself._leftchildanddistance-max_dist<self._median:
yieldself._leftchild
ifself._rightchildanddistance+max_dist>=self._median:
yieldself._rightchild
这是调用的代码:
result,candidates=[],[self]
whilecandidates:
node=candidates.pop()
distance=node._get_dist(obj)
ifdistance<=max_distanddistance>=min_dist:
result.extend(node._values)
candidates.extend(node._get_child_candidates(distance,min_dist,max_dist))
returnresult
当_get_child_candidates被调用时 , 发生了什么?返回了一个list吗?还是一个元素?它会被反复调吗?后续调用什么时候停止?
看着有点懵?可以继续往下看解答 , 然后再回来看问题 。
最高赞回答(15000多赞)要理解yield , 先理解generators , 要理解generators先理解iterable(可迭代的) 。
Iterables当你创建1个list , 你可以一个个读取它的值 , 这叫做迭代:
>>>mylist=[1,2,3]
>>>foriinmylist:
...print(i)
1
2
3
上面mylist是一个iterable(可以被迭代的) 。 当你使用一个列表推导式 , 你创建了一个列表 , 也就是一个iterable:
>>>mylist=[x*xforxinrange(3)]
>>>foriinmylist:
...print(i)
0
1
4
所以可以使用for...in...语法遍历的就是iterable:list,str,file等等
这些iterable很有用 , 你可以循环访问他们 。 但是它们所有的值都保存在内存中 。 如果你的list中有10亿个字符串的时候 , 创建这个list会很慢 , 而且会很占用内存 , 所以我们需要Genertor.
GeneratorsGenerator是iterable , 可以被循环 。 但和上面不一样 , 它一般只能被循环一次 。 它不会把所有的值保存在内存中 , 他们在循环中动态产生元素的值 。
>>>mygenerator=(x*xforxinrange(3))
>>>foriinmygenerator:
...print(i)
0
1
4
这个生成器和列表推导式几乎一样 , 唯一区别使用小括号() , 而不是中括号[].但 , 你不能两次使用foriinmygenerator , 因为生成器只能被循环一次:他们计算0x0 , 返回结果 , 自己并不保存 , 下一次调用它 , 他计算1x1,以此类推 。
YieldYields是一个关键词 , 可以先理解成和return一样 , 区别是它返回一个generator.
>>>defcreateGenerator():
...mylist=range(3)
...foriinmylist:
...yieldi*i
>>>mygenerator=createGenerator()#createagenerator
>>>print(mygenerator)#mygeneratorisanobject!
<generatorobjectcreateGeneratorat0xb7555c34>
>>>foriinmygenerator:
【10万人不会这几个Python问题,搞懂超过90%的学习者10个问题,看看你会几个?yield关键词是做什么的?问题详细内容?最高赞回答 (15000多赞)IterablesGeneratorsYie】...print(i)
0
1
4
上面这个例子先创建了range , 已经占用了内存 , 但平方数没有占用 。 这个例子不是很好 , 这是原作者举的 , 我的视频中应该有更好的例子 。首先 , 因为yield的存在 , 当你调用上面的函数 , 里面的代码并没有执行 , 而不是返回了一个Generator 。
- 以太币会不会像比特币越挖越少 来了解清晰!
- 牛市旗手”归来?券商股大爆发,又见券商回购,这波行情能走多远?
- 一诺|一诺巅峰赛上分如喝水,2400分补位不开麦,这就是天才选手
- 谁说碎花裙是少女专属?春季掌握这些搭配思路,轻松解锁轻熟美
- 美国“芯荒”
- 20万的SUV中好车不少,这几台经济省油,还是销量王
- 一加|一加高管提前火力全开,这是为新机预热吗?
- 这类新职业火了!超四成从业者年薪超10万元
- 香椿|西安香椿一斤最贵卖到45元 这两天价格回落
- 卖爆了!这种车火了!连续11个月,销量刷新纪录!啥情况?
