Python:复杂的for循环

Python:复杂的for循环,python,python-3.x,for-loop,if-statement,Python,Python 3.x,For Loop,If Statement,我正在编写一些代码,试图理解一些Python机制,但我不懂。我想它很简单,我现在也知道它是做什么的,但我不知道它是如何工作的。我理解对于-循环的正常用法,但这里。。。我不知道 备注:我知道一些Python,但我不是专家 np.array([[[S[i,j]] for i in range(order+1)] for j in range(order+1)]) 我遇到的第二个问题是: for i in range(len(u)): for j in range(len(v)):

我正在编写一些代码,试图理解一些Python机制,但我不懂。我想它很简单,我现在也知道它是做什么的,但我不知道它是如何工作的。我理解
对于
-循环的正常用法,但这里。。。我不知道

备注:我知道一些Python,但我不是专家

np.array([[[S[i,j]] for i in range(order+1)] for j in range(order+1)])
我遇到的第二个问题是:

for i in range(len(u)):
        for j in range(len(v)):
            tmp+=[rm[i,j][k]*someFuction(name,u[i],v[j])[k] for k in range(len(rm[i,j])) if rm[i,j][k]]
最里面的
for
-循环是如何工作的?还有
if
在这里做什么

谢谢你的帮助


编辑:很抱歉,代码太难读了,我只是试着自己理解它
S,rm
是numpy矩阵,
someFunction
返回一个带有标量项的数组,
tmp
只是一个帮助变量

它是一个列表理解,尽管它很难理解。这是一些人在做一些非常“pythonic”的事情,尽管易读。只需查找列表理解,并尝试自己将其改写为传统的for循环。列表理解非常有用,我不确定我会走这条路

列表理解的语法是

[var for var in iterable if optional condition]
所以这条底线可以改写如下:

for k in range(len(rm[i,j]):
    if rm[i,j][k]:
        tmp+= rm[i,j][k]*someFunction(name,u[i],v[j])[k]

这是一个列表理解,虽然很难阅读。这是一些人在做一些非常“pythonic”的事情,尽管易读。只需查找列表理解,并尝试自己将其改写为传统的for循环。列表理解非常有用,我不确定我会走这条路

列表理解的语法是

[var for var in iterable if optional condition]
所以这条底线可以改写如下:

for k in range(len(rm[i,j]):
    if rm[i,j][k]:
        tmp+= rm[i,j][k]*someFunction(name,u[i],v[j])[k]

代码中有很多不同的概念。让我们从最基本的开始。Python和Python有不同的索引方法。您还可以通过向numpy阵列提供以下列表来构建它:

S_list  = [[1,2,3], [4,5,6], [7,8,9]]
S_array = np.array(S_list)

print(S_list)
print(S_array)

print(S_list[0][2]) # indexing element 2 from list 0
print(S_array[0,2]) # indexing element at position 0,2 of 2-dimensional array
这导致:

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[[1 2 3]
 [4 5 6]
 [7 8 9]]
3
3
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
因此,对于您的第一行代码:

np.array([[[S[i,j]] for i in range(order+1)] for j in range(order+1)])
您正在通过提供一个列表来构建一个numpy数组。此列表是根据以下概念创建的。因此
np.array(…)
方法中的代码:

[[[S[i,j]] for i in range(order+1)] for j in range(order+1)]
。。。相当于:

order     = 2
full_list = []
for j in range(order+1):
    local_list = []
    for i in range(order+1):
        local_list.append(S_array[i, j])
    full_list.append(local_list)

print(full_list)
这导致:

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[[1 2 3]
 [4 5 6]
 [7 8 9]]
3
3
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
至于第二个代码片段,需要注意的是,尽管通常numpy数组具有非常特定和恒定(对于所有数组)的单元格类型,但实际上可以将数据类型对象赋给numpy数组。因此,创建一个二维列表数组是可能的。也可以创建三维阵列。两者都与指数化
rm[i,j][k]
兼容。您可以在以下示例中对此进行检查:

rm = np.array(["A", 3, [1,2,3]], dtype="object")
print(rm, rm[2][0]) # Acessing element 0 of list at position 2 of the array

rm2 = np.zeros((3, 3, 3))
print(rm2[0, 1][2])  # This is also valid
以下代码:

[rm[i,j][k]*someFuction(name,u[i],v[j])[k] for k in range(len(rm[i,j])) if rm[i,j][k]]
。。。可以这样写:

some_list = []
for k in range(len(rm[i,j])):
    if rm[i, j][k]: # Expecting a boolean value (or comparable)
        a_list = rm[i,j][k]*someFuction(name,u[i],v[j])
        some_list.append(a_list[k])
最后一个细节是
tmp+=some\u列表
。当您对两个列表求和时,它们将连接在一起,如本简单示例所示:

tmp = []
tmp += [1, 2, 3]
print(tmp)
tmp += [4, 5, 6]
print(tmp)
其结果是:

[1, 2, 3]
[1, 2, 3, 4, 5, 6]

还要注意,将列表乘以一个数字实际上与将列表求和几次相同。因此
2*[1,2]
将导致
[1,2,1,2]

代码中有许多不同的概念。让我们从最基本的开始。Python和Python有不同的索引方法。您还可以通过向numpy阵列提供以下列表来构建它:

S_list  = [[1,2,3], [4,5,6], [7,8,9]]
S_array = np.array(S_list)

print(S_list)
print(S_array)

print(S_list[0][2]) # indexing element 2 from list 0
print(S_array[0,2]) # indexing element at position 0,2 of 2-dimensional array
这导致:

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[[1 2 3]
 [4 5 6]
 [7 8 9]]
3
3
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
因此,对于您的第一行代码:

np.array([[[S[i,j]] for i in range(order+1)] for j in range(order+1)])
您正在通过提供一个列表来构建一个numpy数组。此列表是根据以下概念创建的。因此
np.array(…)
方法中的代码:

[[[S[i,j]] for i in range(order+1)] for j in range(order+1)]
。。。相当于:

order     = 2
full_list = []
for j in range(order+1):
    local_list = []
    for i in range(order+1):
        local_list.append(S_array[i, j])
    full_list.append(local_list)

print(full_list)
这导致:

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[[1 2 3]
 [4 5 6]
 [7 8 9]]
3
3
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
至于第二个代码片段,需要注意的是,尽管通常numpy数组具有非常特定和恒定(对于所有数组)的单元格类型,但实际上可以将数据类型对象赋给numpy数组。因此,创建一个二维列表数组是可能的。也可以创建三维阵列。两者都与指数化
rm[i,j][k]
兼容。您可以在以下示例中对此进行检查:

rm = np.array(["A", 3, [1,2,3]], dtype="object")
print(rm, rm[2][0]) # Acessing element 0 of list at position 2 of the array

rm2 = np.zeros((3, 3, 3))
print(rm2[0, 1][2])  # This is also valid
以下代码:

[rm[i,j][k]*someFuction(name,u[i],v[j])[k] for k in range(len(rm[i,j])) if rm[i,j][k]]
。。。可以这样写:

some_list = []
for k in range(len(rm[i,j])):
    if rm[i, j][k]: # Expecting a boolean value (or comparable)
        a_list = rm[i,j][k]*someFuction(name,u[i],v[j])
        some_list.append(a_list[k])
最后一个细节是
tmp+=some\u列表
。当您对两个列表求和时,它们将连接在一起,如本简单示例所示:

tmp = []
tmp += [1, 2, 3]
print(tmp)
tmp += [4, 5, 6]
print(tmp)
其结果是:

[1, 2, 3]
[1, 2, 3, 4, 5, 6]

还要注意,将列表乘以一个数字实际上与将列表求和几次相同。所以
2*[1,2]
将导致
[1,2,1,2]

这根本不可读……显然有人把这当作一个笑话。可能是他/她自己。为什么是DV?这似乎是一个合法的问题…如果你想让任何人都无法理解你的代码,那么这就彻底完成了任务。伙计们,这显然是一个CodeGolf的玩家。。。看它是多么的短和凌乱!嗨@彼得,你想说什么呢:这是:这根本不可读……显然有人把这当作笑话写的。可能是他/她自己。为什么是DV?这似乎是一个合法的问题…如果你想让任何人都无法理解你的代码,那么这就彻底完成了任务。伙计们,这显然是一个CodeGolf的玩家。。。看它是多么的短和凌乱!嗨@peter,你打算怎么办:给你:嗯+1这回答了问题的一部分,-1这没有解释被破坏的线条。编辑:显然其他人比我严厉。嗯+1这回答了问题的一部分,-1这没有解释被破坏的线条。编辑:显然其他人比我严厉。