1

2 つの Python 関数を PHP に変換する必要があります。最初のものは次のとおりです。

def listspaces(string):
        return [i -1 for i in range(len(string)) if string.startswith(' ', i-1)]

これにより、提供された文字列のスペースがチェックされ、スペースが最初に見つかったときに True が返されると想定していますが、これは正しいですか?

i-1ここは何ですか?ですか-1

PHP では[]、 for array を使用します。ここ[]で return を使用します。この関数は true または false またはスペースの位置の配列を返しますか?

2番目の機能は

def trimcopy(copy, spaces, length=350):

    try:
        if len(copy) < length:
            return copy
        else:
            loc = 0
            for space in spaces:
                if space < length:
                    loc = space
                else:
                    return copy[:loc]
    except :
        return None

スペース内のスペースのWhats for space: here and whats is this return copy[:loc]

4

5 に答える 5

2

これらのタイプの変換の良いプロセスは次のとおりだと思います。

  • コードが何をしているかを調べる

  • Python で PHP スタイルにリファクタリングします (これにより、アサーション テストなどを使用して、ロジックがまだ機能していることを確認できます)。たとえば、リスト内包表記を for ループに変換します

  • PHPに変換

たとえば、listspaces(string)のスペースの位置を返します。stringリスト内包表記の使用は Pythonic ですが、あまり「PHP ic」ではありません。

def listspaces2(string): #PHP-onic listspaces
    space_positions = []
    for i in range(len(string))]:
        if string[i] == ' ':
            space_positions.append(i)
    return space_positions

2 番目の例trimcopyは、かなりトリッキーです (try, except は意図的に予期されるものをキャッチする可能性があるため、ライター (!) - 例外 - 2 つの可能性はstringa を持たず、より長い値lenを含むためです)。 Python でリファクタリングしてテストすることをお勧めします。spaceslen(copy)

copy[:loc]を使用するように、PHP で配列のスライスを行うことができますarray_slice($copy, 0, $loc);

注:通常、Python では、防御している例外を明示的に述べます (ポケモンの例外処理とは対照的に)。

于 2012-09-26T11:35:40.107 に答える
1

最初の関数も次のように記述されていることに気付くかもしれません。

def listspaces(str):
    return [i for i, c in enumerate(str) if c==' ']

そのバージョンには、PHPへの次の簡単な変換があります。

function listspaces($str) {
    $spaces = array();

    foreach (str_split($str) as $i => $chr)
        if ($chr == ' ') $spaces[] = $i;

    return $spaces;
}

他の関数に関しては、これはほとんど同じイディオムで同じことをするようです:

function trimcopy($copy, $spaces, $length=350) {
    if (strlen($copy) < $length) {
        return $copy;
    } else {
        foreach ($spaces as $space) {
            if ($space < $length) {
                $loc = $space;
            } else {
                return substr($copy, 0, $loc);
            }
        }
    }
}

他の人が指摘しているように、これらの関数の両方の意図は、おそらく。を使用することでより適切に表現できますwordwrap

于 2012-09-26T13:53:53.120 に答える
1

それらの機能をテストして、それらが何をしているのかを確認してみませんか?

listspaces(string)文字列内のすべてのスペースの位置を含む配列を返します。

$ ipython
IPython 0.10.2 -- An enhanced Interactive Python.

In [1]: def listspaces(string):
   ...:     return [i -1 for i in range(len(string)) if string.startswith(' ', i-1)]
   ...:

In [2]: listspaces('Hallo du schöne neue Welt!')
Out[2]: [5, 8, 16, 21]

(i -1はゼロから数え始めるときのスペースの位置)

私はPythonについてあまり知りません.2番目の関数を貼り付けることができません.「IndentationError」がたくさんあります.

入力trimcopy()が. copy_ spaces_ listspaces()_ length言い換えると、 入力は よりも小さい最高の空間位置で切り取られますlength

上記の例のように、パーツ' Welt!'が切り取られます。

s = 'Hallo du schöne neue Welt!'
trimcopy( s, listspaces( s ) )
/* should return: 'Hallo du schöne neue' */
于 2012-09-26T11:10:01.023 に答える
0

これは、Pythonの両方の関数と同等です

list($short) = explode("\n",wordwrap($string,350));
于 2012-09-26T13:52:51.243 に答える
0

最初の関数は、指定された文字列内のすべてのスペースのインデックスを返します。

  • range(len(string)) 0から入力文字列の長さまでの数字のリストになります
  • if string.startswith(' ', i-1)]condition は index ごとに評価されi、文字列 (ここではキーワードではありません) がインデックスで指定された位置で ' ' で始まる場合に true を返しますi-1

結果はfeelaが投稿したとおりです。

2 番目の関数については、スペース パラメーターが何であるかわかりません。

これがPHPバージョンを作成するのに役立つことを願っています.

于 2012-09-26T11:14:05.143 に答える