비등 전성 파이썬 [닫기]


10

X전역 변수를 참조하지 않는 몇 줄의 Python 코드를 작성하십시오.

def method():
    X
    print(a)

method()

인쇄 1하지만

def method():
    X
    X
    print(a)

method()

인쇄합니다 2.


그래서, 나는 까다로운 사람이 될 것을 싫어하지만 것 같습니다 varslocals실제로 파이썬에서 전역 변수입니다 :

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
  • 단일 Python 문만 포함 된 솔루션의 경우 +1
  • 어휘 이외의 경계에 참여하는 것과 같은 흥미로운 "해킹"에 +1
  • 예외를 사용하지 않으면 +1

더 많은 것을 생각할 수 있다면이 질문을 편집하여 목록에 추가 할 수 있습니다.

이 문제는 예외를 사용하지 않고 해결 될 수 같은 전역을 사용하지 않고 vars하고 locals? 정확히 어떻게 아직 파악하지 못했지만 가능하다고 생각합니다 ...


좋은 퍼즐! 나는 아래로 스크롤하지 않기 때문에 다른 사람의 대답을 보지 않고 스스로 해결할 수있었습니다. : D
mbomb007

1
퍼즐 Owen에 감사하고 사이트에 오신 것을 환영합니다. 사이트에는 모든 질문에 객관적인 승리 조건이 있어야한다는 규칙이 있으므로 추가해야합니다. 한 가지 가능성은 가장 짧은 길이 X이지만 다른 옵션이 있습니다.
isaacg

3
"모든 질문에는 객관적인 승리 조건이 있어야합니다"-어리석은 규칙 imho. 우리가 실제로 다른 답을 통해 수수께끼를 배우고 배우는 것을 가장 즐겁게 누릴 때 누가 "승자"에 관심이 있습니까?
JimmyB

2
사람들이 단축 코드 또는 일반적인 인기를 위해 최적화하길 원하는지에 따라 코드 골프 또는 인기 경연 대회 태그를 추가하십시오 . 코드 골프가이 도전에 더 좋다고 생각합니다 (인기 대회는 쉽게 분류 할 수없는 도전에 대해서만 권장됩니다). 그러나 그것은 당신에게 달려 있습니다.
apillers

2
점수 시스템을 추가했지만 인기 콘테스트 태그도 추가했습니다. 즉, 승자가 투표로 결정됩니다. 여기서 무슨 뜻입니까? 아마도 당신은 순위표로 투표를 원하십니까?
xnor

답변:


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

변수 a0변수 테이블에서 아직 초기화되지 않은 경우에만 변수 를 초기화합니다. 그런 다음 증가시킵니다.

더 간단히 (에 대한 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

@histocrat 감사합니다. 감사합니다!
xnor

9

파이썬

이후,이 솔루션의 생각 tryexcept변수가 아직 여부 존재한다면 내가 생각 첫 번째 방법을 결정하는 것이 었습니다.

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

5

파이썬 2

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

method()

기본적으로 exec 파이썬 2에서 발생, 그것은 특별한 플래그 (원인 0x01에서 제거 할)를 method.func_code.co_flags만드는, locals과제는 효과가 있습니다. nonlocal파이썬 2에서 지원 을 구현 하기 위해 이것을 활용했습니다 (플래그를 수정하는 xor에 대해서는 43 행 참조).


왜 안돼 a = locals().get('a', 0) + 1?
Vincent

@Vincent 나는 피곤했다. : O 고정.
kirbyfan64sos

이 경우 exec''더 이상 필요하지 않습니다 ;)
Vincent

@Vincent Eh, 아마도 더 긴 버전을 고수해야 할 것입니다. 더 창의적으로 느껴졌습니다. 이제 가장 인기있는 답변의 복제본처럼 보입니다 ... : /
kirbyfan64sos

2

내 첫 번째 아이디어는 다음과 같습니다.

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

그러나 histocrat의 대답은 최적 인 것 같습니다.


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

죄송합니다.이 답변은 좋지 않습니다. 이것은 아마도 파이썬에서 놀랍지 않게 비등 전적인 작업이지만 도전을 사소한 일로 만들지 않고 도전에 제공된 형식으로 슬롯을 넣을 방법이 없습니다.
WithScience

또한 도전은 단지 두 가지 다른 것이 아니라 1 또는 2를 인쇄하도록 요구합니다.
xnor

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

try블록 수표는 변수 A를 정의하는 경우.
변수가 정의되지 않은 경우 (X- 블록이 한 번만있는 경우에만 해당) NameError예외가 발생합니다.
변수가 정의되면 (X- 블록이 두 번 존재할 때) else입력됩니다.


네, 구글 검색으로 찾은 솔루션입니다. 그런 다음 현재 솔루션을 더 짧게 만들었습니다.
mbomb007

@ mbomb007 예 : P. 당신의 방법은 사용하는 것보다 짧습니다else
Kamehameha
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.