非幂等Python


10

编写几行Python代码,X其中没有引用任何全局变量,例如

def method():
    X
    print(a)

method()

打印1

def method():
    X
    X
    print(a)

method()

版画2


所以,我讨厌被坚持己见,但看起来varslocals实际上是在Python全局变量:

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代表真正没有全局变量(否varslocals
  • +1是第一个发布特定技术的人
  • +1为发布的最短解决方案
  • +1为仅涉及一条Python语句的解决方案
  • +1有趣的“ hacks”,例如加入词法非边界
  • +1不使用例外

如果您能想到更多,可以编辑此问题以添加到列表中。

可这个问题可以不使用异常解决不使用全局像varslocals?我怀疑它可以,尽管我还没有确切地知道如何...


好拼图!我确保不要向下滚动,这样我自己就可以解决它,而不会看到任何人的答案。:D
mbomb007

1
感谢欧文的困惑,欢迎您访问该网站。该站点上有一个规则,即所有问题都必须具有客观的获胜条件,因此您可能应该添加一个。一种可能是的最短长度X,但是还有其他选择。
isaacg 2015年

3
“所有问题都必须具有客观的获胜条件”-愚蠢的规则恕我直言。当我们所有人实际上最喜欢从不同的答案中获得困惑和学习时,谁会在乎“赢家”。
JimmyB,2015年

2
请添加代码高尔夫标签或人气竞赛标签,具体取决于您是希望人们针对简短代码还是针对大众知名度进行优化。我认为代码高尔夫更适合应对这一挑战(仅针对那些无法轻易归类的挑战才鼓励进行大众竞赛),但这取决于您。
apsillers 2015年

2
您已经添加了计分系统,还添加了流行度竞赛标签,这意味着获胜者是由投票决定的。你这是什么意思 也许您想要像平局决胜一样投票?
xnor 2015年

Answers:


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

初始化变量a,以0只有当它不变量表已经初始化。然后,增加它。

更简单地说(感谢histocrat len):

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

如果的两个副本X可以在同一行上,我们可以

a=0;a+=1;a

翻倍

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

而“牺牲羔羊” aa吃掉了第二个变量。


3
我不想这么快就发布消息,那么我们如何尝试最短的代码呢?
xnor

3
变体略短:a=len(vars())+1
历史学家

@histocrat好一个,谢谢!
xnor

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()

基本上,当exec在Python 2中遇到时,它会导致0x01从中删除一个特殊标志()method.func_code.co_flags,这使locals赋值生效。我利用它来实现nonlocal对Python 2的支持(有关修改标志的xor,请参见第43行)。


为什么不a = locals().get('a', 0) + 1呢?
文森特

@Vincent我很累。:O固定。
kirbyfan64sos 2015年

那样的话,您就不再需要exec''了;)
Vincent

@Vincent Eh,也许我应该坚持使用更长的版本。感觉更有创造力。现在看来,它就像是最
受好评的

2

我的第一个主意(然后细化)是:

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

但是历史学家的答案似乎是最优的。


1

我的尝试。使用数学模块跟踪X是否运行一次或两次。

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是调用方法的时间。调用此方法两次将打印1,然后打印2。


7
a=[]作为参数是这一挑战的参数之外。
mbomb007

抱歉,这是我的答案,不是很好。(可以说)这是python中令人惊讶的非幂等操作,但是在不使挑战变得微不足道的情况下,无法将其放入挑战所提供的格式中。
WithScience 2015年

同样,挑战要求打印1或2,而不仅仅是两个不同的东西。
xnor

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

try块检查是否定义了变量a。
如果未定义变量(仅当存在一次X块时),则NameError引发Exception。
如果定义了变量(这是X块出现两次),else则将输入。


是的,这就是我通过搜索Google找到的解决方案。然后,我创建了当前的解决方案,该解决方案更短。
mbomb007

@ mbomb007是的:P。你的方法比使用更短else
美哈美哈
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.