55

Pythonで関数を2回以上連続して呼び出す簡単な方法はありますか?例えば:

do()
do()
do()

多分次のように:

3*do()
4

9 に答える 9

97

私は...するだろう:

for _ in range(3):
    do()

これ_は、値を気にしない変数の規則です。

また、次のように書いている人もいるかもしれません。

[do() for _ in range(3)]

do()ただし、 (の場合でも)の各呼び出しの戻り値を含むリストを作成し、None結果のリストを破棄するため、少しコストがかかります。戻り値のリストを使用してない限り、これを使用することはお勧めしません。

于 2012-01-28T19:43:32.220 に答える
20

渡された関数をN回繰り返す関数を定義できます。

def repeat_fun(times, f):
    for i in range(times): f()

さらに柔軟にしたい場合は、繰り返される関数に引数を渡すこともできます。

def repeat_fun(times, f, *args):
    for i in range(times): f(*args)

使用法:

>>> def do():
...   print 'Doing'
... 
>>> def say(s):
...   print s
... 
>>> repeat_fun(3, do)
Doing
Doing
Doing
>>> repeat_fun(4, say, 'Hello!')
Hello!
Hello!
Hello!
Hello!
于 2012-01-28T19:50:10.520 に答える
9

そうするためのさらに3つの方法:

(I)使用mapすることもオプションだと思いますが、None場合によってはsを使用して追加のリストを生成する必要があり、常に引数のリストが必要です。

def do():
    print 'hello world'

l=map(lambda x: do(), range(10))

(II)itertools他の関数を反復処理するために使用できる関数が含まれていますhttps://docs.python.org/2/library/itertools.html

(III)関数のリストの使用については、これまで言及されていなかったと思います(実際、構文は最初に説明したものに最も近いです):

it=[do]*10
[f() for f in it]

またはワンライナーとして:

[f() for f in [do]*10]
于 2016-03-15T11:01:10.013 に答える
8

単純なforループ?

for i in range(3):
  do()

または、結果に興味があり、結果を収集したい場合は、1ライナーになるというボーナスがあります。

vals = [do() for _ in range(3)]
于 2012-01-28T19:43:14.670 に答える
5

私の2セント:

from itertools import repeat 

list(repeat(f(), x))  # for pure f
[f() for f in repeat(f, x)]  # for impure f
于 2017-01-14T14:49:21.383 に答える
4

forこれは、ループを使用したり、中間関数やラムダ関数を定義したりする必要のないアプローチです(これもワンライナーです)。この方法は、次の2つのアイデアを組み合わせたものです。

  • オプションのセンチネル引数を使用してiter()組み込み関数を呼び出す、および

  • イテレータステップを進めるためのitertoolsレシピを使用します(のレシピを参照)。nconsume()

これらをまとめると、次のようになります。

next(islice(iter(do, object()), 3, 3), None)

object()(番兵として合格するという考えは、この受け入れられたStack Overflowの回答から来ています。)

そして、これがインタラクティブプロンプトからどのように見えるかです:

>>> def do():
...   print("called")
... 
>>> next(itertools.islice(iter(do, object()), 3, 3), None)
called
called
called
于 2016-10-28T09:22:05.917 に答える
2
from itertools import repeat, starmap

results = list(starmap(do, repeat((), 3)))

itertoolsモジュールのrepeatfuncレシピを参照してください。これは、実際にははるかに強力です。メソッドを呼び出す必要があるが、戻り値を気にしない場合は、forループで使用できます。

for _ in starmap(do, repeat((), 3)): pass

しかし、それは醜くなっています。

于 2017-06-09T19:44:59.380 に答える
0

以下に示すように、whileループを試すことができます。

def do1():
    # Do something

def do2(x):
    while x > 0:
        do1()
        x -= 1

do2(5)

したがって、do1関数を5回呼び出します。

于 2017-05-10T11:54:09.567 に答える
0

itertools.repeatwithを使用して、関数のメソッドをNoperator.methodcaller呼び出すことができます。これを行うジェネレーター関数の例を次に示します。__call__

from itertools import repeat
from operator import methodcaller


def call_n_times(function, n):
    yield from map(methodcaller('__call__'), repeat(function, n))

使用例:

import random
from functools import partial

throw_dice = partial(random.randint, 1, 6)
result = call_n_times(throw_dice, 10)
print(list(result))
# [6, 3, 1, 2, 4, 6, 4, 1, 4, 6]
于 2019-06-12T13:22:37.663 に答える