I agree with Vince about providing the critical details. Not only does it get you better or higher quality answers, it saves community members time by not having them inadvertently answer a question you aren't asking.
The only caveat or footnote I would add to Vince's comment about constructing another list is that Python's built-in data constructors and functions are highly optimized. Whereas creating a new list and using append to populate it isn't very efficient, list comprehensions are quite efficient. In this case, using a list comprehension to construct a new filtered list allows for the use of more Python built-in functions, and the more built-in functions you can use, the better.
def mean(lst):
lst = [i for i in lst if i]
return sum(lst) / float(len(lst))
You can call it using your original syntax, which created a list:
mean([ !Welcoming!, !Access!, !Community!, !Safe!, !Provision!, !Quality!, !Security!, !Dog!, !Litter!, !Grounds! ])
For someone new to Python, I would say don't pay much attention to either Vince's or my comments about optimizing code. Optimizing code gets tricky because it involves balancing computer science theory with the reality of interpreter implementations, and often times premature attempts to optimize code confuse the new learner and set him/her back from learning the basic.
Fundamentally, your problem today was that you were incorrectly calling your function. The way you defined your function, it wanted 10 arguments instead of a single argument containing a list. Since you were passing the function a single list of 10 items, it was informing you that there were 9 missing arguments.