複数のステートメントを1行に入れる方法は?


143

この問題を正確に熟考するためのタイトルがわからなかったので、ゴルフをコーディングすることは少し具体的ではないにしても適切と思われます。

私はpythonの理解を少し知っていますが、「読む」のは非常に難しいようです。私の見方では、内包表記は次のコードと同じように実行できます。

for i in range(10): if i == 9: print('i equals 9')

このコードは、現在の理解よりもはるかに読みやすくなっていますが、1行に2つの「:」を含めることはできないことに気づきました...これも私をもたらします...

私の質問:

次の例を1行にまとめる方法はありますか?

try:
    if sam[0] != 'harry':
        print('hello',  sam)
except:
    pass

このようなものは素晴らしいでしょう:

try: if sam[0] != 'harry': print('hellp',  sam)
except:pass

しかし、再び衝突する「:」に遭遇します。exceptなしでtry(またはそれに似たもの)を実行する方法があるかどうかも知りたいです。その無駄なライン。

入力していただきありがとうございます...そしてここにスマイリーがあります:D


なぜ例外が発生するのですか?
Ignacio Vazquez-Abrams、

1
sam [2]が存在しない可能性があります。これは架空の例です。ありがとう
Rhys

4
理解力はPythonでは何か違う。すべてを1行に収めることは理解できません。
Felix Kling、

私はこれを知っています。ありがとう。私は、理解が上手くいくかもしれないが、私の問題/質問の根本であるコロンが原因でできないと私がどのように考えるかを示していただけです
Rhys

\nインデントにはsとスペースを使用するだけです。

回答:


144

残念ながら、PythonではコマンドラインのワンライナープログラムではPythonがほとんど役に立たなくなります。括弧を明示的に使用しても、構文例外は回避されません。セミコロンで区切られた一連の単純なステートメントで回避できます。

for i in range(10): print "foo"; print "bar"

しかし、インデントされたブロック(などif)を導入する構成を追加するとすぐに、改行が必要になります。また、

for i in range(10): print "i equals 9" if i==9 else None

合法であり、あなたが望むものに近いかもしれません。

try ... except事に関しては、それなしでは全く役に立たないでしょうexcepttry「このコードを実行したいのですが、例外がスローされる可能性があります」と言います。例外を気にしない場合は、を残してくださいtry。しかし、それを入れるとすぐに、「潜在的な例外を処理したい」と言っています。次にpass、それを具体的に処理しないことを望みます。しかし、それはあなたのコードが実行し続けることを意味します、そうでなければそれはそうしません。


1
興味深いことに、私はあなたの後者の例が私が探していた答えに最も近いと思います。おかげで
Rhys

「試してみて」の質問に関して...もし私がいつかそれが例外をスローするつもりであることがわかっているなら、私はただコードを実行し続けたいです...たとえば、文字列が整数であるかどうかを確認するためにtry:int(string)...できない場合は、次の行に進んでください。例外は必要ありません。私はあなたの言っていることを理解していますが、このタイプのチェック/エラー処理に対応できる他の方法はありますか
Rhys

4
Re try::Pythonの構文規則では、「except」句を伴わずに、「try」句を1つだけ使用することはできません。私がやっていることは、try-exceptを独自の関数でラップし、代わりにこれを呼び出します。のようif (checkint(s))...def checkint(s): try: int(s)\nreturn True\nexcept: return False
ThomasH

ThomasH、私はあなたのコメントがどこかでの質問への回答であり、私がそれを賛成できるようにしたいと思います。優れた。
Ivan X

5
@ThomasH " (これにより、Pythonはコマンドラインの1行プログラムでは役に立たなくなります) ":私を妨げません。95%の場合、改行は不要です。残りは\ nを介して:python -c "exec\"print 'A' \nfor i in 1,2,3: print i \""
kxr

52

組み込みのexecステートメントを使用できます。例:

exec("try: \n \t if sam[0] != 'harry': \n \t\t print('hello',  sam) \nexcept: pass")

どこに\n改行され、\tインデント(タブ)として使用されています。
また、インデントが正確に一致するように、使用するスペースを数える必要があります。

しかし、他のすべての答えとして、既にこれは本当に場合にのみ使用することはもちろんである、と述べてい一行にそれを置くために。

exec 任意のPythonコードの実行を許可するため、非常に危険なステートメントです(特にwebappをビルドする場合)。


4
ありがとうございました!他とは異なり、実際に機能するため、これは正解としてマークする必要があります。しかし、もちろん、決してあなたが持っていない限り、これを行うありません!ただし、固定の1行のテキストボックスにスクリプトを入力する必要があるため、実際にはこの構文が必要です。
Sanjay Manohar 2014

よろしくお願いします!命の恩人!私はこれをスクリプトでは使用していませんが、インタラクティブシェルではデバッグに役立ちます。多くの場合、インタラクティブシェルを終了して再起動するだけでクリーンな環境になり、特定の手順を繰り返す必要があります。つまり、モジュール、いくつかの関数を実行し、特定の関数でいくつかのテストを行います。Soooo、「モジュールのインポート、いくつかの関数の実行」をワンライナーに入れて、履歴からすばやくコールバックして実行できる方法を探していました(履歴から5つの異なるアイテムをコールバックする必要はありません)。 +1
oneindelijk 2016年

exec("try: \n if sam[0] != 'harry': print('hello', sam) \nexcept: pass")
nicer

ありがとうkxr :)(私はあなたのアイデアを使って答えを改善しました)
elecprog

6

私はこれをしないことをお勧めします...

あなたが説明しているのは理解ではありません

お勧めするPEP 8 Pythonコードのスタイルガイドでは、複合ステートメントについて次のように述べています。

  • 複合ステートメント(同じ行に複数のステートメント)は一般に推奨されません。

はい:

      if foo == 'blah':
          do_blah_thing()
      do_one()
      do_two()
      do_three()

むしろ:

      if foo == 'blah': do_blah_thing()
      do_one(); do_two(); do_three()

区別するための理解度の例を以下に示します。

>>> [i for i in xrange(10) if i == 9]
[9]

6

はい、この投稿は8歳ですが、誰かがここに来て答えも探している場合は、セミコロンを使用できます。ただし、if / elif / elseステートメント、for / whileループは使用できず、関数を定義できません。これの主な用途は、関数を定義したり、if / elif / else / for / whileステートメント/ループを使用したりする必要のないインポートモジュールを使用する場合です。

次に、曲のアーティストと曲名を取得し、天才で歌詞を検索する例を示します。

import bs4, requests; song = input('Input artist then song name\n'); print(bs4.BeautifulSoup(requests.get(f'https://genius.com/{song.replace(" ", "-")}-lyrics').text,'html.parser').select('.lyrics')[0].text.strip())

6

私はこれを奨励していませんが、あなたがコマンドラインにいると言います、あなたはPythonしか持っておらず、本当に1ライナーが必要です、あなたはこれを行うことができます:

python -c "$(echo -e "a='True'\nif a : print 1")"

ここでは、\nPythonコードを評価する前の前処理を行っています。

それは超ハッキーです!このようなコードを書かないでください。


1

多分「と」または「または」

偽の後に「または」を書く必要がある

真の後に「と」を書く必要がある

お気に入り

n=0
def returnsfalse():
    global n
    n=n+1
    print ("false %d" % (n))
    return False
def returnstrue():
    global n
    n=n+1
    print ("true %d" % (n))
    return True
n=0
returnsfalse() or  returnsfalse() or returnsfalse() or returnstrue() and returnsfalse()

結果:

false 1
false 2
false 3
true 4
false 5

または多分

(returnsfalse() or true) and (returnstrue() or true) and ...

グーグル「1行のpythonに複数のステートメントを配置する方法」を検索してここにアクセスしました。質問に直接回答するのではなく、おそらく他の誰かがこれを必要としています。


1

以下のためにpython -c指向ソリューション、そしてあなたがbashのシェルを使用して、はい、あなたは、この例のような単純な1ライン構文を持つことができます。

次のようなことをしたいとします(except: passインストラクションを含むサンプルに非常に似ています):

python -c  "from __future__ import print_function\ntry: import numpy; print( numpy.get_include(), end='\n' )\nexcept:pass\n" OUTPUT_VARIABLE __numpy_path

これは機能せず、このエラーが発生します。

  File "<string>", line 1
    from __future__ import print_function\ntry: import numpy; print( numpy.get_include(), end='\n' )\nexcept:pass\n
                                                                                                                  ^
