2
class wordlist:
    def is_within(word):
        return 3 <= (len(word)) <= 5
    def truncate_by_length(wordlist):
        return filter(is_within, wordlist)
    newWordlist = truncate_by_length(['mark', 'daniel', 'mateo', 'jison'])
    print newWordList

基本上它的作用是,给定一个单词长度的最小值和最大值(在给定的示例中分别为 3 和 5),它应该打印一个新的单词列表,这些单词在给定原始长度的这些长度内。例如上面,给定单词 mark、daniel、mateo 和 jison,它应该打印仅包含 mark、mateo 和 jison 的新列表。

每当我运行它时,我都会收到以下信息:

Traceback (most recent call last):
  File "C:/Users/Makoy/Documents/AMC 125/sample.py", line 1, in <module>
    class wordlist:
  File "C:/Users/Makoy/Documents/AMC 125/sample.py", line 6, in wordlist
    newWordlist = truncate_by_length(['mark', 'daniel', 'mateo', 'jison'])
  File "C:/Users/Makoy/Documents/AMC 125/sample.py", line 5, in truncate_by_length
    return filter(is_within, wordlist)
NameError: global name 'is_within' is not defined

对不起,如果我听起来很菜鸟等等,但我一个月前才开始学习 Python,而且我是一个完全的初学者。提前致谢。

4

2 回答 2

4

如果您在类方法定义中调用类方法,则需要调用“self”(因此,在您的示例中为 self.is_within)。类方法的第一个参数也应该是“self”,它指的是类的这个实例。查看Dive into Python以获得很好的解释。

class wordlist:
    def is_within(self, word):
        return 3 <= (len(word)) <= 5
    def truncate_by_length(self,wordlist):
        return filter(self.is_within, wordlist)

wl = wordlist()    
newWordList = wl.truncate_by_length(['mark', 'daniel', 'mateo', 'jison'])
print newWordList    
于 2013-01-13T23:47:23.467 回答
1

虽然 timc 的答案解释了为什么您的代码会出现错误以及如何修复它,但您的课程的当前设计相当糟糕。您的 wordlist 类仅包含两种对外部数据进行操作的方法 - 通常无需为此创建类,您可以直接在模块的全局范围内定义它们。wordlist 类的更好设计是这样的:

class wordlist():
    def __init__(self, wlist):
        #save the word list as an instance variable
        self._wlist = wlist

    def truncate_by_length(self):
        #truncante the word list using a list comprehension
        self._wlist = [word for word in self._wlist if 3 <= len(word) <= 5]

    def __str__(self):
        #string representation of the class is the word list as a string
        return str(self._wlist)

像这样使用它:

w = wordlist(['mark', 'daniel', 'mateo', 'jison'])
w.truncate_by_length()
print w
于 2013-01-14T00:30:32.183 回答