Вы должны передать массив InputPhoneContact
в ImportContactsRequest
, как следует из документации:
https://lonamiwebs.github.io/Telethon/methods/contacts/import_contacts.html
Этот код должен работать:
try:
contact = InputPhoneContact(client_id = 0, phone = "+" + line, first_name="ABC", last_name="abc")
result = client(functions.contacts.ImportContactsRequest([contact]))
Это потому, что цикл for
был определен таким образом в Спецификации языка Java .
BasicForStatement:
for ( ForInit ; Expression ; ForUpdate ) Statement
ForStatementNoShortIf:
for ( ForInit ; Expression ; ForUpdate ) StatementNoShortIf
ForInit:
StatementExpressionList
LocalVariableDeclaration
ForUpdate:
StatementExpressionList
StatementExpressionList:
StatementExpression
StatementExpressionList , StatementExpression
Таким образом, он должен быть StatementExpression
или кратным StatementExpression
с, а StatementExpression
определяется как:
StatementExpression:
Assignment
PreIncrementExpression
PreDecrementExpression
PostIncrementExpression
PostDecrementExpression
MethodInvocation
ClassInstanceCreationExpression
0 <= n ? (i++) : (i--)
не относятся к числу таких, поэтому они не принимаются. i += ((0 <= n) ? 1 : -1)
- это задание, поэтому оно работает.
заменить
0 <= n ? (i++) : (i--)
на
i += ((0 <= n) ? 1 : -1)
, которые должны работать
i--
или i++
).
– John WH Smith
17.05.2020, 07:35
Ваш код выдает ошибку в основном из-за того, что вы пытаетесь решить свою проблему с помощью неверного алгоритма. Тот факт, что JLS не допускает использование троичного в качестве условия в для цикла , также не помогает - но главная проблема в том, что вы упускаете правильное решение задачи.
Давайте начнем с общего утверждения, prematureOptimization == sqrt(sum(evil))
- сначала вы должны рассмотреть , что вы хотите сделать, а не , как это сделать или , почему код не работает.
Шаг i должен быть равен 1, если n равно> = 0, в противном случае -1
( примечание: если n является инвариантом (и он здесь) с использованием, например, abs (n) или n < 0 в условии, это плохая практика, хотя большинство компиляторов будет пытаться вычленить инвариант из цикла, обычно следует просто используйте временную переменную для хранения результата и вместо этого используйте результат в сравнении)
Итак, код под рукой должен быть:
void doSomething( int n ) {
if ( n >= 0 )
for( int i = 0; i < n; i++ )
f( i, n );
else
for( int i = 0; i > n; i-- )
f( i, n );
}
Факторинг из инвариантов и разделение отдельных ветвей кода - основные методы, используемые для повышения эффективности алгоритмов (не преждевременная оптимизация , обратите внимание); нет более быстрого и чистого способа сделать это. Некоторые могут возразить, что это случай разматывания петли - это очень хорошо было бы , если бы не тот факт, что эти две петли не должны быть намотаны вместе в первую очередь .. . [1 125]
Другое дело: третья операция в для цикла всегда была обычным оператором; давайте попробуем угадать , почему следующий код не компилируется?
0 <= n ? (i++) : (i--); // error: not a statement
... может быть, потому что следующий код тоже не скомпилируется?
0 <= n ? i : i; // error: not a statement
... и это по той же причине, что приведенный ниже код не будет работать и в Java?
i; // error: not a statement
Ваш ответ: ternary - это не утверждение - ternary просто возвращает значение и значение не является оператором ( по крайней мере в Java ); i++
и i--
разрешены в троичной форме только потому, что они возвращают значение , но они также вызывают побочные эффекты здесь.
Прежде всего, я бы рекомендовал не писать код таким способом. Целью кода является «считать от нуля до n, если n положительно, считать от 0 до n, если n отрицательно», но я бы вместо этого написал:
for (int i = 0; i < abs(n); i += 1)
{
int argument = n < 0 ? -i : i;
f(argument, n);
}
Но это не отвечает на ваш вопрос, а именно:
Почему я не могу использовать операторы
?:
в третьем аргументе для циклов for в Java?
A for
петля имеет структуру for ( initialization ; condition ; action )
.
Целью выражения является вычисление значения.
Цель заявления - предпринять действие.
Существуют некоторые выражения, которые по замыслу одновременно вычисляют значение и выполняют действие. i++
, i += j
, new foo()
, method()
и так далее.
Это плохой стиль - иметь любое другое выражение, которое одновременно вычисляет значение и выполняет действие. Такие выражения трудно рассуждать.
Поэтому действие цикла for
ограничивается тем, чтобы ограничивалось только теми выражениями, которые по замыслу одновременно вычисляют значение и предпринимают действие .
По сути, запретив этот код, компилятор говорит вам, что вы сделали неудачный стилистический выбор. b?i++:i--
является допустимым выражением, но это действительно плохой стиль, потому что он превращает то, что предполагается , вычисляя значение в , создавая побочный эффект и игнорируя значение . [1 125]