0

通过关于 python 列表的教程,我尝试编写一个 python 函数来计算以特定字母开头的单词的出现次数

def count_occurrences(p,letter):
    count = 0
    for elem in p:
        if elem[0]==letter:
            count = count+1
    return count


>>>count_occurrences(['damon','jim','dennis'],'d')
2
>>>count_occurrences(['damon','jim'],'d')
1
>>>count_occurrences([],'d')
0

但是,如果我输入一个包含错误类型的列表,比如说[1,2,3],它会抛出一个,TypeError:'int' object is unsubscriptable因为代码 elem[0]是在一个 int 上调用的。

那么,我该如何处理呢?我应该使用try : except块还是有其他方法?

4

5 回答 5

2

Try ... except 给你很大的灵活性来处理代码,这将是一个好主意,

检查此文档python 异常处理

与“传统”错误管理技术相比,异常处理具有以下优势:

将错误处理代码与“常规”代码 分开提供了一种方法,可以将异常情况发生时的处理细节与程序代码的正常逻辑流程分开; 在调用堆栈中向上传播错误 允许在更高级别采取纠正措施。这允许在调用发生错误的方法中采取纠正措施; 分组错误类型和错误区分 允许为异常处理创建类似的层次结构,以便以逻辑方式对它们进行分组。

只是一个例子:

def count_occurrences(p,letter):
    count = 0
    for elem in p:
        try:    # Put you code which can throw exception in try Block
            if elem[0]==letter:
                count = count+1
        except Exception, ex: # You can catch specific exceptions if you want over here
              print ex.message  # Handle your exception here
              #raise   # The 'raise' statement with no arguments inside an error
                       # handler tells Python to re-raise the exception with the 
                       # original traceback intact

    return count
于 2012-07-02T07:04:07.717 回答
1

你必须从你的函数中决定你想要什么:

def count_occurrences(p,letter):
    count = 0
    for elem in p:
        if isinstance(elem, basestring):
            if elem[0]==letter:
                count = count+1
        else:
            # you could do something else here or just ignore it, but it seems
            # that your function really needs a list of strings as argument 
            # so it would be an error to call it with anything else and it should 
            # not fail silently.
            raise TypeError("String expected")
    return count
  • 要么它可以忽略不匹配类型的元素。在这种情况下,您else在上面的示例中将 -section 留空。
  • 您只想接受字符串列表作为参数。在这种情况下,上面的示例完全属于您,如果传递了无效类型,它甚至会引发错误。

isinstance有关更多帮助,请参阅 python 文档。

不过,在循环外的旁注try-except块上可以带来更多的性能。

于 2012-07-02T07:06:12.660 回答
1

向您的条件添加isinstance()条件以if检查类型elem

def count_occurrences(p,letter):
    count = 0
    for elem in p:
        if isinstance(elem,str) and elem[0]==letter: #if the first condition is true then
                                                     # only it'll check the next condition
            count = count+1
    return count
于 2012-07-02T07:23:34.537 回答
0

如果您不使用,try ... except您可以执行以下操作:

if isinstance(elem[0],int): 
 { ... }

这样,perharps,您可以“跳过”该元素。

更好的解决方案是isinstance使用正确的类型进行测试,并且在“测试失败”的情况下跳过该元素。

所以

if isinstance(elem,str) and elem[0]==letter:
 {...}
于 2012-07-02T07:04:04.627 回答
0

更有效地写为:

sum(1 for i in sequence if i.startswith('d')) # or for single char i[0] == 'd'

如果它是无效类型,那么您可以使用 try/except 使操作失败,或者只过滤掉合适的类型,例如:

sum(1 for i in sequence if isinstance(i, basestring) and i[0] == 'd')

或者处理失败,因为列表应该是同质的:

   try:
       return sum(1 for i in sequence if i[0] =='d')
   except TypeError as e:
       pass # type doesn't have subscripting
   except IndexError as e:
       pass # may or may not be a str, but len() == 0

ETC...

附带说明:使用 str.startswith('d') 不会引发,因此''.startswith('d')返回 False。

于 2012-07-02T07:14:26.193 回答