Pull to refresh

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} число')

Я не питонист, но мне кажется Вы тоже немного перемудрили с циклом - получается, что Вы проверяете чтобы оно делилось нацело на каждое из чисел в интервале от 2 до корня.

https://www.online-python.com/daMsAQ3HXO

да, конечно вы правы, там должно быть !=

Переменная с именем _ используется не для оптимизаций, а чтобы показать, что хотя нам и пришлось тут написать какую-то переменную, потому что по правилам языка без этого нельзя обойтись, но значение этой переменной нас не интересует, мы его нигде не используем. Это такой хинт для того, кто будет читать этот код.

Абсолютно верно. Но, к сожалению, на моем обыте было очень много людей, которые думали, что _ память все-таки экономит.
Написать в подзаголовке "вниманию горе-оптимизаторов" у меня рука не повернулась

Этот код полностью эквивалентен следующему

А, так вот как эту бабуйню сделать читаемой!

Какую конкретно? Сопостовления или генераторы?

генераторы. У меня с ними проблем нет, но хочется иногда чтобы код почти блок-схемой выглядел.

в смысле как у всяких джавистов-растоманов типа

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 недостаточно умный или у автора ошибка?

естественно, у меня ошибка.
две и больше * на обном уровне распаковки быть не может - иначе непонятно (ни интерпретатору, ни программисту), в какие переменные класть значения и сколько их класть

UFO just landed and posted this here

Всегда, где есть сложные выражения или логические конструкции. Например, если проверяется больше 1 условия, или если кроме вычислений идут какие-то другие действия.
Например для задач возвести все нечетные числа в квадрат или запустить корутины списковые выражения подойдут. Для более сложных, например подключиться к нескольким сокетам и собирать данные в кортежи, стоит написать генератор

Генераторы...

Так, где генераторы? Один единственный пример, и то в виде функции, еще и обернутый перед назначением переменной в list(), чтоб показать эквивалентность результата. Зачем?

Однострочные генераторы (generator expression) пишутся в круглых скобочках.

x = (выражение for i in итератор)

Тогда генератор будет возвращать только те значения...

Опять же, не надо путать генератор со списком. List comprehension создает список, не генератор. Переменная получает список как результат, никакой ленивой семантики в примере нет.

Про Else в циклах какой-то корявый пример. Во-первых: код с синтаксическим сахаром и без не идентичны. Если делать идентично и выводить в том числе и фразу про составное число то окажется, что этот синтаксический сахар тут никак не помогает. Во-вторых: опять же в следствии примера, выстраивается неправильное мнение о том для чего нужен этот механизм. А суть его одна единственная - среагировать на ситуацию, когда цикл был прерван.

p.s. Мне как человеку далёкому от Python'а кажется, что данная "фича" лишь вредна. Первое о чём подумал, что else выполнится, если цикл не осуществил итераций (напр. пустой массив на вход), но никак ни то как это работает в действительности.

Ellipsis - не замена pass

А еще туда вместо этого можно докстрингу записать.

Питон это и есть синтаксический сахар)

Sign up to leave a comment.

Articles