べき等でないPython [終了]


10

次のXようなグローバル変数を参照しない数行のPythonコードを記述します。

def method():
    X
    print(a)

method()

印刷します1

def method():
    X
    X
    print(a)

method()

プリント2


だから、私は厄介者になるのが嫌いですが、それは実際にはPythonのグローバル変数のようでvarsあり、locals

def test_global_1():
    global vars, locals
    vars = lambda: 2
    locals = lambda: 3

def test_global_2():
    print(vars())
    print(locals())

test_global_1()
test_global_2()

また、このようなパズルの客観的な勝利基準を見たいと思うようです。コードの長さはここでは実際には感じられないので、コードのさまざまな新機能のためにブラウニーポイントのシステムを作成できますか?これらが何であるかは正確にはわかりませんが、ここから始まります:

  • 本当に本当にないグローバル(+1 varsまたはlocals)の+1
  • 特定のテクニックを最初に投稿したことに対する+1
  • 投稿された最短のソリューションの+1
  • +1は、単一のPythonステートメントのみを含むソリューションの場合
  • 字句の非境界に参加するなどの興味深い「ハック」の+1
  • 例外を使用しない場合は+1

そして、もっと考えることができれば、この質問を編集してリストに追加できます。

この問題は、例外を使用せずに解決することができる同様にグローバルを使用せずにvarsしてlocals?まだ正確にはわかりませんが、できるのではないかと思います...


良いパズル!下にスクロールしないようにして、誰かの答えを見ずに自分で解決できるようにしました。:D
mbomb007 2015

1
パズルオーウェンをありがとう、そしてサイトへようこそ。サイトにはすべての質問に客観的な勝利条件がなければならないというルールがあるので、おそらく1つ追加する必要があります。1つの可能性は、の最短の長さですがX、他のオプションがあります。
isaacg 2015

3
「すべての質問には客観的な勝利条件がなければならない」-愚かなルールimho。誰もが実際にパズルを解いてさまざまな答えから学ぶときに、「勝者」を気にします。
JimmyB 2015

2
短縮コードまたは一般的な人気のどちらで最適化するかによって、コードゴルフまたは人気コンテストタグを追加してください。この挑戦にはコードゴルフの方が良いと思いますが(人気コンテストは他の方法では簡単に分類できない挑戦に対してのみ推奨されます)、それはあなた次第です。
アプシラー2015

2
あなたは採点システムを追加しましたが、人気コンテストタグも追加しました。つまり、勝者は投票によって決定されます。ここでどういう意味ですか?たぶん、タイブレークとして投票したいですか?
xnor 2015

回答:


12
def method():
    if 'a' not in vars():a=0
    a+=1
    if 'a' not in vars():a=0
    a+=1
    print(a)

変数が変数テーブルでまだ初期化されていない場合a0のみ、変数を初期化します。次に、それをインクリメントします。

もっと簡単に(のヒストクラートに感謝len):

def method():
    a=len(vars())+1
    a=len(vars())+1
    print(a)

の2つのコピーがX同じ行にある場合、

a=0;a+=1;a

倍になる

a=0;a+=1;aa=0;a+=1;a

「犠牲の子羊」aaが2番目の変数の割り当てを消費します。


3
私はこれをそれほど速く投稿する台無しになりたくないので、最短のコードを試してみませんか?
xnor 2015

3
少し短いバリアント:a=len(vars())+1
ヒストクラート2015

@histocratいいですね、ありがとう!
xnor 2015

9

パイソン

以来、このソリューションの思いtryexcept、変数がまだ存在していたかいない場合、私は考える最初の方法を決定することでした。

def method():
    try:a+=1
    except:a=1
    print(a)

5

Python 2

def method():
    exec'';locals()['a']=locals().get('a',0)+1
    exec'';locals()['a']=locals().get('a',0)+1
    print a

method()

基本的に、execPython 2で遭遇すると、特殊なフラグ(0x01)がから削除されmethod.func_code.co_flagslocals割り当てが有効になります。これを利用nonlocalしてPython 2のサポートを実装しました(フラグを変更するxorについては43行目を参照してください)。


なんでa = locals().get('a', 0) + 1
Vincent、

@ヴィンセント私は疲れていました。:O修正済み。
kirbyfan64sos 2015

その場合exec''、これ以上は必要ありません;)
Vincent

@Vincentええと、多分私はもっと長いバージョンに固執するべきです。よりクリエイティブに感じました。今、それはトップ投票された回答のクローンのようです...:/
kirbyfan64sos 2015

2

私の最初のアイデア(そしてそれをスムーズにすること)は:

def method():
    a=2if'a'in vars()else 1 
    a=2if'a'in vars()else 1 
    print(a)

しかし、ヒストクラートの答えは最適のようです。


1

私の試み。mathモジュールを使用して、Xが1回実行されるか2回実行されるかを追跡します。

def module():
  import sys
  if 'math' in sys.modules:
    a+=1
  else:
    a=1
  import math

  import sys
  if 'math' in sys.modules:
    a+=1
  else:
    a=1
  import math

  print(a)

module()

1
def method(a=[]):  
  a.append(a)  
  print len(a)

コメントに応じて編集:aは長さnの空のリストのリストで、nはメソッドを呼び出した回数です。このメソッドを2回呼び出すと、1と2が出力されます。


7
a=[]パラメータとして置くことは、この課題のパラメータの範囲外です。
mbomb007 2015

申し訳ありませんが、これは私の答えです。あまり良くありません。これは(おそらく)pythonの驚くべき非べき等演算ですが、チャレンジを簡単にすることなく、チャレンジ用に提供されたフォーマットにスロット化する方法はありません。
WithScience 2015

また、課題は2つだけではなく、1つまたは2つを印刷することです。
xnor 2015

0
def method():
    #### X-block
    try:a
    except NameError:a=1
    else:a=2
    ####
    print(a)

try変数Aが定義されている場合、ブロックチェック。
変数が定義されていない場合(これは、Xブロックが1回だけ存在する場合のみ)、NameError例外が発生します。
変数が定義されている場合(これは、Xブロックが2回存在elseする場合です)、次にが入力されます。


ええ、それは私がグーグルを検索して見つけた解決策です。次に、現在のソリューションを作成しました。
mbomb007

@ mbomb007うん:P あなたの方法は使用するよりも短いelse
カメハメハ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.