python到php代码转换

我必须将两个Python函数翻译成PHP。 第一个是:</ p>

  def listspaces(string):
如果string.startswith('',则返回[i -1 for i in range(len(string)) i-1)]
</ code> </ pre>

我假设这将检查提供的字符串中的空格并在找到第一个空格时返回True,这是正确的吗? / p>

这里的 i-1 </ code>是什么? 是 -1 </ code>?</ p>

在PHP中,我们使用 [] </ code>来表示数组。 这里我们用 [] </ code>返回,这个函数会返回true还是false还是空格位置数组?</ p>

第二个函数是</ p>
\ n

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

尝试:
如果len(copy)&lt; length:
返回copy
else:
loc = 0
表示空格中的空格:
如果空格&lt; length:
loc = space
else:
返回copy [:loc]
除外:
返回None
</ code> </ pre>

空格中的空格: 这里有什么返回副本[:loc] </ code> </ p>
</ div>

展开原文

原文

I have to translate two Python functions into PHP. The first one is:

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

I am assuming that this will check for space in provided string and return True when first occurrence of space is found, is this correct ?

What is i-1 here ? is it -1 ?

In PHP we use [] for arrays . Here we are [] with return, will this function return true or false or array of locations of spaces ?

Second function is

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 in spaces: here and whats is this return copy[:loc]

donglin9717
donglin9717 这不是很好,在trimcopy中的else块内尝试这一点:list($newtext)=explode(“”,wordwrap($string,350,“”));但是很难分辨出什么功能打算(因为它肯定是马车)!
接近 8 年之前 回复
duanchun1881
duanchun1881 我想出这个作为php替代两个函数列表($short)=explode(“ ”,自动换行($string,100));它是否正确?
接近 8 年之前 回复
douzong5057
douzong5057 这些是非常奇怪的功能(特别是trimcopy)!
接近 8 年之前 回复
dqq9695
dqq9695 检查python列表理解,for循环和python切片....
接近 8 年之前 回复

5个回答



您可能会注意到第一个函数也可以写为</ p>

  def  listspaces(str):
返回[i for i,c in enumerate(str)if c =='']
</ code> </ pre>

该版本具有以下直接转换 到PHP:</ p>

 函数列表空间($ str){
$ spaces = array();

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

返回$ spaces;
}
</ code> </ pre>

至于其他功能,这似乎在几乎相同的习语中做同样的事情:</ p>

  function trimcopy($ copy,$ spaces,$ length = 350){\  n if(strlen($ copy)&lt; $ length){
return $ copy;
} else {
foreach($ spaces as $ space){
if($ space&lt; $ length){
$ loc = $ space;
} else {
返回substr($ copy,0,$ loc);
}
}
}
}
</ code> </ pre>
\ n

正如其他人所指出的那样 ut,使用 wordwrap </ code>可能更好地表达这两个函数的意图。</ p>
</ div>

展开原文

原文

You may notice that the first function could also have been written as

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

That version has the following straightforward conversion to PHP:

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

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

    return $spaces;
}

As for the other function, this seems to do the same thing in very nearly the same idiom:

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);
            }
        }
    }
}

As others have pointed out, the intent of both of these functions could probably be better expressed by using wordwrap.

drfls28608
drfls28608 如果它们只是组合使用,它们似乎就是为了做到这一点。 就此而言,您可以在python的标准库中使用textwrap.wrap。
接近 8 年之前 回复
dongyang0005
dongyang0005 谢谢,你同意这一行作为这两个函数列表的替代($ short)= explode(“ ”,wordwrap($ string,350));
接近 8 年之前 回复



为什么不测试这些函数以查看它们在做什么?</ p>

< code> listspaces(string)</ code>返回一个数组,其中包含字符串中所有空格的位置:</ p>

  $ ipython 
IPython 0.10.2 - 增强的交互式Python 。

在[1]中:def列表空间(字符串):
...:如果string.startswith('',i-1)],则返回[i为范围内的i(len(字符串)) n ...:

在[2]中:列表空间('HalloduschöneneueWelt!')
Out [2]:[5,8,16,21]
</ code> </ pre> \ n

i -1 </ code>是开始用零计数时空格的位置)</ p>

我不太了解Python和 我无法粘贴第二个函数,因为有许多“IndentationError”。</ p>

我认为 trimcopy()</ code>将返回一个字符串(来自输入) copy </ code>),其中数组 spaces </ code>中给出的最后一个空格位置后面的所有内容(显然是来自 listspaces()</ code>的返回值)被修剪,除非 日 e输入不超过 length </ code>。
换句话说:输入在小于 length </ code>的最高空格位置被切断。</ p>
\ n

如上例所示,部分'Welt!'</ code>将被切断:</ p>

  s ='HalloduschöneueueWelt  !'
trimcopy(s,listspaces(s))
/ 应该返回:'Halloduschöneue' /
</ code> </ pre>
</ div>

展开原文

原文

Why don't you just test those functions to see what they are doing?

listspaces(string) returns an array with the positions of all spaces within the 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 is the position of a space when starting to count with zero)

I don't know much about Python and I can't paste the second function as there are to many "IndentationError"'s.

I think that trimcopy() will return a string (from input copy), where everything behind the last space position given in the array spaces (obviously a return value from listspaces()) is trimmed, unless the input is no longer than length. In other words: the input is cut off at the highest space position that is smaller than length.

As of the example above, the part ' Welt!' will get cut off:

