Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 列表理解中的条件。为什么我使用';还有别的吗;?_Python_List_Conditional Statements_List Comprehension - Fatal编程技术网

Python 列表理解中的条件。为什么我使用';还有别的吗;?

Python 列表理解中的条件。为什么我使用';还有别的吗;?,python,list,conditional-statements,list-comprehension,Python,List,Conditional Statements,List Comprehension,代码A: (如您所知,此位置是一个语法错误。) 在任何情况下都可能出现问题吗?numbers=[2,-1,79,33,-45] numbers = [2, -1, 79, 33, -45] negative_doubled = [num * 2 if num < 0 for num in numbers] # SyntaxError print(negative_doubled) 负的_double=[num*2如果num=0,您需要告诉您的机器发生了什么。您可以认为Python中的理

代码A:

(如您所知,此位置是一个语法错误。)

在任何情况下都可能出现问题吗?

numbers=[2,-1,79,33,-45]
numbers = [2, -1, 79, 33, -45]
negative_doubled = [num * 2 if num < 0 for num in numbers] # SyntaxError
print(negative_doubled) 
负的_double=[num*2如果num<0,则为num]#语法错误 打印(负片)

如果num>=0,您需要告诉您的机器发生了什么。

您可以认为Python中的理解始终遵循以下通用格式:

[在某些条件下按顺序表示iter变量]
其中,除非为
某些条件
给出显式布尔表达式,否则假定为真

表达式可以是Python中的任何有效表达式,包括遵循以下格式的三元表达式

x=val如果条件其他值
这相当于

如果条件:
x=val
其他:
x=其他值
一种理解是一个简单的过滤器,
[x代表x在seq if cond]
。另一个是三元表达式
[x if cond else y for uu in seq]

过滤理解的示例:

>>[x表示范围(10)内的x,如果x%2==0]
[0, 2, 4, 6, 8]
这相当于

res=[]
对于范围(10)内的x:
如果x%2==0:
res.append(x)
下面是一个三元理解的例子:

>>[x**2如果x%2==0,则x**3对于范围(10)内的x]
[0, 1, 4, 27, 16, 125, 36, 343, 64, 729]
这相当于

res=[]
对于范围(10)内的x:
res.append(如果x%2==0,则x**2,否则x**3)
以下是两种方法结合的示例:

lst=[1,“a”,“b”,3,“2”,6] >>>[x**2如果x%2==0,则x**3如果存在(x,int),则表示lst中的x] [1, 27, 36]
这相当于

res=[]
对于范围(10)内的x:
如果isinstance(x,int):
res.append(如果x%2==0,则x**2,否则x**3)
TL;博士
你可以认为理解实际上有一个统一的结构:

[在某些条件下按顺序表示iter变量]
表达式
可以是任何东西,甚至是一个本身包含
if
else
关键字的三元表达式,但实际上与所有理解都基于的
某个条件
无关


我不知道,我喝醉了,我觉得我解释得不好,也不想再尝试了。

我想这样编码的原因是,我认为,这样可以更容易地删除else语句,并毫无问题地运行代码。我不理解你的问题。这似乎只是你对语法和语言设计观点的陈述。事实上,是的,我现在要求的是语言设计。。我想我说的方式可以更直观。所以我很好奇,想找到一个我不能用这种方式设计语言的原因。对我来说,这似乎不直观。那部分的内容应该是一个表达式。在您的语法中,它不是一个表达式,它不会计算为任何值。投票重新打开。虽然这看起来像是一个意见问题,但它确实源于对列表理解的一个轻微误解,@blorgon的回答很好地解释了这一点。是的,但我要求的是语言设计。。我认为我在帖子中的做法可以更直观,更容易删除else语句,并且运行时不会出现问题。所以我很好奇,想找到一个我不能这样设计语言的原因。@mushroom1324但是删除
else
部分有什么关系呢?因为我认为它可以在代码上保持一致性,但现在我试图理解你的评论。我不知道为什么我的语法没有计算成任何东西..@mushroom1324但是什么样的一致性呢?列表理解的两个部分是表达式和谓词(第三部分是for claus,它定义了iterable是什么,但我们忽略它)。仅当谓词为true时才计算表达式。为什么把它们混合在一起会更一致?我不确定这是如何回答这个问题的,OP似乎理解列表理解是如何工作的,但OP显然不理解理解是如何工作的。一种是对收集的值使用三元赋值表达式,另一种是使用筛选语句。这个答案试图解释差异。嗯,不,OP cleary确实理解,他们在问为什么语法没有不同,谓词会与表达式混淆,也许答案涉及“当表达式和predecate可以紧挨在一起时,编写解析器就变得更难了,特别是因为表达式可以在三元表达式的上下文中包含
if
”。或者答案可能类似于“列表理解基于数学集合生成器符号,这通常涉及一个用冒号或管道分隔的谓词“@juanpa.arrivillaga是的,这是一个你可以提供的好答案。不过,这不是唯一的答案。如果他知道两者之间的区别(它们是不同的
if
s),那么他就不会问这个问题了。
numbers = [2, -1, 79, 33, -45]
doubled = [num * 2 if num < 0 else num * 3 for num in numbers ]
print(doubled) # output is: [6, -2, 237, 99, -90]
numbers = [2, -1, 79, 33, -45]
negative_doubled = [num * 2 if num < 0 for num in numbers] # SyntaxError
print(negative_doubled) 
numbers = [2, -1, 79, 33, -45]
negative_doubled = [num * 2 if num < 0 else num for num in numbers] # SyntaxError
print(negative_doubled)