비등 전성 파이썬 [닫기]


10

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

def method():
    X
    print(a)

method()

인쇄 1하지만

def method():
    X
    X
    print(a)

method()

인쇄합니다 2.


그래서, 나는 까다로운 사람이 될 것을 싫어하지만 것 같습니다 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
  • 단일 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)

변수 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

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

9

파이썬

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

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.