簡體   English   中英

Python for 循環中的嵌套產量

[英]Python nested yield in for loop

我有一個需要編寫的程序,它的工作原理是這樣的:

  1. 發送 POST 請求以獲取令牌
  2. 使用token獲取電商平台所有主要品類
  3. 然后我必須遍歷所有類別並獲取所有葉子 - 這是樹中沒有任何子類別的最終類別 - 這也意味着我為每個子類別發送 GET 請求,然后檢查它是否返回“葉子”== True(這是標志在返回的 JSON 中)
  4. 如果它是“葉子”,則它是最后的操作,對於他們來說,我必須獲取所有必需的參數
  5. 子類別可能有不同的長度 - 例如“電子產品 > 智能手機配件 > 耳機 > 無線” = 長度 4,但“房屋和花園 > 園藝工具 > 割草機” = 長度 3
  6. 我想把它全部保存在 JSON

這應該擴展到漂亮的嵌套 JSON ,它是所有類別及其子類別的集合。 在端點上-即最終的子類別應該是“參數”:存儲所有參數的表。

所以對我來說(我已經開始認真學習使用 Scheme/Racket 進行編程),這似乎是一個遞歸問題,應該在所有子類別中調用自己,然后在“葉子”結束,我最后一次調用 GET 參數並結束遞歸。 我在遞歸 function 中使用 yield 語句而不是用 for 循環返回......是的,這是我認為應該工作的。

def get_all_leaves(category_tree):
for category in category_tree["categories"]:
    if category["leaf"] == True:
        request_parameters = requests.get("https://api.allegro.pl.allegrosandbox.pl/sale/categories/" + category["id"] + "/parameters",
                                            headers=headers_main_category_tree)
        dict_parameters = json.loads(request_parameters.text)
        yield {"name":category["name"], "id":category["id"], "parameters":dict_parameters["parameters"]}
    else:
        request_id = category["id"]
        next_category_tree = requests.get("https://api.allegro.pl.allegrosandbox.pl/sale/categories?parent.id=" + request_id, 
                                           headers=headers_main_category_tree)
        dict_next_category_tree = json.loads(next_category_tree.text)

        yield {"name":category["name"], "id":category["id"], "subcategory":get_all_leaves(dict_next_category_tree)}

這是一個結果:

And this is result of print(list(get_all_leaves(json_main_category_tree)))

[{{'name': 'Dom i Ogród', 'id': '5', 'subcategory': <generator object get_all_leaves at 0x03F7D6F0>},
{'name': 'Dziecko', 'id': '11763', 'subcategory': <generator object get_all_leaves at 0x03F7D878>},
{'name': 'Elektronika', 'id': '42540aec-367a-4e5e-b411-17c09b08e41f', 'subcategory': <generator object get_all_leaves at 0x03F7D808>},
{'name': 'Firma i usługi', 'id': '4bd97d96-f0ff-46cb-a52c-2992bd972bb1', 'subcategory': <generator object get_all_leaves at 0x03F7DA70>},
...
...
...
{'name': 'Wyposażenie', 'id': '123', 'subcategory': <generator object get_all_leaves at 0x03FCF760>}]

也就是說,它以某種方式工作,它看起來像一個遞歸,但它把生成器放在生成器中? 他們沒有擴大自己。

yield {"name":category["name"], "id":category["id"], "subcategory":get_all_leaves(dict_next_category_tree)}

遞歸調用創建了一個生成器 object,它存儲在產生的 dict 中。

要獲得完全擴展的結果,最簡單的方法是在此處擴展遞歸調用的結果,因此:

yield {"name":category["name"], "id":category["id"], "subcategory":list(get_all_leaves(dict_next_category_tree))}

通常,您可以將生成器傳遞給list以擴展它們,而無需顯式循環。 它之所以有效,是因為list構造函數需要任何類型的可迭代 - 生成器是 - 並進行迭代並構建迭代項的列表。 (另一個例子,文件對象的readlines()方法是不必要的;您可以將打開的文件 object 傳遞給以相同的方式list 。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM