Являются ли однострочные " 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