Comments 21
is_prime = False
for i in range(2, isqrt(n)):
if n % i == 0:
is_prime = True
break
if is_prime:
print(f"{n} - простое число")
А нельзя сделать так?
for i in range(2, isqrt(n)):
if n % i == 0:
print(f"{n} - простое число")
break
Мне вообще кажется, тут с примером что то не то
Да, похоже что наоборот, выводится "простое" вместо "не простое".
Исправил код. Смысл примера не в конкретно этом примере (на простоту можно и по-другому проверить), а в том, что отпадает необходимость в флагах.
а ещё лучше вообще сделать так:
i, lim = 2, isqrt(n)
while i < lim and n % i == 0 :
i += 1
type = 'простое' if i == lim else 'составное'
printf(f'{n} — {type} число')
Переменная с именем _
используется не для оптимизаций, а чтобы показать, что хотя нам и пришлось тут написать какую-то переменную, потому что по правилам языка без этого нельзя обойтись, но значение этой переменной нас не интересует, мы его нигде не используем. Это такой хинт для того, кто будет читать этот код.
Этот код полностью эквивалентен следующему
А, так вот как эту бабуйню сделать читаемой!
генераторы. У меня с ними проблем нет, но хочется иногда чтобы код почти блок-схемой выглядел.
в смысле как у всяких джавистов-растоманов типа
something()
.something_else1()
.something_else2()
.something_else3()
Или что вы блок-схемой зовёте? Не так же код писать
| something |
|
/\
/ \
---YES---/cond\---NO---
| \ / |
| something_else2 | \ / | something_else2 |
\/
import sys
print( sys.version )
y = (1, 2, 3, (10, 20, 30, 40, 50), (33, 77), 19, 29)
a, *b, c, (d, e, *f), (g, h), *i = y
3.9.6 (tags/v3.9.6:db3ff76, Jun 28 2021, 15:26:21) [MSC v.1929 64 bit (AMD64)]
File "C:\Users\User\AppData\Local\Temp\ipykernel_17596\1470887669.py", line 4
a, *b, c, (d, e, *f), (g, h), *i = y
^
SyntaxError: multiple starred expressions in assignment
Это 3.9 недостаточно умный или у автора ошибка?
Всегда, где есть сложные выражения или логические конструкции. Например, если проверяется больше 1 условия, или если кроме вычислений идут какие-то другие действия.
Например для задач возвести все нечетные числа в квадрат или запустить корутины списковые выражения подойдут. Для более сложных, например подключиться к нескольким сокетам и собирать данные в кортежи, стоит написать генератор
Генераторы...
Так, где генераторы? Один единственный пример, и то в виде функции, еще и обернутый перед назначением переменной в list(), чтоб показать эквивалентность результата. Зачем?
Однострочные генераторы (generator expression) пишутся в круглых скобочках.
x = (выражение for i in итератор)
Тогда генератор будет возвращать только те значения...
Опять же, не надо путать генератор со списком. List comprehension создает список, не генератор. Переменная получает список как результат, никакой ленивой семантики в примере нет.
Про Else в циклах какой-то корявый пример. Во-первых: код с синтаксическим сахаром и без не идентичны. Если делать идентично и выводить в том числе и фразу про составное число то окажется, что этот синтаксический сахар тут никак не помогает. Во-вторых: опять же в следствии примера, выстраивается неправильное мнение о том для чего нужен этот механизм. А суть его одна единственная - среагировать на ситуацию, когда цикл был прерван.
p.s. Мне как человеку далёкому от Python'а кажется, что данная "фича" лишь вредна. Первое о чём подумал, что else выполнится, если цикл не осуществил итераций (напр. пустой массив на вход), но никак ни то как это работает в действительности.
Ellipsis - не замена pass
А еще туда вместо этого можно докстрингу записать.
Питон это и есть синтаксический сахар)
10 кубиков синтаксического сахара