s = 'Hallo du schöne neue Welt!'
trimcopy( s, listspaces( s ) )
/* should return: 'Hallo du schöne neue' */

doulao3905
doulao3905 我想出这个作为php替代两个函数列表($ short)= explode(“ ”,自动换行($ string,100)); 它是否正确 ?
接近 8 年之前 回复
douwen1006
douwen1006 我知道! 但比较'a'* 100,'a'* 200和'a'* 400的输出是很有趣的。 :)
接近 8 年之前 回复
dongxifu5009
dongxifu5009 好吧,我没有写过那些函数 -
接近 8 年之前 回复
duanfoumi5620
duanfoumi5620 如果复制长度超过长度,它会在第一个空格之前返回复制块,这可能会或可能不会长于长度,这种行为不能很好......
接近 8 年之前 回复
dongtiaozhou4914
dongtiaozhou4914 Â|updated
接近 8 年之前 回复
dongyin4202
dongyin4202 我试过了,第一个是返回位置数组,第二个没有做任何事情,它返回相同的文本但修剪版本
接近 8 年之前 回复



我认为这类转换的良好过程是:</ p>


  • 弄清楚代码在做什么</ p> </ li>

  • 将它重构为Python中的PHP样式(这使您能够检查逻辑是否仍然有效,例如使用断言 测试)。 例如 将列表推导转换为for循环</ p> </ li>

  • 转换为PHP </ p> </ li>
    </ ul>

    例如,< code> listspaces(string)</ code>返回 string </ code>中空格的位置,虽然使用列表推导是Pythonic,但它不是非常“PHP-onic”。</ p>
    \ n

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

    space_positions.append(i)
    返回space_positions
    </ code> </ pre>

    第二个例子, trimcopy </ code>相当棘手(自试试以来,除了 可能有目的地捕获一些预期的 - 作者(!) - 例外 - 两个可能是 string </ code>没有 len </ code>和 space </ code>包含更长的值 比 len(copy)</ code>),但很难说这是在Python中进行重构和测试的好主意。</ p>

    你可以在PHP中进行数组切片 使用 copy [:loc] </ code> /manual/en/function.array-slice.php"rel =“nofollow”> array_slice($ copy,0,$ loc); </ code> 。</ p>

    注意:通常在Python中我们会明确说明我们正在防范哪个异常(而不是口袋妖怪异常处理)。</ em> </ p>
    </ div>

展开原文

原文

I think a good process for these type of conversions is:

  • work out what the code is doing

  • refactor it into a PHP-style in Python (this enables you to check that the logic still works, e.g. using assertion tests). e.g. convert list comprehensions to for loops

  • convert to PHP

For example, listspaces(string) returns the positions of spaces in string, and although using a list comprehension is Pythonic, it's not very "PHP-onic".

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

The second example, trimcopy is rather trickier (since the try, except may purposefully be catching some expected - to the writer (!) - exceptions - two possibles are string not having a len and spaces containing values longer than len(copy)), but it's hard to say so it's a good idea to refactor in Python and test.

You can do array slicing in PHP like copy[:loc] using array_slice($copy, 0, $loc);.

Note: usually in Python we would state explicitly which exception we are defending against (as opposed to Pokemon exception handling).

doujuegai8830
doujuegai8830 谢谢我将添加此行if(strlen($ string)> 350){list($ newtext)= explode(“”,wordwrap($ string,350,“”,true)); }
接近 8 年之前 回复
duanba4942
duanba4942 几乎,这只做了trimcopy中else块内的位:list($ newtext)= explode(“”,wordwrap($ string,350,“”,true));,虽然很难分辨出函数的意图 (因为它肯定是马车)!
接近 8 年之前 回复
doubiao7267
doubiao7267 我想出这个作为php替代两个函数列表($ short)= explode(“ ”,自动换行($ string,100)); 它是否正确 ?
接近 8 年之前 回复
doutongfu9484
doutongfu9484 我想也是这样......但它可能隐藏了其余代码中的一些险恶的错误!
接近 8 年之前 回复
doufei4923
doufei4923 尝试 - 除了:我想这是因为如果复制真的至少包含复制[:loc]中的loc chars,则不会在任何地方进行检查。+
接近 8 年之前 回复



第一个函数返回给定字符串中所有空格的索引。 </ p>


  • range(len(string))</ code> 结果在列表中,数字从0到输入字符串的长度</ li>
  • if string.startswith('', 对每个索引 i </ code>计算i-1)] </ code>条件,当string(此处不是关键字)以索引给出的位置''开头时返回true i-1 </ code> </ li>
    </ ul>

    结果如费用所示。 </ p>

    对于第二个函数,我不知道space参数是什么。</ p>

    希望这有助于您创建PHP版本。 </ p>
    </ div>

展开原文

原文

The first function returns indexes of all spaces in given string.

  • range(len(string)) results in list with numbers from 0 to length of the input string
  • if string.startswith(' ', i-1)] condition is evaluated for each index i, it returns true when string (here it is not a keyword) starts with ' ' at position given by the index i-1

The result is as feela posted.

For the second function I don't know what the spaces parameter is.

Hope this will help you to create a PHP version.



这相当于Python中的两个函数</ p>

  list($ short)  = explode(“
”,wordwrap($ string,350));
</ code> </ pre>
</ div>

展开原文

原文

This is equivalent to both the functions in Python

list($short) = explode("
",wordwrap($string,350));

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问