Ну, причина в том, что привязки выполняются при выполнении кода, и выполняется определение функции, ну ... когда функции определены.
Сравните это:
class BananaBunch:
bananas = []
def addBanana(self, banana):
self.bananas.append(banana)
Этот код страдает от такого же неожиданного случая. bananas - это атрибут класса, и, следовательно, когда вы добавляете к нему вещи, он добавляется ко всем экземплярам этого класса. Причина в том, что это точно то же самое.
Это просто «Как это работает», и заставить его работать по-другому в функциональном случае, вероятно, будет сложно, а в случае класса вероятно невозможно или, по крайней мере, замедлить объект создание экземпляра, так как вам придется хранить код класса и выполнять его при создании объектов.
Да, это неожиданно. Но как только пенни падает, она прекрасно вписывается в то, как работает Python в целом. На самом деле, это хорошее учебное пособие, и как только вы поймете, почему это происходит, вы будете намного лучше читать python.
Это говорит о том, что он должен занимать видное место в любом хорошем учебнике Python. Потому что, как вы говорите, все рано или поздно сталкиваются с этой проблемой.
number_of_consonants = sum(word.count(c) for c in consonants)
number_of_vowels = sum(word.count(c) for c in vowels)
def main():
vowels = 'aeiou'
consonants = 'bcdfghjklmnpqrstvwxyz'
txt_input = input('Enter a sentence or a word: ').lower()
vowel = sum(txt_input.count(i) for i in vowels)
consonant = sum(txt_input.count(i) for i in consonants)
print("Number of vowels in the string: ",vowel)
print("Number of consonants in the string: ",consonant)
main()
Большинство других ответов, кажется, подсчитывают каждый символ отдельно, а затем суммируют результаты, что означает, что код должен многократно перебирать строку ввода и несколько неэффективен. Более эффективным было бы подсчитать все вхождения всех символов за один раз, используя collections.Counter
:
import collections
s = "This is an example sentence."
counter = collections.Counter(s)
consonants = 'bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ'
num_consonants = sum(counter[char] for char in consonants)
# result: 14
vowels = 'aeiouAEIOU'
num_vowels = sum(counter[char] for char in vowels)
# result: 9
Python 2.6.7 (r267:88850, Jun 27 2011, 13:20:48) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> a = "asfdrrthdhyjkae"
>>> vowels = "aeiouy"
>>> consonants = "bcdfghjklmnpqrstvexz"
>>> nv = 0
>>> nc = 0
>>> for char in a:
... if char in vowels:
... nv += 1
... elif char in consonants:
... nc += 1
...
>>> print nv
4
>>> print nc
11
>>>
Это решение, которое учитывает согласные и гласные, в то время как явно исключает пунктуацию.
from string import punctuation
x = 'This is an example sentence.'
table = str.maketrans('', '', punctuation)
x = x.translate(table).lower().replace(' ', '')
vowels = set('aeiou')
consonants = sum(i not in vowels for i in x)
vowels = sum(i in vowels for i in x)
print(consonants) # 14
print(vowels) # 9
Использование regex было бы альтернативой:
>>> import re
>>> re.findall('[bcdfghjklmnpqrstvwxyz]','there wont be any wovels in the result')
['t', 'h', 'r', 'n', 't', 'b', 'n', 'v', 'l', 's', 'n', 't', 'h', 'r', 's', 'l', 't']
Если вы берете свою длину, ваша проблема решается.
text = 'some text'
wovels = 'aeiou'
consonants = 'bcdfghjklmnpqrstvwxyz'
from re import findall
wovelCount = len(findall('[%s]' % wovels, text))
consonatCount = len(findall('[%s]' % consonants, text))
if mode == "vowels":
print(len(filter(lambda x: x in vowels, word)))
else:
print(len(filter(lambda x: x in consonants, word)))
Итак, я приурочил решение моего и эумиро. Его лучше
>> vc=lambda :sum(word.count(c) for c in vowels)
>> vc2=lambda : len(filter(lambda x: x in vowels, word))
>> timeit.timeit(vc, number=10000)
0.050475120544433594
>> timeit.timeit(vc2, number=10000)
0.61688399314880371
string.letters * 1000
это примерно такая же скорость. – eumiro 12 October 2011 в 08:20sum(1 for c in vowels)
– Burhan Khalid 19 April 2018 в 09:37