Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Общие вопросы > разветвление в цикле


Автор: PyS 29.9.2006, 12:06
Всем привет!
Пожалуйста, помогите записать следующий код в одну строку:
Код

for i in range(10):
   if i==1: 
       print 1 
   elif i==3: 
       print 7**2+9
   else: 
       print 5**6

Автор: albertn 29.9.2006, 12:35
Получи:
Код

print '\n'.join(map(lambda i:str(i==1 and 1 or i==3 and 7**2+9 or 5**6),range(10)))

Можно еще конечно через sys.stdout.write, но тогда нарушается концепция функционального программирования.

Автор: PyS 29.9.2006, 12:37
а вот такой?
Код

i=1
if i==1: 
    print 1 
elif i==3: 
    print 7**2+9
else: 
    print 5**6

Автор: Artemios 29.9.2006, 12:41
Код

[i==1 and 1 or i==3 and 7**2+9 or 5**6 for i in range(10)]

Автор: albertn 29.9.2006, 12:41
Цитата(PyS @ 29.9.2006,  12:37)
а вот такой?
Код

i=1
if i==1: 
    print 1 
elif i==3: 
    print 7**2+9
else: 
    print 5**6

Код

i=1
print i==1 and 1 or i==3 and 7**2+9 or 5**6

Автор: Artemios 29.9.2006, 12:43
Ой, сорри, не увидел, уже все написали smile

Автор: PyS 29.9.2006, 12:46
albertn,  спасибо!

что-то я привел слишком простой код:
Код

i=1
if i==1: 
    print 1 
elif i==3: 
    exec 'i = 7**2+9'
    print i
else: 
   e=eval('5**6')
print 'e = ', e


в вветвлениях разные операторы или блоки операторов

Автор: albertn 29.9.2006, 12:49
Цитата(PyS @ 29.9.2006,  12:46)
albertn,  спасибо!

что-то я привел слишком простой код:
Код

i=1
if i==1: 
    print 1 
elif i==3: 
    exec 'i = 7**2+9'
    print i
else: 
   e=eval('5**6')
print 'e = ', e


в вветвлениях разные операторы или блоки операторов

Эт ты конечно загнул. В принципе это можно, но а нужно ли оно???

Автор: Artemios 29.9.2006, 12:55
Код

exec "e=0\ni=1\nif i==1: \n\tprint 1\nelif i==3: \n\texec 'i = 7**2+9'\n\tprint i\nelse: \n\te=eval('5**6')\nprint 'e = ', e"

smile

Автор: albertn 29.9.2006, 12:55
Можно немного поприкалываюсь smile
Код

exec "e=0\ni=1\nif i==1:\n    print i\nelif i==3:\n    exec 'i = 7**2+9'\n    print i\nelse:\n    e=eval('5**6')\nprint 'e = ', e"


Добавлено @ 12:56 
Artemios, прям одновременно, но у тебя ошибки

Автор: PyS 29.9.2006, 12:58
Artemios, спасибо, но как-то не читабельно. smile
+ у меня иногда "гонит" exec 

Автор: proDiva 29.9.2006, 13:03
До чего дошла наука!  Хитро придумано......... smile  тогда мою прогу можно в три строчки переписать))))

Автор: Artemios 29.9.2006, 13:12
Цитата(albertn @  29.9.2006,  12:55 Найти цитируемый пост)
но у тебя ошибки 

где? я с консоли копировал, прежде проверив...

Автор: PyS 29.9.2006, 13:13
Цитата(proDiva @  29.9.2006,  20:03 Найти цитируемый пост)
До чего дошла наука!  Хитро придумано......... smile  тогда мою прогу можно в три строчки переписать)))) 

просто читать её будет сложно.

Автор: albertn 29.9.2006, 13:24
Цитата(Artemios @  29.9.2006,  13:12 Найти цитируемый пост)
где? я с консоли копировал, прежде проверив... 

Пробелы не там вставил smile

Автор: PyS 29.9.2006, 13:29
albertn,  Artemios,  это интересные моменты в программировании на питоне, но когда работаешь в группе, то лучше чтобы код был читабельным и для других. smile

Добавлено @ 13:30 
это пример для для одного elif, а если их около 10?

Добавлено @ 13:33 
вот интересный пример:
http://omsk.lug.ru/wacko/Python/Perfomance/MyTips#h448-2

Автор: albertn 29.9.2006, 13:33
Цитата(PyS @ 29.9.2006,  13:29)
albertn,  Artemios,  это интересные моменты в программировании на питоне, но когда работаешь в группе, то лучше чтобы код был читабельным и для других. smile

