Python 如何在列表中构建压缩for循环

Python 如何在列表中构建压缩for循环,python,python-3.x,syntax,Python,Python 3.x,Syntax,我遇到了一段非常精简的代码,它使用for循环和if语句查找字符串中的所有数字,并将它们添加到列表中。问题是我不明白它为什么会起作用 string = "h3110 23 cat 444.4 rabbit 11 2 dog" alist = [int(s) for s in string.split() if s.isdigit()] print (alist) 这将打印['23','11','2'] 有两位我没有得到: 第2行int(s)中的“s”是如何定义的,即使它是在for循环之前输入的

我遇到了一段非常精简的代码,它使用for循环和if语句查找字符串中的所有数字,并将它们添加到列表中。问题是我不明白它为什么会起作用

string = "h3110 23 cat 444.4 rabbit 11 2 dog"
alist = [int(s) for s in string.split() if s.isdigit()]
print (alist)
这将打印
['23','11','2']

有两位我没有得到:

  • 第2行int(s)中的“s”是如何定义的,即使它是在for循环之前输入的
  • 为什么这段代码在if语句中没有else/return/pass/etc.参数
  • 此代码基本上执行以下操作:

    alist = []
    for s in string.split():
        if s.isdigit():
            alist.append(s)
        else:
            pass
    print (alist)
    

    一行程序与您在下面写的完全相同,只是
    s
    被转换为整数(它应该是
    alist.append(int(s))

    一行是如何工作的?它创建一个现有列表中所有元素的新列表(在您的例子中,现有列表是
    string.split()
    ),如果
    之后的条件为true,则该元素确实是一个数字。

    这不是“列表中的for循环”。这是Python中称为“列表理解”的特殊语法基本语法是:
    [for in]
    或带有可选条件:
    [for in if]
    。它基本上转化为:

    new_list = []
    for <var> in <iterable>:
        if <condition>:
            new_list.append(<expression>)
    
    new_list=[]
    例如:
    如果:
    新建_list.append()
    
    听起来您似乎理解正确,只是不知道这是一种特殊的语法,这就是为什么它看起来像是在试图访问一个尚未声明或定义的变量。如果您感兴趣,可以在此处找到有关它们如何工作的更多信息: