生成器而不是列表理解?我还能在哪里提高课程水平?

时间:2012-02-27 08:30:20

标签: python class generator list-comprehension

我对Python很陌生。最近我在研究python的类概念。好吧,对于我编写的几个脚本,我认为定义一个将SQL语句放在一起的类(在ArcGis方言中)会很方便。没什么好看的。这就是我想出的。我问两件事:第一,一般缺陷?建议改进?其次,我对最后一个函数def constructor的代码感到困惑。实际上我想从字典中返回元组而不是列表。但列表理解很好。那么发电机怎么样?我无法确切地知道如何做到这一点......

class ArcSql:
    type_book = {'str':("'","'"), 'int':("", "")}
    format_book = dict(shp=("'","'"), GDB=("[","]"))

    def __init__(self,colom_name, values_list, value_type = 'str', arc_format ='shp'):
        self.colom = colom_name
        self.values = values_list
        self.valtype = self.constructor(type_book, value_type)
        self.aformat = self.constructor(format_book, arc_format)
        self.colom_formated = str(self.aformat[0][0]) + self.colom + str(self.aformat[0][1])

    def statement(self):
        temp_state = []
        connector = "'OR' "
        count_values = len(self.values)
        if count_values == 0:
            return("error, not enough values...")
        else:
            for v in self.values:
                x = self.colom_formated + " = " + str(self.valtype[0][0]) + v + str(self.valtype[0][1]) + ' ' + connector
                temp_state.append(str(x))
        state = "".join(temp_state)[:-5]              
        return(str(state))

    def constructor(self, book, book_key):
        return([v for k,v in book.iteritems() if k==book_key])

3 个答案:

答案 0 :(得分:4)

应该在codereview site中更好地询问您的第一个问题。

关于第二个问题,您可以按如下方式使用生成器:

def constructor(self, book, book_key):
    for k, v in book.iteritems():
        if k==book_Key:
            yield v

...

for value in obj.constructor(book ,book_key):
    # Do whatever you need with value

无论如何,我的理解是,在这种情况下,你只能从列表理解中得到一个结果:

def constructor(self, book, book_key):
    return next(v for k, v in book.iteritems() if k==book_key, None)

...

value = obj.constructor(book ,book_key)
if value is not None:
    # Do whatever you need with value

其中next是一个内置函数,用于返回迭代器的下一个值或传递的默认值(在这种情况下为None)如果迭代器已用尽(如果没有传递默认值,在这种情况下会引发例外情况。)

答案 1 :(得分:3)

您可以轻松地将列表理解更改为生成器,只需将[]替换为(),使其成为生成器,然后为生成器关键字{{1交换return }}:

yield

现在应该只返回一个元组 - 如果你想要更多(作为列表),你需要调用yield (k,v in book.iteritems() if k==book_key)

答案 2 :(得分:1)

def constructor(self, book, book_key):
    return([v for k,v in book.iteritems() if k==book_key])

如果book是字典,则其键是唯一的。那么为什么要遍历这个dict来找到值?

为什么不:

def constructor(self, book, book_key):
    return (book[book_key],)