簡體   English   中英

Python-我的生成器在做什么錯?

[英]Python - What am I doing wrong with my generators?

我正在嘗試通過輔助函數將一系列生成器提供給另一個生成器。 我想我flat_map()在RxPy中一樣模仿flat_map() 有沒有辦法做到這一點? 我得到的輸出正在打印生成器,而不是生成器產生的項目。

class User(object):
    def __init__(self, id, name):
        self.id = id
        self.name = name

    def __str__(self):
        return "{0}-{1}".format(self.id, self.name)

users = [
    User(0,"Hero"),
    User(1,"Dunn"),
    User(2,"Sue"),
    User(3,"Chi"),
    User(4,"Thor"),
    User(5,"Clive"),
    User(6,"Hicks"),
    User(7,"Devin"),
    User(8,"Kate"),
    User(9,"Klein"),
]

friendships = [
    (0,1),
    (0,2),
    (1,2),
    (1,3),
    (2,3),
    (3,4),
    (4,5),
    (5,6),
    (5,7),
    (6,8),
    (7,8),
    (8,9)
]

def user_for_id(user_id):
    for user in users:
        if user.id == user_id:
            yield user



def friends_of(user):
    for friendship in friendships:
        if friendship[0] == user.id or friendship[1] == user.id:
            for other_user_id in friendship:
                if other_user_id != user.id:
                    yield user_for_id(other_user_id)

for friend in friends_of(users[3]):
    print(friend)

輸出:

<generator object user_for_id at 0x7f2d33ee48e0>
<generator object user_for_id at 0x7f2d33ee4990>
<generator object user_for_id at 0x7f2d33ee4938>

您的鏈接生成器在一起,並且僅迭代其中之一。 如果您想獲得實際的朋友,則即使它是一個值,也需要遍歷friend。 生成器不是迭代器。 因為您的friends_of函數返回一個生成器表達式,所以您需要對其進行迭代或將其傳遞給next

>>> for friend in friends_of(users[3]):
...     for obj in friend:
...             print(obj.name)
...
Dunn
Sue
Thor

您可以通過將生成器傳遞給next()並打印結果名稱屬性來繞過第二個循環。 我應該注意,此代碼與我之前提到的代碼不同,因為它僅查看第二個生成器表達式返回的第一個值。

>>> for friend in friends_of(users[3]):
...     print(next(friend).name)
...
Dunn
Sue
Thor

如果您在理解生成器時遇到困難,我強烈建議您研究一下大衛·比茲利網站上發布的材料。

http://dabeaz.com/generators/index.html -發電機技巧系統程序員http://dabeaz.com/generators-uk/index.html -發電機技巧系統程序員V2 http://dabeaz.com/finalgenerator /index.html-生成最終邊界

他的視頻和幻燈片將使您對生成器在python中的工作方式有一個更好的了解。

正如其他人解釋的那樣,在Python 3中,您可以使用“ yield from”:

def friends_of(user):
    for friendship in friendships:
        if friendship[0] == user.id or friendship[1] == user.id:
            for other_user_id in friendship:
                if other_user_id != user.id:
                    yield from user_for_id(other_user_id)

for friend in friends_of(users[3]):
    print(friend.name)

但是,上一個代碼塊的深度嵌套是一個不好的信號。 應該重寫它,使其更具可讀性。

暫無
暫無

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

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