Py学习  »  Python

代码在Python中的工作方式。(forloop)[副本]

monsoon • 5 年前 • 1521 次点击  
foo = [x for x in bar if x.occupants > 1]

在这里谷歌搜索之后,还不知道这是怎么回事。也许我找不到合适的东西,但在这里。在揭穿这个速记的任何投入都是非常感谢的。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/38898
 
1521 次点击  
文章 [ 4 ]  |  最新文章 5 年前
World Engineer
Reply   •   1 楼
World Engineer    14 年前

据我所知,这种方法的工作方式是检查列表“栏”是否为空(0)或由通过x.occupants的单件(1)组成,其中x是列表栏中定义的项目,可能具有occupants的特征。所以foo被调用,在列表中移动,然后返回所有通过检查条件的项目,即x.occupant。

在像Java这样的语言中,您将构建一个类,称为“x”,其中x’对象然后被分配给数组或类似的对象。X将有一个名为“占用者”的字段,并且每个索引将使用X.occupants方法进行检查,该方法将返回分配给占用者的编号。如果该方法返回的值大于1(我们假定此处的int为部分占用者将是奇数),则foo方法(在数组上被调用或类似的问题)将返回一个数组或类似的数组,如foo方法中为此容器数组定义的或您拥有的。返回数组的元素将是第一个数组元素中符合“大于1”条件的“x”对象。

python有通过列表理解的内置方法,以更简洁和大大简化的方式来处理这个问题。我不是实现两个完整的类和几个方法,而是编写一行代码。

Kien Truong
Reply   •   2 楼
Kien Truong    14 年前

这将返回一个列表,其中包含酒吧中所有具有居住者>1的元素。

John La Rooy
Reply   •   3 楼
John La Rooy    14 年前

这是一个 list comprehension

foo 将是筛选的列表 bar 包含具有属性occupants>1的对象

酒吧 可以是一个 list , set , dict 或任何其他不能

下面是一个要澄清的例子

>>> class Bar(object):
...   def __init__(self, occupants):
...     self.occupants = occupants
... 
>>> bar=[Bar(0), Bar(1), Bar(2), Bar(3)]
>>> foo = [x for x in bar if x.occupants > 1]
>>> foo
[<__main__.Bar object at 0xb748516c>, <__main__.Bar object at 0xb748518c>]

所以foo有2个 Bar 对象,但我们如何检查它们是哪些对象?让我们添加一个 __repr__ 方法 酒吧 所以它更具信息性

>>> Bar.__repr__=lambda self:"Bar(occupants={0})".format(self.occupants)
>>> foo
[Bar(occupants=2), Bar(occupants=3)]
UltraInstinct
Reply   •   4 楼
UltraInstinct    8 年前

目前的答案是好的,但不要谈论它们是怎样的 syntactic sugar 我们已经习惯了。

让我们从一个例子开始,假设我们有10个数字,我们想要一个大于5的数字的子集。

>>> numbers = [12, 34, 1, 4, 4, 67, 37, 9, 0, 81]

对于上述任务,下面的方法完全相同,从最冗长的到简洁的、可读的和 蟒蛇的 :

方法1

result = []
for index in range(len(numbers)):
    if numbers[index] > 5:
        result.append(numbers[index])
print result  #Prints [12, 34, 67, 37, 9, 81]

方法2(稍微干净一点,用于环路内)

result = []
for number in numbers:
    if number > 5:
        result.append(number)
print result  #Prints [12, 34, 67, 37, 9, 81]

方法3(输入列表理解)

result = [number for number in numbers if number > 5]

一般来说:

[function(number) for number in numbers if condition(number)]

在哪里?

  • function(x) 接受 x 并将其转化为有用的东西(例如: x*x )
  • 如果 condition(x) 返回任何假Y值(假、无、空字符串、空列表等),然后将跳过当前迭代(认为 continue )如果函数返回一个非假Y值,则当前值将使其成为最终的结果数组(并通过上面的转换步骤)。

要以稍微不同的方式理解语法,请查看下面的奖励部分。

有关更多信息,请遵循教程中所有其他答案都已链接: List Comprehension


奖金

(稍微没有蟒蛇的味道,但为了完整起见放在这里)

上面的例子可以写成:

result = filter(lambda x: x > 5, numbers)

上面的一般表达式可以写成:

result = map(function, filter(condition, numbers)) #result is a list in Py2