Стандартная реализация Python (общеизвестный как CPython, как это записано в C) использует потоки ОС, но так как существует Глобальная Блокировка Интерпретатора , только одному потоку за один раз позволяют выполнить код Python. Но в рамках тех ограничений, библиотеки поточной обработки устойчивы и широко используются.
, Если Вы хотите быть в состоянии использовать несколько ядер процессора, существует несколько опций. Нужно использовать несколько интерпретаторов Python одновременно, как упомянуто другими. Другая опция состоит в том, чтобы использовать различную реализацию Python, который не использует GIL. Две основных опции Jython и IronPython.
Jython записан в Java и теперь довольно зрел, хотя некоторые несовместимости остаются. Например, веб-платформа Django отлично еще не работает , но становится ближе все время. Jython большой для потокобезопасности , выходит лучше в сравнительных тестах и имеет развязное сообщение для тех, которые желают GIL.
IronPython использует платформу.NET и записан в C#. Совместимость достигает стадии, где Django может работать на IronPython (по крайней мере, как демонстрация) и существует руководства по использованию потоков в IronPython.
Можно ли заменить каждую конструкцию if-else эквивалентным условным выражением с помощью условного оператора?
Нет, вы задали этот вопрос задом наперед. "Тела" if / else содержат операторы, и невозможно превратить каждый оператор в выражение , такое как операторы try, while, break, а также объявления. Однако многие «операторы» на самом деле являются замаскированными выражениями:
++i;
blah = 42;
some_method(a,b,c);
Все они являются операторами, которые состоят из одного выражения (приращение, присваивание, вызов функции, соответственно) и могут быть преобразованы в выражения в условном выражении.
Итак , давайте перевернем вопрос, поскольку похоже, что вы действительно хотите знать, насколько операторы if / else эквивалентны тернарным условным выражениям: Можно ли заменить каждое условное выражение эквивалентными операторами if / else? Почти все, да. Типичный пример - операторы возврата:
return cond ? t : f;
// becomes:
if (cond) return t;
else return f;
Но также и другие выражения:
n = (cond ? t : f);
// becomes:
if (cond) n = t;
else n = f;
Что начинает указывать на места, где условные выражения не могут быть легко заменены: инициализации . Поскольку вы можете инициализировать объект только один раз, вы должны разбить инициализацию, использующую условное выражение, на использование вместо этого явной временной переменной:
T obj (cond ? t : f);
// becomes:
SomeType temp;
if (cond) temp = t;
else temp = f;
T obj (temp);
Обратите внимание, что это гораздо более утомительно / громоздко и требует чего-то зависящего от типа, если SomeType не может быть по умолчанию -конструировано и назначено.
Вкл. на поверхности нет. Условный оператор - это выражение (то есть, у него есть значение), а if / else - это оператор (таким образом, не имеет значения). Они удовлетворяют различные «потребности» в синтаксисе языка.
Однако, поскольку вы можете игнорировать значения выражений и поскольку любое выражение можно превратить в оператор, добавив точку с запятой, вы можете по существу эмулировать if / else с помощью условного выражения и две вспомогательные функции:
// Original code:
if (condition) {
// block 1
}
else {
// block 2
}
// conditional expression replacement:
bool if_block() {
// block 1
return true;
}
bool else_block() {
// block 2
return true;
}
// Here's the conditional expression. bool value discarded:
condition ? if_block() : else_block();
Однако, сказав это, я не уверен, что это нечто большее, чем любопытство ...
if( cond )
break;
else
a=b;
не всегда можно заменить оператором ?:
. Вы можете часто (если не всегда) переосмыслить весь свой код, чтобы обеспечить эту замену, но обычно вы не можете поместить что-либо, что контролирует выполнение, в ?:
. break
, return
, циклы, throw
и т. Д.
Нет, конечно, нет. По уже указанным и другим причинам!
#include <cstdlib>
#include <iostream>
int main()
{
if(int i = std::rand() % 2)
{
std::cout << i << " is odd" << std::endl;
}
else
{
std::cout << i << " is even" << std::endl;
}
}
Узнайте, где это заявлено. Это не часто используемый метод, но его можно использовать в таких ситуациях, как COM, где каждый вызов возвращает HRESULT, который (почти всегда) равен нулю в случае успеха (S_OK), ненулевой в случае неудачи, поэтому вы можете написать что-то вроде:
if(HRESULT hr = myInterface->myMethod())
{
_com_raise_error(hr);
}
Тернарный оператор не может делать ничего аналогичного.
In principle, yes:
if (A) B; else C
becomes
try {
A ? throw TrueResult() : throw FalseResult();
// or: throw A ? TrueResult() : FalseResult();
} catch (TrueResult) {
B;
} catch (FalseResult) {
C;
}
Compared to using procedures (which are more natural), this allows break
, continue
, return
etc. It requires evaluation of A
doesn't end with TrueResult
/FalseResult
but if you use those exceptions only to simulate if
, it won't be a problem.
Условный оператор ожидает, что оба элемента, следующие за ?
, будут r-значениями (поскольку результат условного оператора сам по себе является r-значением) - так что пока я я не совсем специалист по стандартам C / C ++, мне кажется, что следующее будет запрещено (или, если это не удастся, крайне плохой стиль кодирования ...):
(condition) ? return x : return y;
, тогда как версия if-else будет вполне стандартной:
if(condition) return x;
else return y;
Теперь, с учетом сказанного, могли бы вы взять любую программу и написать аналогичную программу, которая не использует if-else? Конечно, возможно. Но это не значит, что это была бы хорошая идея. ;)
Использование условного оператора приводит к выражению, и оба возможных результата условного оператора должны быть «совместимыми» (преобразовываться в один и тот же тип).
if
- конструкция else
не должна даже «возвращать» какой-либо тип, не говоря уже о том же самом из обеих веток.
GCC имеет выражение оператора
, с его помощью вы можете переписать операторы if
в эквивалентные ?:
выражения:
if (<expression>)
<statement1>
else
<statement2>
РЕДАКТИРОВАТЬ: Приведения void
служат двум целям. Подвыражения в ?:
должны иметь один и тот же тип, и без приведения void
компилятор может вывести предупреждение: оператор без эффекта
.
(<expression>)? (void)({<statement1>}) : (void)({<statement2>});