处理没有参数调用函数的情况?

时间:2016-02-29 00:58:36

标签: python python-2.7

我正在进行编码练习,其中一个测试调用下面定义的方法get_count()。其中一个测试调用get_count()而不传递任何参数。我希望函数仍然返回result = {'vowels':0, 'consonants':0},即使在没有任何参数的情况下调用该函数。有没有办法在python中执行此操作?

def get_count(words):
    result = {'vowels':0, 'consonants':0}
    if not words:
        return result
    if type(words) is not str:
        return result
    for letter in words.lower():
        if letter in 'aeiou':
            result['vowels'] += 1
        elif letter.isalpha():
            result['consonants'] += 1
    return result

3 个答案:

答案 0 :(得分:3)

这是您使用default function argument

的地方
def get_count(words=None):
    result = {'vowels':0, 'consonants':0}
    if not words:
        return result
    if type(words) is not str:
        return result
    for letter in words.lower():
        if letter in 'aeiou':
            result['vowels'] += 1
        elif letter.isalpha():
            result['consonants'] += 1
    return result

通常,对于您只想返回默认结果的情况,您希望使用None作为默认值。如果您的函数可以在不传递参数的情况下运行,则可以使用您想要的任何值作为默认值。请注意使用可变对象作为值,因为它可能会产生一些有趣的后果。具体来说,该对象仅在首次定义函数时创建,因此每次调用该函数时,它都将保持不变。

以下是一个例子:

def mutable(x, y=[]):
    y.append(x)
    return y

print(mutable(1)) # Prints [1]
print(mutable(2)) # Prints [1, 2]

答案 1 :(得分:1)

是的,使用默认参数:

def get_count(words=None):
    result = {'vowels':0, 'consonants':0}
    if not words:
        return result
    if type(words) is not str:
        return result
    for letter in words.lower():
        if letter in 'aeiou':
            result['vowels'] += 1
        elif letter.isalpha():
            result['consonants'] += 1
    return result

方便的是,你已经有了if not wordsNone的布尔值为False,因此如果未给出words,则会执行if语句。

答案 2 :(得分:0)

鉴于''是一个字符串,您可以使用空字符串def get_count(words=''): result = {'vowels':0, 'consonants':0} try: for letter in words.lower(): if letter in 'aeiou': result['vowels'] += 1 elif letter.isalpha(): result['consonants'] += 1 except AttributeError: pass return result 的默认参数,然后您可以简化代码。 BTW中常见的习惯用法是EAFP,通常用来代替LBFL:

partition

如果你想完全过度设计它,你可以使用itertools import itertools as it def partition(pred, iterable): t1, t2 = it.tee(iterable) return filter(pred, t1), it.filterfalse(pred, t2) def get_count(words=''): p = partition(lambda c: c in 'aeiou', filter(str.isalpha, words.lower())) return {k: sum(1 for _ in v) for k, v in zip(['vowels', 'consonants'], p)} >>> get_count('Hello, World!') {'consonants': 7, 'vowels': 3} 食谱:

{{1}}

抱歉,我很无聊