Добавлено @ 13:30 
это пример для для одного elif, а если их около 10?

Поэтому и не стоит злоупотреблять минимизацией количества строк, а вставлять её там, где это действительно надо.

Добавлено @ 13:38 
Цитата(PyS @  29.9.2006,  13:29 Найти цитируемый пост)
это пример для для одного elif, а если их около 10?

а ничего не меняется
Код

print i==1 and "1" or i==2 and "2" or i==3 and "3" or i==4 and "4" or ">=5"

Но тут нужно быть внимательнее, т.к. то, что стоит после and должно быть истинным (нельзя false, 0, None, "", (), {}, ...)

Автор: Artemios 29.9.2006, 13:39
Цитата(albertn @  29.9.2006,  13:24 Найти цитируемый пост)
Пробелы не там вставил

Неа, просто лишние в конце строк удалять лень было - они там значения неимеют. Где надо - стоит табуляция \t - для наглядности smile

Автор: albertn 29.9.2006, 13:41
Цитата(Artemios @ 29.9.2006,  13:39)
Неа, просто лишние в конце строк удалять лень было - они там значения неимеют. Где надо - стоит табуляция \t - для наглядности smile

Точно, а я и не заметил smile но наглядности все-равно я не заметил smile Нет ее вообще smile

Автор: PyS 29.9.2006, 13:52
Цитата(albertn @  29.9.2006,  16:33 Найти цитируемый пост)

а ничего не меняется

а если код:
Код
if i==1:
    e=f1()
    q1=f2()
    return f1_1(e, q1)
elif i==2:
    w=f3()
    e2=f4()
    return f2_1(e, q1)
elif i==17:
    e=f5()
    print vars()
    q1=f6()
    eee = f3_1(e, q1) or [(-1, '')]
elif i==-1:
    e=f1()
    t=f2()
    f4_1(**vars())


думаю хватит

Автор: Artemios 29.9.2006, 13:57
Реально и это можно в одну строчку, только смысл?

Автор: PyS 29.9.2006, 14:03
Цитата(Artemios @  29.9.2006,  16:57 Найти цитируемый пост)
Реально и это можно в одну строчку, только смысл? 

просто нужно сильно сократить код, но при этом оставить его читабельным. 

Автор: albertn 29.9.2006, 14:20
Цитата(PyS @  29.9.2006,  14:03 Найти цитируемый пост)
просто нужно сильно сократить код, но при этом оставить его читабельным.  

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

Если результатом работы функции должно быть изменение нескольких переменных, то можно сделать, чтобы возвращался список (или словарь), по которому можно смело выставить все эти значения.

Я конечно понимаю, что краткость сестра таланта, но всему есть свои пределы.

Автор: PyS 29.9.2006, 14:31
Цитата(albertn @  29.9.2006,  17:20 Найти цитируемый пост)

Я конечно понимаю, что краткость сестра таланта, но всему есть свои пределы.

albertn,  Согласен!
Но когда у тебя строк так 200 -... то сильно сокращать охота. smile
albertn,  Artemios,  спасибо!

Автор: Artemios 29.9.2006, 15:42
Цитата(PyS @  29.9.2006,  14:31 Найти цитируемый пост)
Но когда у тебя строк так 200

А что, это много? smile
Цитата(PyS @  29.9.2006,  14:31 Найти цитируемый пост)
albertn,  Artemios,  спасибо! 

Было б за что... smile

Автор: setq 29.9.2006, 15:51
Ну если все 200 строк состоят из elifов, то возможно имеет смысл заменить их на работу со словарём (как это порекомендовали в соседней теме).

Автор: proDiva 29.9.2006, 15:55
Цитата(albertn @  29.9.2006,  14:20 Найти цитируемый пост)
Главное не нарушать принципы функционального программирования при таком подходе.

Поподробнее, пожалуйста...... smile 
Цитата(setq @  29.9.2006,  15:51 Найти цитируемый пост)
Ну если все 200 строк состоят из elifов, то возможно имеет смысл заменить их на работу со словарём

И вот здесь, пжалста))) smile 

Автор: setq 29.9.2006, 17:18
BAD

Код

if expr1:
    f(x)
elif expr2:
    g(x)
elif expr3:
    h(x)
elif ...


GOOD

Код

# somewhere
fdict = {
    expr1: f,
    expr2: g,
    expr3: h,
    ...

}

# somewhere else
f = fdict[expr]
f(x)

Автор: proDiva 30.9.2006, 09:22
setq, красота одним словом, теперь так и буду писать smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)