具有多个嵌套循环的函数中只有第一个值

Only first value in function with multiple nested loops

我是 Python 的新手,我正在 运行 解决一个非常基本的问题。 我编写了一个包含多个 for 循环和一个 if 语句的函数。 此代码 when 运行 分别显示我期望的所有值。 但是,当将其放入 def 函数时,它 returns 只有第一个值。 我知道这与缩进和在函数中使用 yield 而不是 return 有关。然而,尝试用这两个选项解决它仍然会返回一个结果。 以下是代码示例:

def generate_body(objectFr, properties):
objFrame = objectFr
data = properties

for obj in objFrame.Object_Naam:
    properties = data.loc[data['Objects'] == obj, 'attribuut_naam'].dropna()
    # minOccur = data.loc[data['Objects'] == obj, 'minOccurs'].dropna()
    
    for prop in properties:
        last = properties.iloc[-1]
        first = properties.iloc[0]
        jsonbody = []
        # bodystring = ''.join(jsonbody)
        if prop == first:
            jsonbody.append('"' + obj + '",' + ' "type": "object,"' + ' "properties": {' + str(prop) + '"' + ': { "type": "string" }' )
        elif prop == last:
            jsonbody.append('"' + str(prop) + '"' + ': { "type": "string" }' )
        else:
            jsonbody.append('"' + str(prop) + '"' + ': { "type": "string" },' )
        
    return ''.join(jsonbody)

有人可以帮帮我吗?

三件事:
def下的缩进不合适。
return 语句必须在 for 循环之外。
jsonbody[] 放在正确的位置。

试试这个:

def generate_body(objectFr, properties):
    objFrame = objectFr
    data = properties
    jsonbody = []

    for obj in objFrame.Object_Naam:
        properties = data.loc[data['Objects'] == obj, 'attribuut_naam'].dropna()
        # minOccur = data.loc[data['Objects'] == obj, 'minOccurs'].dropna()
    
        for prop in properties:
            last = properties.iloc[-1]
            first = properties.iloc[0]
            
            # bodystring = ''.join(jsonbody)
            if prop == first:
                jsonbody.append('"' + obj + '",' + ' "type": "object,"' + ' "properties": {' + str(prop) + '"' + ': { "type": "string" }' )
            elif prop == last:
                jsonbody.append('"' + str(prop) + '"' + ': { "type": "string" }' )
            else:
                jsonbody.append('"' + str(prop) + '"' + ': { "type": "string" },' )
        
    return ''.join(jsonbody)