1 Востаннє редагувалося mamkin haker (29.07.2021 19:24:23)

Тема: Код на python в 1 стрічку

Привіт!
Чи можливо писати на пайтон як і на С++ в 1 стрічку (або майже в 1 стрічку)

С++

#include <iostream>
int main(){for (int i = 0; i < 10; ++i){printf("%d\n", i);if (i == 5){break;}}}

типу якось так :D?

python (непрацює)

for i in range(10):print(i);if (i == 5):break

2

Re: Код на python в 1 стрічку

Ні, але вам хтось заважає це робити в один рядок?

print('\n'.join(range(6))
Подякували: 0xDADA11C71

3

Re: Код на python в 1 стрічку

koala написав:

Ні, але вам хтось заважає це робити в один рядок?

print('\n'.join(range(6)))

python3 1.py
Traceback (most recent call last):
  File "1.py", line 1, in <module>
    print('\n'.join(range(6)))
TypeError: sequence item 0: expected str instance, int found

=(
нібито можна лише так...
списком, та стрічками

print('\n'.join(['0', '1', '2', '3', '4', '5']))
print('\n'.join('012345'))

якщо конвертувати в строки:

print('\n'.join(str(range(6))))

то

python3 1.py
r
a
n
g
e
(
0
,

6
)

4

Re: Код на python в 1 стрічку

ну добре, втомився я...

print('\n'.join(map(str,range(6))))

Але яка різниця. Я хотів сказати, що різні мови мають різні засоби. А писати все в один рядок має сенс лише у змаганнях на довжину коду.

Подякували: mamkin haker1

5 Востаннє редагувалося P.Y. (30.07.2021 02:30:12)

Re: Код на python в 1 стрічку

Якщо питання стосується розміщення кількох інструкцій в одному рядку, то можна, але з певними обмеженнями.
Якщо це прості інструкції, то їх можна напхати скільки-завгодно, розділяючи «;».
Але якщо це блок (опис функції, цикл, if, try тощо), то заголовок цього блоку має бути першим у рядку — а отже, один рядок може містити лише одну блочну конструкцію (заголовок і скільки-завгодно інструкцій у тілі), вкладені блоки не допускаються.
Так можна:

for c in 'qwerty': c+=c; print(c)

А так — ні:

for c in 'qwerty': if c>'e': c+=c; print(c)

З цієї ж причини, однорядковий блок не може містити гілок (else, elif, except...), бо заголовок гілки — теж заголовок, тому можливий лише на початку рядка. Так заборонено:

if 1>2: print('1>2'); else: print('1<=2')

Можна лише так:

if 1>2: print('1>2')
else: print('1<=2')

6

Re: Код на python в 1 стрічку

Я колись вів тут тему, коли Python вчив: https://replace.org.ua/topic/5674/

7

Re: Код на python в 1 стрічку

Я колись вів тут тему, коли Python вчив: https://replace.org.ua/topic/5674/

8

Re: Код на python в 1 стрічку

Узагалі, багато що з того, що робиться алгоритмічними конструкціями, можна реалізувати засобами функціонального програмування. У першу чергу, йдеться про вбудовані функції map, filter, zip та модулі itertools i functools. Використовуючи цей інструментарій, в одному виразі можна записати досить складний алгоритм.

9 Востаннє редагувалося P.Y. (30.07.2021 10:33:47)

Re: Код на python в 1 стрічку

До речі, приклад з 1-го повідомлення, якщо розписати його до робочого багаторядкового варіанту:

for i in range(10):
    print(i)
    if (i == 5): break

й звести далі до більш загального вигляду (де ми вже не можемо скористатися тим, що послідовність повністю передбачувана):

for i in якась_послідовність:
    print(i)
    if якась_умова: break

зводиться до функціонального виразу з певними труднощами — через те, що вихід відбувається після дії в циклі, а не перед нею. Якби було так:

for i in range(10):
    if (i == 5):break
    print(i)

це можна було б переписати так:

import itertools as it
for i in it.takewhile(lambda i: not(i == 5), range(10)): print(i)

Проте, оскільки нам треба було включити в вивід і той елемент, на якому умова виходу спрацювала, треба зробити це якось інакше. Було б добре, якби існувала функція takeuntil, яка повертала б результат takewhile й наступний елемент. Напишімо її.
Наприклад, можна порахувати довжину результату takewhile, додати 1, вибрати потрібну кількість елементів за допомогою islice:

import itertools as it
def takeuntil(cond, seq):
    seq, seq0=it.tee(seq) # клонуємо послідовність для безконфліктної роботи з ітераторами
    l=len(tuple(it.takewhile(lambda x:not cond(x), seq0))) + 1
    return it.islice(seq, l)

Після чого використати цю функцію подібно до takewhile:

for i in it.takeuntil(lambda i: (i == 5), range(10)): print(i)

Маючи час та натхнення, можна переписати всю функцію takeuntil як функціональний вираз і використати цей вираз замість її імені при виклику, але такий код буде важче читати.

Подякували: mamkin haker1

10 Востаннє редагувалося koala (30.07.2021 11:01:45)

Re: Код на python в 1 стрічку

lambda i: (i == 5)

Записується коротше:

5 .__eq__

11

Re: Код на python в 1 стрічку

koala написав:
lambda i: (i == 5)

Записується коротше:

5.__eq__

Тільки пробіл перед крапочкою потрібен, щоб не розпарсилось як float з подальшою синтаксичною помилкою.

Подякували: koala1

12

Re: Код на python в 1 стрічку

Дякую, виправив