python choices,choice函数python

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: