create_task()
ensure_future()
create_task
, объект цикла Как вы видите, более конкретная функция create_task.
async
функция без create_task или secure_future Простой вызов async
возвращает coroutine
>>> async def doit(i):
... await asyncio.sleep(3)
... return i
>>> doit(4)
И поскольку gather
под капотом гарантирует (ensure_future
), что args являются фьючерсами, явно ensure_future
является избыточным.
Аналогичный вопрос В чем разница между loop.create_task, asyncio.async / secure_future и Task?
Вот правила для того, как эти функции работают:
stringValue.CompareTo(otherStringValue)
null
прибывает перед строкой CultureInfo.CurrentCulture.CompareInfo.Compare
, что означает, что это будет использовать зависимое от культуры сравнение. Это могло бы означать, что ß
выдержит сравнение равный SS
в Германии, или подобный stringValue.Equals(otherStringValue)
null
не считается равным ничему StringComparison
опция, она будет использовать то, что похоже на прямую порядковую проверку равенства, т.е. ß
не то же как SS
, ни на каком языке, или культура stringValue == otherStringValue
==
вызовы оператора помехи Equals(string a, string b)
метод (который в свою очередь переходит к внутреннему EqualsHelper
, чтобы сделать сравнение. .Equals()
на null
строка добирается null
ссылочное исключение, в то время как на [1 118] не делает. Object.ReferenceEquals(stringValue, otherStringValue)
Просто проверки, что ссылки являются тем же, т.е. это не всего две строки с тем же содержанием, Вы сравниваете строковый объект с собой.
<час>Примечание, что с опциями выше того использования вызовы метода, существуют перегрузки с большим количеством опций определить, как выдержать сравнение.
Мой совет, если Вы просто хотите проверить на равенство, состоит в том, чтобы решиться, хотите ли Вы использовать зависимое от культуры сравнение или нет, и затем использовать .CompareTo
или .Equals
, в зависимости от выбора.
Из MSDN:
"Метод CompareTo был разработан, прежде всего, для использования в сортировке или расположении в алфавитном порядке операций. Это не должно использоваться, когда основная цель вызова метода должна определить, эквивалентны ли две строки. Чтобы определить, эквивалентны ли две строки, звоните, Равняется методу".
Они предлагают использовать .Equals
вместо .CompareTo
при искании только равенства. Я не уверен, существует ли различие между .Equals
и ==
для string
класс. Я буду иногда использовать .Equals
или Object.ReferenceEquals
вместо ==
для моих собственных классов в случае, если кто-то приезжает в более позднее время и переопределяет ==
оператор для того класса.
Если Вам когда-либо любопытно на предмет различий в методах BCL, , Отражатель является Вашим другом :-)
я следую этим инструкциям:
Точное совпадение: РЕДАКТИРОВАНИЕ: Я ранее всегда использовал == оператор на принципе, который внутри Равняется (строка, строка) объекту ==, оператор используется для сравнения ссылок на объект, но кажется, что strA.Equals (strB) все еще на 1-11% быстрее в целом, чем строка. Равняется (Стра, strB), Стра == strB, и строка. CompareOrdinal (Стра, strB). Я циклично выполняюсь протестированный с StopWatch и на строковых значениях interned/non-interned с теми же/отличающимися длинами строки, и на переменных размерах (1B к 5 МБ).
strA.Equals(strB)
Человекочитаемое соответствие (Западные культуры, нечувствительные к регистру):
string.Compare(strA, strB, StringComparison.OrdinalIgnoreCase) == 0
Человекочитаемое соответствие (Все другие культуры, нечувствительный случай/диакритический знак/кана/и т.д., определенный CultureInfo):
string.Compare(strA, strB, myCultureInfo) == 0
Человекочитаемое соответствие с пользовательскими правилами (Все другие культуры):
CompareOptions compareOptions = CompareOptions.IgnoreCase
| CompareOptions.IgnoreWidth
| CompareOptions.IgnoreNonSpace;
string.Compare(strA, strB, CultureInfo.CurrentCulture, compareOptions) == 0
Как сказанный Ed, CompareTo используется для сортировки.
существует различие, однако, между.Equals и ==.
== решает к по существу следующий код:
if(object.ReferenceEquals(left, null) &&
object.ReferenceEquals(right, null))
return true;
if(object.ReferenceEquals(left, null))
return right.Equals(left);
return left.Equals(right);
простая причина следующая, выдаст исключение:
string a = null;
string b = "foo";
bool equal = a.Equals(b);
И следующее не будет:
string a = null;
string b = "foo";
bool equal = a == b;
Не то, чтобы производительность обычно имеет значение с 99% времен, необходимо сделать это, но если бы необходимо было сделать это в цикле несколько миллионов раз, то я высоко предложил бы, чтобы Вы использовали.Equals или ==, потому что, как только это находит символ, который не соответствует ему, выводит все это как ложь, но если Вы используете CompareTo, это должно будет выяснить, который символ является меньше, чем другой, ведя к немного худшему времени производительности.
, Если бы Ваше приложение будет работать в разных странах, я рекомендовал бы, чтобы Вы смотрели на последствия CultureInfo и возможно использовали.Equals. Так как я только действительно пишу приложения для США (и не заботьтесь, не работают ли они правильно кем-то), я всегда просто использую ==.
В формах Вы перечислили здесь, нет большого различия между двумя. CompareTo
заканчивает тем, что звонил CompareInfo
метод, который делает сравнение с помощью текущей культуры; Equals
назван ==
оператор.
, Если Вы рассматриваете перегрузки, тогда вещи становятся отличающимися. Compare
и ==
может только использовать текущую культуру для сравнения строки. Equals
и String.Compare
может взять StringComparison
аргумент перечисления, которые позволяют Вам определить нечувствительные к культуре или нечувствительные к регистру сравнения. [Только 119] позволяют Вам определять CultureInfo
и выполнять сравнения с помощью культуры кроме культуры по умолчанию.
из-за его универсальности, я нахожу, что использую [еще 1111], чем какой-либо другой метод сравнения; это позволяет мне определить точно, что я хочу.
Используя.Equals также намного легче к , читает .
с .Equals вы также получаете параметры StringComparison. очень удобен для игнорирования дела и прочего.
кстати, это будет оцениваться как false
string a = "myString";
string b = "myString";
return a==b
Поскольку == сравнивает значения a и b (которые являются указателями), это будет оцениваться как true, только если указатели указывают на один и тот же объект в памяти. .Equals разыменовывает указатели и сравнивает значения, хранящиеся в указателях. a.Равенство (b) здесь будет истинным.
и если вы измените b на:
b = "MYSTRING";
, тогда a.Equals (b) будет ложным, но
a.Equals(b, StringComparison.OrdinalIgnoreCase)
будет истинным
a.CompareTo (b) вызывает функцию CompareTo строки, которая сравнивает значения в указателей и возвращает <0, если значение, хранящееся в a, меньше значения, хранящегося в b, возвращает 0, если a.Equals (b) истинно, и> 0 в противном случае. Однако это чувствительно к регистру, я думаю, что у CompareTo есть варианты игнорировать регистр и тому подобное, но сейчас нет времени смотреть. Как уже было сказано другими, это будет сделано для сортировки. Такое сравнение на равенство приведет к ненужным накладным расходам.
Я уверен, что опускаю материал, но думаю, что этого должно быть достаточно, чтобы начать экспериментировать, если вам нужно больше деталей.