Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2021, 10:06   #1
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,040
По умолчанию filter

здравствуйте, читал, что нижеследующая задача:
# числа от 1 до 100
# вместо чисел кратных трём, программа должна печатать 'Fizz'
# вместо чисел кратных пяти - 'Buzz'
# если число кратно и трём, и пяти, программа должна печатать 'FizzBuzz'
имеет много решение и самое быстрое:
Код:
print('\n'.join(
    'FizzBuzz' if i % 3 == 0 and i % 5 == 0 else 'Fizz' if i % 3 == 0 else 'Buzz' if i % 5 == 0 else str(i) for i in
    range(1, 101)))  # 2.53 msec
также читал в другом месте, что через filter ещё быстрей, как нижеследующий код:
Код:
a = [i for i in range(1, 101)]
print(list(filter(lambda x: x % 3 == 0, a)))
print(list(filter(lambda x: x % 5 == 0, a)))
print(list(filter(lambda x: x % 3 == 0 and x % 5 == 0, a)))
переделать, чтобы делало как сказано в условии?, будет ли быстрей? спасибо
Ципихович Эндрю вне форума Ответить с цитированием
Старый 14.12.2021, 22:29   #2
сфинкс
Форумчанин
 
Аватар для сфинкс
 
Регистрация: 17.06.2012
Сообщений: 957
По умолчанию

https://rosettacode.org/wiki/FizzBuzz#Python

"что вкладывалось в ответ? знакомые слова"
Случайные и Массивы https://programmersforum.ru/showthread.php?t=344371 Учим C# & basic & excel & python https://programmersforum.ru/showthre...=327446&page=5 ничего нерекомендую

Последний раз редактировалось сфинкс; 15.12.2021 в 18:11.
сфинкс вне форума Ответить с цитированием
Старый 15.12.2021, 08:03   #3
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,040
По умолчанию

прошёл я по ссылке, что касается Python:
Код:
Python2: Simple
for i in xrange(1, 101):
    if i % 15 == 0:
        print "FizzBuzz"
    elif i % 3 == 0:
        print "Fizz"
    elif i % 5 == 0:
        print "Buzz"
    else:
        print i
Python3: Simple
for i in range(1, 101):
    if i % 15 == 0:
        print("FizzBuzz")
    elif i % 3 == 0:
        print("Fizz")
    elif i % 5 == 0:
        print("Buzz")
    else:
        print(i)
Python: Simple - no duplication
for n in range(1,101):
    response = ''
 
    if not n%3:
        response += 'Fizz'
    if not n%5:
        response += 'Buzz'
 
    print(response or n)
 
One liner using string concatenation:

for i in range(1,101): print("Fizz"*(i%3==0) + "Buzz"*(i%5==0) or i)
One liner another code:

for i in range(100):print(i%3//2*'Fizz'+i%5//4*'Buzz'or i+1)
List Comprehensions:

 
for n in range(1, 100):
    fb = ''.join([ denom[1] if n % denom[0] == 0 else '' for denom in [(3,'fizz'),(5,'buzz')] ])
    print fb if fb else n
 
Another list comprehension:

 
print (', '.join([(x%3<1)*'Fizz'+(x%5<1)*'Buzz' or str(x) for x in range(1,101)]))  
 
Python: List Comprehension (Python 3)
[print("FizzBuzz") if i % 15 == 0 else print("Fizz") if i % 3 == 0 else print("Buzz") if i % 5 == 0 else print(i) for i in range(1,101)]
Python: Lazily
You can also create a lazy, unbounded sequence by using generator expressions:

from itertools import cycle, izip, count, islice
 
fizzes = cycle([""] * 2 + ["Fizz"])
buzzes = cycle([""] * 4 + ["Buzz"])
both = (f + b for f, b in izip(fizzes, buzzes))
 
# if the string is "", yield the number
# otherwise yield the string
fizzbuzz = (word or n for word, n in izip(both, count(1)))
 
# print the first 100
for i in islice(fizzbuzz, 100):
    print i

Or equivalently, in terms of map, and Python 3 libraries:

Works with: Python version 3.7
'''Fizz buzz'''
 
from itertools import count, cycle, islice
 
 
# fizzBuzz :: () -> Generator [String]
def fizzBuzz():
    '''A non-finite stream of fizzbuzz terms.
    '''
    return map(
        lambda f, b, n: (f + b) or str(n),
        cycle([''] * 2 + ['Fizz']),
        cycle([''] * 4 + ['Buzz']),
        count(1)
    )
 
 
# ------------------------- TEST -------------------------
def main():
    '''Display of first 100 terms of the fizzbuzz series.
    '''
    print(
        '\n'.join(
            list(islice(
                fizzBuzz(),
                100
            ))
        )
    )
 
 
if __name__ == '__main__':
    main()
Python3.8: With walrus operator
print(*map(lambda n: 'Fizzbuzz '[(i):i+13] if (i := n**4%-15) > -14 else n, range(1,100)))
Python: Math tricks
Numbers ending in 5 or 0 are divisible by 5. Numbers whose digits recursively summed to a single-digit number == 3,6 or 9 are divisible by 3.

 
def numsum(n):
	''' The recursive sum of all digits in a number 
        unit a single character is obtained'''
	res = sum([int(i) for i in str(n)])
	if res < 10: return res
	else : return numsum(res)
 
for n in range(1,101):
	response = 'Fizz'*(numsum(n) in [3,6,9]) + \
                   'Buzz'*(str(n)[-1] in ['5','0'])\
	            or n
	print(response)
и если поиском искать filter то результатов - 0
или, что вкладывалось в ответ? знакомые слова Fizz, Buzz, FizzBuzz?
Ципихович Эндрю вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Filter в ADOTable -=Virus=- БД в Delphi 10 31.07.2013 08:35
BindingSource.Filter VB 4eburator Помощь студентам 2 15.03.2012 00:27
BindingSource.Filter doober Общие вопросы .NET 2 12.10.2010 03:25
Filter в ADOTable Poltev86 Microsoft Office Access 3 20.05.2010 14:36