SyntaxError: unexpected character after line continuation character `

これは、\nエスケープシーケンスのBashとPythonの解釈の競合によるものです。問題を解決するには、$'string'Bash構文を使用して\n、Pythonの前にBashの解釈を強制できます。この例をさらに困難にするためend=..\n..に、Pythonの印刷呼び出しに典型的なPython 仕様を追加しました。最後に\n、bashとPythonの両方の解釈を、それぞれが関係するテキストについて実行できるようにします。最終的に適切な解決策は次のようになります:

python -c  $'from __future__ import print_function\ntry:\n import numpy;\n print( numpy.get_include(), end="\\n" )\n print( "Hello" )\nexcept:pass\n' OUTPUT_VARIABLE __numpy_path

これにより、エラーのない適切なクリーンな出力が得られます。

/Softs/anaconda/lib/python3.7/site-packages/numpy/core/include
Hello

注:exec問題はまだ同じであるため(BashとPythonインタープリターの競合)、これは指向型ソリューションでも同様に機能するはずです。

注2:1には、いくつかを置き換えることで問題を回避することができ\n、いくつかのことで;、私の解決策は、常に「1行」に古典的なマルチラインのPythonプログラムのどの部分を可能にしながら、それは(Pythonの構文に応じて)仕事いつでもしません。

注3:もちろん、1行で記述する場合は、Pythonのスペースとインデントに常に注意する必要があります。実際には、ここでは厳密に「1行」ではないため、\nbashとPythonの間でエスケープシーケンスの適切な混合管理を行っています。。これは、古典的な複数行のPythonプログラムを処理する方法です。ソリューションサンプルもこれを示しています。


0

あなたは多くのものを混ぜているので、あなたの質問に答えるのは難しいです。短い答えは:私の知る限り、あなたがしたいことはPythonでは不可能です-正当な理由があります!

長い答えは、Pythonで開発したい場合は、Pythonに慣れる必要があるということです。理解力は読みにくくありません。あなたはそれらを読むことに慣れていないかもしれませんが、あなたがPython開発者になりたいなら、それに慣れる必要があります。ニーズに合った言語がある場合は、その言語を選択してください。Pythonを選択する場合は、Pythonの方法で問題を解決する準備をしてください。もちろん、Pythonと自由に戦うことはできますが、楽しくはありません!;-)

そして、あなたの本当の問題が何であるかを私たちに教えてくれるなら、あなたはパイソンのような答えを得るかもしれません。「1行で何かを取得する」ということは、通常はプログラミングの問題ではありません。


私はパイソンが大好きです!私は、理解がよりよく構造化されているかもしれないが、私の問題/質問の根であるコロンが原因ではないことを私がどのように考えているかを示していました... try:if sam [ 0]!= 'harry':print( 'hellp'、sam)は不可能です...これは正しいですか?おかげで...私はこれをいくつかのデバッグ目的で使用しているので、簡単に削除でき、スペースをあまり取らない小さなシンプルなコードを探していますlol
Rhys

はい、私が知る限りそれは不可能です。しかし、誰かがすでに述べたように:あなたがすることは理解とは異なる何かです。コードを簡単に削除できるようにするには、コードを関数に入れます。「except:pass」問題については、例外などを無視するデコレータについて考えてください。繰り返しますが、常に、すでに考えている解決策の問題ではなく、実際の問題を説明するようにしてください。;-)
アヒム、

3
なぜ人々は「あなたはたくさんのものを混ぜている」のような挑発的な発言のために呼びかけられていないものから答えを始めなければならないのですか?できれば反対票。
John Jiang

「私たちは通常ではないプログラミングの問題「1行で何かを取得」 - 。>しかし、それは多くの場合、システム管理者の問題ですので、質問はこの面ではまだ関連している。
アレックス・F

0

その正確に可能;-)

# not pep8 compatible^
sam = ['Sam',]
try: print('hello',sam) if sam[0] != 'harry' else rais
except: pass

あなたはPythonで非常に醜いことをすることができます:

def o(s):return''.join([chr(ord(n)+(13if'Z'<n<'n'or'N'>n else-13))if n.isalpha()else n for n in s])

これは、99文字の1行でrot13 / cesa暗号化を行うための関数です。


-2

次に例を示します。

for i in range(80、90):print(i、end = "")if(i!= 89)else print(i)

出力:80 81 82 83 84 85 86 87 88 89

>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.