Если вы действительно хотите одно утверждение без изменения рассматриваемого списка, вы можете попробовать my_list[:my_list.index(value)]+my_list[my_list.index(value)+1:]
. Это имеет недостатки
my_list.index(value)
дважды (не обязательно 3.8+, см. PEP572 ) my_list.remove(val)
И,
Отказ от ответственности : я действительно не рекомендую вам делать это. Но это всего лишь метод, который мне пришёл в голову.
Я действительно не вижу проблемы в написании list.remove () и печати в отдельных выражениях.
- Джей
blockquote>
Да, существует важное различие. == оператор делает преобразование типов, таким образом, это не всегда собирается сделать то, что Вы ожидаете. Например, (0 =="") возвращает true. Таким образом, Вы делаете предположение, что $str является на самом деле строкой. Если Вы уверены дело обстоит так, или если Вы не заботитесь о преобразованиях, то это прекрасно. Иначе необходимо использовать === и предпринять шаги, чтобы гарантировать сравнение строк.
я нахожу более ясным просто сделать "если (! $str)".. не уверенный в '==', но'!' должен смочь к yeld лучшие методы оптимизации, поскольку никакое преобразование типа никогда не делается и безопасно для строк, массивов, bools, чисел...
Основное различие - то, что $str == '' возвратит true для чего-либо, что это эквивалентно пустой строке (0 и ложь среди других).
Необходимо использовать или === оператор для тестирования на фактическую пустую строку или, если Вы не возражаете против преобразования и тестируете поведение, просто используйте! $str (считают пустыми () также, в зависимости от фактического намерения), который я нахожу более ясными в намерении, чем $x ==, '' (Он отсутствовал =, подписываются, и на самом деле хочет протестировать на пустую строку?.)
Используйте strlen ($str) только, когда Вы действительно будете после длины строки.
Нижняя строка, используйте надлежащий инструмент для задания, судя, какой инструмент является надлежащим на основе намерения кода.
vinko@parrot:~$ cat emptytest.php
<?php
$a = "";
$b = 0;
$c = false;
$d = "Hi!";
function is_empty1($x) { return $x == ''; }
function is_empty2($x) { return strlen($x) == 0; }
function is_empty3($x) { return $x === ''; }
function check_empty($arr) {
foreach ($arr as $v) {
echo "value is ";
var_dump($v);
echo " \$x == '' ";
var_dump(is_empty1($v));
echo " strlen($x) == 0 ";
var_dump(is_empty2($v));
echo " \$x === '' ";
var_dump(is_empty3($v));
}
}
check_empty(array($a,$b,$c,$d));
?>
vinko@parrot:~$ php emptytest.php
value is string(0) ""
$x == '' bool(true)
strlen() == 0 bool(true)
$x === '' bool(true)
value is int(0)
$x == '' bool(true)
strlen() == 0 bool(false)
$x === '' bool(false)
value is bool(false)
$x == '' bool(true)
strlen() == 0 bool(true)
$x === '' bool(false)
value is string(3) "Hi!"
$x == '' bool(false)
strlen() == 0 bool(false)
$x === '' bool(false)
Я выполнил простой сравнительный тест. (Я никогда не делал того, таким образом, это может быть абсолютно недопустимо.) Это тестирует =='', strlen () == 0, ==='', и strlen () === 0.
header('Content-type: text/plain');
// -- Testing == '';
$string = '';
$startTime = microtime(true);
for($i = 0; $i < 10000000; ++$i)
$string == '';
$endTime = microtime(true);
echo "\$string = ''; \$string == ''; took " . ($endTime - $startTime) . " seconds\n";
$string = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
$startTime = microtime(true);
for($i = 0; $i < 10000000; ++$i)
$string == '';
$endTime = microtime(true);
echo "\$string = '$string'; \$string == ''; took " . ($endTime - $startTime) . " seconds\n";
$startTime = microtime(true);
for($i = 0; $i < 10000000; ++$i)
'' == '';
$endTime = microtime(true);
echo "'' == ''; took " . ($endTime - $startTime) . " seconds\n";
// -- Testing strlen() == 0;
$string = '';
$startTime = microtime(true);
for($i = 0; $i < 10000000; ++$i)
strlen($string) == 0;
$endTime = microtime(true);
echo "\$string = ''; strlen(\$string) == 0; took " . ($endTime - $startTime) . " seconds\n";
$string = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
$startTime = microtime(true);
for($i = 0; $i < 10000000; ++$i)
strlen($string) == 0;
$endTime = microtime(true);
echo "\$string = '$string'; strlen(\$string) == 0; took " . ($endTime - $startTime) . " seconds\n";
$startTime = microtime(true);
for($i = 0; $i < 10000000; ++$i)
strlen('') == 0;
$endTime = microtime(true);
echo "strlen('') == ''; took " . ($endTime - $startTime) . " seconds\n";
// -- Testing === '';
$string = '';
$startTime = microtime(true);
for($i = 0; $i < 10000000; ++$i)
$string === '';
$endTime = microtime(true);
echo "\$string = ''; \$string === ''; took " . ($endTime - $startTime) . " seconds\n";
$string = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
$startTime = microtime(true);
for($i = 0; $i < 10000000; ++$i)
$string === '';
$endTime = microtime(true);
echo "\$string = '$string'; \$string === ''; took " . ($endTime - $startTime) . " seconds\n";
$startTime = microtime(true);
for($i = 0; $i < 10000000; ++$i)
'' === '';
$endTime = microtime(true);
echo "'' === ''; took " . ($endTime - $startTime) . " seconds\n";
// -- Testing strlen() === 0;
$string = '';
$startTime = microtime(true);
for($i = 0; $i < 10000000; ++$i)
strlen($string) === 0;
$endTime = microtime(true);
echo "\$string = ''; strlen(\$string) === 0; took " . ($endTime - $startTime) . " seconds\n";
$string = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
$startTime = microtime(true);
for($i = 0; $i < 10000000; ++$i)
strlen($string) === 0;
$endTime = microtime(true);
echo "\$string = '$string'; strlen(\$string) === 0; took " . ($endTime - $startTime) . " seconds\n";
$startTime = microtime(true);
for($i = 0; $i < 10000000; ++$i)
strlen('') === 0;
$endTime = microtime(true);
echo "strlen('') === ''; took " . ($endTime - $startTime) . " seconds\n";
Результаты:
$string = ''; $string == ''; took 1.01983308792 seconds
$string = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; $string == ''; took 1.04193401337 seconds
'' == ''; took 1.06608295441 seconds
$string = ''; strlen($string) == 0; took 2.1510848999 seconds
$string = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; strlen($string) == 0; took 2.27101397514 seconds
strlen('') == ''; took 2.5775551796 seconds
$string = ''; $string === ''; took 0.854554176331 seconds
$string = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; $string === ''; took 0.714010000229 seconds
'' === ''; took 0.749495983124 seconds
$string = ''; strlen($string) === 0; took 1.9263010025 seconds
$string = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; strlen($string) === 0; took 1.95309996605 seconds
strlen('') === ''; took 2.40874910355 seconds
Как Вы видите, по сравнению с '' о дважды с такой скоростью, как сравнение длины строки. Кроме того, использование === немного быстрее, чем использование ==, и это безопасно с точки зрения типов!Мило.
Даже если бы было различие в скорости, то Вы не должны выбирать более быстрый. Выберите более ясный.
$str == '' является лучшей практикой. Вероятно, нет большого различия в PHP, так как это знает длину своих строк, но это была бы действительно дурная привычка иметь, если бы Вы затем пошли и сделали некоторую работу на языке низшего уровня.
strlen ($str) == 0 требует, чтобы вызов к strlen и вызов сделали сравнение. $str == '' является просто сравнением.
Могли бы быть некоторые проблемы преобразования типов при выполнении $str==''
. Например, рассмотрите случаи когда $str
false
(булевская переменная) или 0
(целое число). Они могли бы просто выйти равные также. Я не абсолютно уверен в этом, таким образом, необходимо слоняться без дела с ним немного. Безопасный путь состоял бы в том, чтобы сделать $str===''
.
Различие в скорости является слишком небольшим для имения значение, я уверен. Лучший метод для использования является более читаемым. Вот две других альтернативы:
if (empty($str)) {
...
}
if (!$str) {
...
}
Примечание: Они оба оценят к истинному если $str == '0'.
Нет, они не то же (как объяснено выше), но в Ваших целях они могли бы быть взаимозаменяемыми.
Быстрее? Качественно, трудно вообразить ситуацию, где различие так или иначе было бы последовательно, но видело бы другое больше количественных ответов. При кодировании на основе скорости вот, вероятно, пример нашего любимого бранного слова, которое может быть abbrevated "пи".
Который является лучшим?
Это зависит от того, какое утверждение о $str Вы хотите подтвердить, и какое последствие Вы хотите вызвать.
Другой общий шаблон, который Вы будете видеть,
! $str
который обычно дает тот же результат - и может быть соответствующим, если Вы просто хотите протестировать на строковое значение, которое неприменимо, неважно, почему это неприменимо - который мог быть отсутствием инициализации, значения по умолчанию инициализации, присвоения, и т.д. (Я не спорю за или против этого представления, BTW.) Помнят, что то, что Вы решаете, будет, по-видимому, иметь последствия, и необходимо понять то, что вызывают состояния $str, какие последствия, на основе способа, которым Вы написали код. (И уведомление там является значением/состояниями $str, которое Вы, возможно, не явно покрыли ни одной из наших опций.)