问题
My function needs one argument words, but i want the program not to crash if no argument.
def get_count(words):
try:
consonants_str = "bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ"
vowels_str = "aeiouAEIOU"
consonants_ls = []
vowels_ls = []
words_ls = []
result = {"vowels": 0, "consonants": 0}`
for element in consonants_str:
consonants_ls.append(element)
for element in vowels_str:
vowels_ls.append(element)
if type(words) != type(None):
for element in words:
words_ls.append(element)
for element in words_ls:
if element in vowels_ls:
result["vowels"] += 1
if element in consonants_ls:
result["consonants"] += 1
else:
continue
else:
result["vowels"] = 0
result["consonants"] = 0
except TypeError:
result["vowels"] = 0
result["consonants"] = 0
answer = {"vowels": result["vowels"],"consonants": result["consonants"]}
return answer`
So if I execute the function with
print(get_count())
I want, that the program doesn't show me an error like the one in the heading. The exception for that should be in the def
of get_count
because it should be a closed file. I don't execute in the same file, so the Exception should be independent from other files.
I hope you understand what I mean...
Thanks for your answers! NoAbL
回答1:
You're not passing an argument to your function, when you declared that you want an argument named words
with def(words)
, call your function like this or with any string input you desire
print(get_count('AAAABBBKDKDKDKDA'))
if you want the program to exit when no argument is passed, do this (remember words is now a tuple)
import sys
def get_count(*words):
if not words: # if words is empty, no argument was passed
sys.exit('You passed in no arguments')
else:
pass # do something with the items in words
回答2:
You can use Optional parameters
For example:
def info(name, age=10):
is a function with optional parameter age
.
The valid calls of info are:
info("Roy")
info("Roy", 15)
In your case you can just change your function to this:
def get_count(words=[]): # Assuming words is a list. If it is a string you can use words=""
So, if you don't pass any arguments, by default the function takes words
as an empty list
.
Bonus:
I've found
for element in consonants_str:
consonants_ls.append(element)
for element in vowels_str:
vowels_ls.append(element)
You don't need this. Instead you can do this:
consonants_ls = list(consonants_str)
vowels_ls = list(vowels_str)
回答3:
Pythonic way:
>>> vowels = 'aeiou'
>>> def get_count(words):
... words = words.lower()
... total_vowels = sum(words.count(x) for x in vowels)
... return {'vowels':total_vowels, 'consonants':len(words)-total_vowels}
...
>>> get_count('AAAABBBKDKDKDKDA')
{'consonants': 11, 'vowels': 5}
Using collections.Counter
:
>>> def get_count(words):
... words = words.lower()
... my_counter = collections.Counter(words)
... total_vowels = sum(my_counter.get(x,0) for x in 'aeiou')
... return {'vowels':total_vowels, 'consonants':len(words)-total_vowels}
...
>>> get_count('AAAABBBKDKDKDKDA')
{'consonants': 11, 'vowels': 5}
来源:https://stackoverflow.com/questions/35968844/python-3-exception-typeerror-function-missing-1-required-positional-argument