2

私は最初の言語として python を学び始めたばかりで、fizzbuzz のコードを作成している間、以下の項目を実行することは一生できません。また、縦ではなく横に印刷したいです。どんな助けでも素晴らしいでしょう(頭が回転します)。これを行う関数を作成します。例えば

fizzbuzz(20) 

印刷します 1,2,fizz,4,buzz,fizz,7,8,fizz,buzz,11,fizz,13,14,fizzbuzz,16,17,fizz,19,buzz

def fizzbuzz(n):

    for x in range (101):
        if x%3==0 and x%5==0:
            print("fizz buzz")
        elif x%3==0:
            print('fizz')
        elif x%5==0:
            print('buzz')
        else:
            print (x)    

def main():
  print(fizzbuzz(20))
4

12 に答える 12

6

さらに短い:

for n in range(100):
    print("Fizz"*(not n % 3) + "Buzz"*(not n % 5) or n)

そうだね。でも何で?

これを理解するために、パーツを個別に見てみましょう。

"Fizz"*(not n % 3)

Python では、文字列を「乗算」できる"a"*3ため、"aaa". 文字列にブール値を掛けることもできます: "a" * Trueis"a"に対して、"a" * Falseis は空の文字列です""。これが " ここで起こっていること"Fizzです。 When (つまり、n は 3 , n % 3 == 06, 9, ...), thennot n % 3は と同じnot 0ですTruen.. then n % 3will be either 1 or 2, and not n % 3will be false. つまり、n が 3 で割り切れる場合は常に、項"Fizz"*(not n % 3)は文字列"Fizz"を True で乗算し、そうでない場合は False で乗算し、結果として空になります。ストリング。

同じ論理が次の部分 にも当てはまります"Buzz"*(not n % 5)nが 5 で割り切れない場合は空の文字列が返され、割り切れる場合は文字列が返され"Buzz"ます。

ここで、これら 2 つのことを一緒に追加します。

"Fizz"*(not n % 3) + "Buzz"*(not n % 5)

n が3 でも 5 でも割り切れない"" + ""場合、これは 2 つの空の文字列を足し合わせることになり (つまり)、もちろん別の空の文字列が得られます。その場合、print ステートメント全体がprint("" or n). 空の文字列は False-y であるため、数値 n が出力されます。n が 3 で割り切れる (ただし 5 ではない) 場合、これはprint("Fizz" or n)であり、"Fizz"は Truthy であるため、それを出力して数字を省略します。

ボーナスポイント

または、本当に面接官に好印象を与えたい場合は、

for n in range(100):
    print("FizzBuzz"[n%-3&4:12&8-(n%-5&4)] or n)
于 2016-05-27T19:56:05.343 に答える
3

アイテムをリストにまとめます。次に、関数の最後にリストを出力します。を使用して、間にコンマを入れて項目を結合できます', '.join(...)

def fizzbuzz(n):
    result = []
    for x in range(1, n+1):
        if x % 3 == 0 and x % 5 == 0:
            result.append("fizz buzz")
        elif x % 3 == 0:
            result.append('fizz')
        elif x % 5 == 0:
            result.append('buzz')
        else:
            result.append(str(x))
    return result

def main():
    print(', '.join(fizzbuzz(20)))

main()

最後にコンマとスペースを付けて「水平に」印刷することも知っておくとよいprint(..., end=', ')でしょう。これは、最後の項目にも最後にコンマとスペースがあることを除いて、ほとんど問題を解決しますが、これはあなたが望むものではありません.


通常は、(1) 印刷をコンピューティングから切り離し、(2) 関数を再利用可能にすることをお勧めします。多くの場合、印刷よりも頻繁に計算する必要があります。将来、印刷する前に計算を他の関数に渡したいと思うかもしれません。そのため、すぐに印刷する機能はあまり役に立ちません。そのため、print ステートメントを から削除することをお勧めしfizzbuzzます。

string を返すこともできますが', '.join(result)、それはどのように役立つのでしょうか? このリストresultは (将来) さらなる処理に役立つ可能性があるため、 を返すことにしましたresultmain私が関数のために残した印刷。

于 2013-08-25T09:23:56.230 に答える
2
def fizzbuzz(numbers, fizz, buzz):
    x = ['Fizzbuzz' if x % fizz == 0 and x % buzz == 0 else 'Fizz' if x % fizz == 0 else 'Buzz' if x % buzz == 0 else x for x in numbers]
    return x
于 2016-06-25T09:04:52.570 に答える
1

end=', '値を区切る任意の文字を使用して、同じ行に印刷するために印刷に追加できます。

class FizzBuzz:
    @staticmethod
    def fizz_buzz(n):
        if n % 15 == 0:
            return 'FizzBuzz'
        elif n % 3 == 0:
            return 'Fizz'
        elif n % 5 == 0:
            return 'Buzz'
        else:
            return str(n)

    def __str__(self, rng):
        [print(self.fizz_buzz(n), end=', ') for n in range(1, rng + 1)]

でも,最後は離れます。その代わり:

    def __str__(self, rng):
        print(', '.join(self.fizz_buzz(n) for n in range(1, rng + 1)))
于 2016-10-21T09:24:36.163 に答える
1

私は初心者のコーダーなので、理解できなかった回答や、私の問題に直接当てはまらない回答がいくつかありました。この回答には Fizz_Buzz が変数として組み込まれており、x の範囲はユーザーによって決定されます。上記の解決策を見て、これを思いつきました:

def Fizz_Buzz(x): 
     for x in range (0,x):      
        if x % 3 == 0 and x % 5 == 0:           
            print('FizzBuzz')       
        elif x % 3 == 0:            
            print('Fizz')       
        elif x % 5 == 0:            
            print ('Buzz')      
        else:           
            print (x)
于 2016-09-10T05:16:41.310 に答える
1

もう1つ:)ただの楽しみです:)

get_index = lambda i: bool(i%3)+2*bool(i%5) if i !=0 else 3
afb = lambda x: ('fizzbuzz','buzz', 'fizz', str(x))[get_index(x)]
fizzbuzz = lambda inpt: print(','.join([ afb(i) for i in inpt ]))
fizzbuzz(range(101))

'0,1,2,フィズ,4,バズ,フィズ,7,8,フィズ,バズ,11,フィズ,13,14,フィズバズ,16,17,フィズ,19,バズ,フィズ,22,23,フィズ,バズ,26,フィズ,28,29,フィズバズ,31,32,フィズ,34,バズ,フィズ,37,38,フィズ,バズ,41,フィズ,43,44,フィズバズ,46,47,フィズ,49 ,バズ,フィズ,52,53,フィズ,バズ,56,フィズ,58,59,フィズバズ,61,62,フィズ,64,バズ,フィズ,67,68,フィズ,バズ,71,フィズ,73,74 ,fizzbuzz,76,77,fizz,79,buzz,fizz,82,83,fizz,buzz,86,fizz,88,89,fizzbuzz,91,92,fizz,94,buzz,fizz,97,98,fizz 、バズ'

于 2017-03-22T14:59:35.717 に答える
0

以下がうまく機能することがわかりました(Python 3):

def fizzbuzz():
for i in range(1,101):
    print("Fizz"*(i%3==0)+"Buzz"*(i%5==0) or i)

print (fizzbuzz())
于 2016-01-09T13:31:35.340 に答える