python choices,choice函数python
要知道yield的作用,你需要知道什么是发电机。另外,在理解生成器之前,必须先理解_iterables_。
可重复:可迭代
要创建一个列表,您必须逐个读取每个元素。逐个读取此项的过程称为迭代:我的列表=[1,2,3]
因为我在我的列表中:打印(一))。
一个
2
三
我的列表是可重复的。使用列表派生表达式来创建列表和迭代。mylist=[x*xforxinrange(3]) ]
因为我在我的列表中:打印(一))。
0
一个
四
所有可用于for.in .的数据结构都是可重复的;列表,字符串,文件。
这些可重复的方法很有用,因为它们可以自由读取,但所有的值都保存在内存中,如果值很多,就不一定需要了。
发电机:发电机
生成器也是迭代器,迭代器是特殊迭代,只能进行一次特殊迭代。生成器不是将所有值保存在内存中,而是立即生成值。发电机:发电机,发电机,发电机发电但不储电;)my generator=(x * xforxinrange(3)))))))))my generator=(x * xforxinrange(3)))))))my generator)65
对于我的生成器中的I:打印(一))。
0
一个
四
如果使用""而不是" ",列表导出表达式将成为生成器导出表达式。但是,因为生成器只能使用一次,所以不可能第二次运行我的生成器中的for I。生成器计算0,丢弃它,然后计算1,最后计算4。一只典型的可靠黄蜂正在烹饪。
转移:产量
yield关键字的用法与return相同,只是函数返回到生成器。创建生成器():我的列表=范围(3))。因为我在我的列表中:产量i*i。
创建我的生成器=创建生成器#生成器
打印(我的生成器)#我的生成器是一个对象!
对于我的生成器中的I:打印(一))。
0
一个
四
这个例子本身没什么用,但是如果函数需要返回大量的值,而且只需要读取一次,那么用yield会很有用。
为了掌握yield,调用函数时,不执行函数主体描述的代码,函数只返回生成器对象。新手需要明确这一点,容易混淆。
接下来,请理解每次for使用生成器时,代码将从中断处继续。
现在最困难的部分是:
当在第一个for调用中调用基于函数的生成器对象时,函数中的代码将从头开始执行,直到找到为止,并将返回循环的第一个值。然后,每个后续调用将执行由函数描述的循环的下一次迭代,并返回以下值:这将继续,直到生成器被认为是空的。如果一个函数在执行时没有被命中,就会产生yield。那可能是因为循环结束了,或者是因为‘if/else’不再满足。屈服:承受,付出,转移,屈服,让位。
用代码解释
生成器:#如何创建返回生成器
def_get_child_candidates(self,distance,min_dist,max_dist):
#当使用一次生成器对象时,下面的代码将被调用一次:
#如果有一个左边的子对象节点,并且距离是右边的,请返回到下一个子对象。
如果自我。_ leftchildanddistance-max _ dist self。_中位数3360
屈服自我。_左孩
#如果有一个右子对象节点,并且距离合适,则返回到下一个子对象节点。
如果自我。_ rightchildanddistancemax _ dist=self。_中位数3360
屈服自我。_儿童权利
到目前为止,函数已经被执行,生成器被认为是空的。
#此处,左右子对象不超过2个。
调用方:#用一个空列表和对当前对象的引用创建一个列表。
结果,候选人=list(),[self]
#循环候选数据
Es(开头只有一个元素)
候选人:
#选择最后一个候选人,并将其从列表中删除
node=candidates.pop()
#获取对象和候选对象之间的距离
距离=节点。_get_dist(obj)
#如果距离合适,请填写结果。
如果距离=最大距离且距离=最小距离:
结果.扩展(节点。_值)
#并将候选人的子元素添加到列表中
#循环,直到candidate的所有子元素都被锁定。
candidates.extend(节点。_get_child_candidates(distance,min_dist,max_dist))
回送结果
这段代码包含几个智能部分:遍历一个列表循环,但是循环迭代的时候列表会展开:-)这是浏览所有这些嵌套数据的简洁方法,即使这样做有点危险,因为你可能会遇到一个无限循环。在这种情况下,请询问candidates.extend (node。_ get _ child _ candidates (distance,min _ dist,max _ dist))用尽所有生成器的值,但while继续创建新的生成器对象,因为它们没有应用于同一个节点,所以将生成与以前不同的值。
extend()方法是一个list对象方法,它期望迭代并将其值添加到列表中。
通常我们传递给它一个列表:a=[1,2]
b=[3,4]
a .扩展(b)
打印(一份)
[1, 2, 3, 4]
但是在上面的代码中,你得到了一个生成器,这样更好,因为:你不需要两次读取值。
可能有许多子元素,您不希望所有子元素都存储在内存中。
这是可行的,因为Python不关心方法的参数是否是列表。Python期望iterable对象,所以可以和字符串、列表、元组、生成器一起使用!这就是所谓的鸭子输入,这也是Python这么酷的原因之一。但这是另一个故事了.
控制器运行出类Bank(): #建立一个银行,弄几个ATM机。
.危机=错误
.定义创建_自动柜员机(自身):
.而不是自我危机:
.收益 100美元
Hsbc=Bank() #如果一切顺利的话,你想要多少台自动取款机,我就给你多少台。
corner _ street _ ATM=HSBC . create _ ATM()
print(corner_street_atm.next())
$100
print(corner_street_atm.next())
$100
print([corner _ street _ ATM . next()for cash in range(5)])
[$100, $100, $100, $100, $100]
Hsbc.crisis=True #危机来了,不行,没钱!
print(corner_street_atm.next())
wall _ street _ ATM=HSBC . create _ ATM()#新的自动柜员机是一样的。
print(华尔街自动柜员机. next())
Hsbc.crisis=False #危机后ATM里没钱了。
print(corner_street_atm.next())
brand _ new _ ATM=HSBC . create _ ATM()#做一个新的,做一个甜甜的月亮
对于全新自动柜员机中的现金:
.打印现金
$100
$100
$100
$100
$100
$100
$100
$100
$100
.
注意:对于Python 3,请使用print (corner _ street _ ATM。_ _ next _ _())或print(next(corner_street_atm))
这对于各种事情都很有用,比如控制对资源的访问。
Itertools,你最好的朋友
Itertools模块包含操作可迭代对象的特殊函数。你有没有想过复制发电机?互锁两个发电机?在一个嵌套列表中嵌套值?Map/Zip没有创建另一个列表?
然后导入itertools。
一个例子?我们来看看四马比赛可能的到达顺序:马=[1,2,3,4]
比赛=工具.排列(马)
印刷品(比赛)
print(list(ITER tools . permutations(horses)))
[(1, 2, 3, 4),
(1, 2, 4, 3),
(1, 3, 2, 4),
(1, 3, 4, 2),
(1, 4, 2, 3),
(1, 4, 3, 2),
(2, 1, 3, 4),
(2, 1, 4, 3),
(2, 3, 1, 4),
(2, 3, 4, 1),
(2, 4, 1, 3),
(2, 4, 3, 1),
(3, 1, 2, 4),
(3, 1, 4, 2),
(3, 2, 1, 4),
(3, 2, 4, 1),
(3, 4, 1, 2),
(3, 4, 2, 1),
(4, 1, 2, 3),
(4, 1, 3, 2),
(4, 2, 1, 3),
(4, 2, 3, 1),
(4, 3, 1, 2),
(4, 3, 2, 1)]
理解迭代的内部机制
迭代是一个隐含可迭代对象(实现__iter__()方法)和迭代器(实现__next__()方法)的过程。可迭代对象是可以从中获得迭代器的任何对象。迭代器是一个允许你迭代可迭代对象的对象。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。