Являются ли однострочные " if " / " for " -операторы хорошим стилем Python?

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

Я googled вокруг и не могу найти, какие из них вы можете выполнять? Может ли кто-нибудь посоветовать и предпочтительно привести несколько примеров?

например, могу ли я сделать это в одной строке:

example = "example"
if "exam" in example:
    print "yes!"

или:

for a in someList:
    list.append(splitColon.split(a))

10 ответов


Ну

if "exam" in "example": print "yes!"

это улучшение? нет. Вы даже можете добавить больше утверждений в тело if-п., разделяя их точкой с запятой. Я рекомендую против что правда.


я обнаружил, что в большинстве случаев делать предложения блоков на одной строке-плохая идея.

это, опять же как общность, снизит качество формы кода. Высококачественная форма кода является ключевой функцией языка для python.

в некоторых случаях питон предложит способы сделать вещи на одной линии, что, безусловно, более подходящие для Python. Такие вещи, как то, что Ник D упомянул с пониманием списка:

newlist = [splitColon.split(a) for a in someList]

хотя если вам нужен многоразовый список конкретно вы можете рассмотреть возможность использования генератора вместо

listgen = (splitColon.split(a) for a in someList)

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

в современных версиях python также есть встроенный тернарный оператор, который позволяет вам делать такие вещи, как

string_to_print = "yes!" if "exam" in "example" else ""
print string_to_print

или

iterator = max_value if iterator > max_value else iterator

некоторые люди могут найти их более читаемыми и полезными, чем аналогичные if (condition): блок.

когда дело доходит до этого, речь идет о стиле кода и о том, какой стандарт с командой вы работаете. Это самое важное, но в целом я бы посоветовал не использовать блоки одной строки, поскольку форма кода в python очень важна.


в целом, все допустимые синтаксически:

if condition:
    do_something()


if condition: do_something()

if condition:
    do_something()
    do_something_else()

if condition: do_something(); do_something_else()

...так далее.


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

a = 1, если x > 15 еще 2


for a in someList:
    list.append(splitColon.split(a))

вы можете переписать выше как:

newlist = [splitColon.split(a) for a in someList]

Python позволяет поместить предложение с отступом в одну строку, если это только одна строка:

if "exam" in example: print "yes!"

def squared(x): return x * x

class MyException(Exception): pass

вы можете сделать все это в одной строке, опустив example переменной:

if "exam" in "example": print "yes!"

более старые версии Python позволят только одно простое утверждение после for ...: if ...: или аналогичные вводные заявления блока.

я вижу, что можно иметь несколько простых операторов в той же строке, что и любой из них. Однако, существуют различные комбинации, которые не работают. Например, мы можем:

for i in range(3): print "Here's i:"; print i

... но, с другой стороны, мы не можем:

for i in range(3): if i % 2: print "That's odd!"

можно:

x=10
while x > 0: print x; x-=1

... но мы не могу:

x=10; while x > 0: print x; x-=1

... и так далее.

в любом случае все это считается крайне не подходящие для Python. Если вы пишете такой код, то опыт Pythonistas, вероятно, будет иметь смутное представление о ваших навыках.

в некоторых случаях допустимо комбинировать несколько операторов в строке. Например:

x=0; y=1

... или даже:

if some_condition(): break

... для простого break continue и даже return заявления или назначения.

в частности, если нужно использовать серию elif можно использовать что-то вроде:

if     keystroke == 'q':   break
elif   keystroke == 'c':   action='continue'
elif   keystroke == 'd':   action='delete'
# ...
else:                      action='ask again'

... тогда вы не будете слишком раздражать своих коллег. (Впрочем, цепи elif как этот крик, который нужно преобразовать в диспетчерский стол ... словарь, который может выглядеть как:

dispatch = {
    'q': foo.break,
    'c': foo.continue,
    'd': foo.delete
    }


# ...
while True:
    key = SomeGetKey()
    dispatch.get(key, foo.try_again)()

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

в основном, он имитирует троичный оператор в c, давая вам способ проверить истинность и вернуть значение, основанное на этом. Например:

>>> (1 and ["firstvalue"] or ["secondvalue"])[0]
"firstvalue"
>>> (0 and ["firstvalue"] or ["secondvalue"])[0]
"secondvalue"

Это пример "если еще" с действиями.

>>> def fun(num):
    print 'This is %d' % num
>>> fun(10) if 10 > 0 else fun(2)
this is 10
OR
>>> fun(10) if 10 < 0 else 1
1