일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 혼자 공부하는 C언어
- 알기쉬운 알고리즘
- 윤성우 열혈자료구조
- datastructure
- 이스케이프 문자
- 이것이 자바다
- Selection Sorting
- s
- C 언어 코딩 도장
- stream
- buffer
- list 컬렉션
- 윤성우의 열혈 자료구조
- R
- insertion sort
- coding test
- C programming
- Algorithm
- Stack
- JSON
- Serialization
- 메모리구조
- Graph
- Today
- Total
Engineering Note
[Python] 파이썬 함수호출 변수 저장 오류 본문
에러
내장함수를 계속 호출 할때 너무 길어서 간단하게 호출하기 위해 변수에 저장해서 호출할때 오류가 발생했다. 원인은 함수를 호출한 후 반환값 자체를 저장했기 때문이다. 이 이유 때문에 다시 함수가 호출되지 않고 최초 호출 함수의 값으로만 변수가 사용되고 있었다.
상황은 아래와 같다.
readline 함수를 통해 입력을 받으면 개행문자도 입력 받기 때문에 rstrip()함수를 같이 사용해서 개행을 제거해주는 것이 일반적이다.
그래서 반복된 sys.stdin.readline().rstrip() 방지하기 위해 같단하게 input으로 재정의 해주었다.
재정의 방법 : input = sys.stdin.readline().rstrip()
그런데 이때 input() 함수를 통해 저장된 값을 출력하면 첫 번째 라인 값만 input_data에 저장이 되는 문제가 있었다.
원인은 input에는 처음 입력 받으면서 실행된 readline().rstrip() 메서드가 호출되고 메서드의 주소가 input에 저장되어 다시 input() 함수를 호출하면 최초의 호출한 메서드가 반복되어 실행될 뿐 새로운 메서드가 실행되지 않는다.
에러해결
람다식을 사용해 함수를 간단하게 정의하는 방식으로 해결하였다. 이렇게 하면 메서드 호출 반환값이 변수에 저장되는 오류가 아니라 함수 자체를 간단하게 정의할 수 있다.
입력값
121
1231
12421
0
출력값
yes
121
yes
121
yes
121
yes
121
코드
에러 발생 코드
import sys
sys.stdin = open("input.txt")
input = sys.stdin.readline().rstrip
input_data = input()
while input_data != '0':
left = 0
right = len(input_data)-1
while left <= right:
if input_data[left] == input_data[right]:
left += 1
right -= 1
else:
print('no')
break
else:
print("yes")
input_data = input()
print(input_data)
해결 코드
sys.stdin.readline().rstrip() 를 input 이라는 새로운 함수로 정의해서 해결 했다. 이러면 매번 input을 호출할 수 있다. 위의 경우는 매번 input을 호출하는 것이 아니라 input 변수에 sys.stdin.readline().rstrip 객체가 저장되어 다시 호출 될때 readline 함수가 호출 되지 않는다.
import sys
sys.stdin = open("input.txt")
def input():
return sys.stdin.readline().rstrip()
input_data = input()
while input_data != '0':
left = 0
right = len(input_data)-1
while left <= right:
if input_data[left] == input_data[right]:
left += 1
right -= 1
else:
print('no')
break
else:
print("yes")
input_data = input()
아래는 위에 함수로 정의한 부분을 람다식으로 간단하게 바꾼 것이다.
import sys
input = lambda : sys.stdin.readline().rstrip()
input_data = input()
while input_data != '0':
left = 0
right = len(input_data)-1
while left <= right:
if input_data[left] == input_data[right]:
left += 1
right -= 1
else:
print('no')
break
else:
print("yes")
input_data = input()
'Programming Language > Python' 카테고리의 다른 글
[Python] 파이썬의 특별한 변수 __name__ (0) | 2021.12.17 |
---|---|
[Python] sqlalchemy, pymysql 비교 테스트 (0) | 2021.11.27 |
[Python] 리스트의 복사 (0) | 2021.09.25 |
[Python] startswith 함수 (0) | 2021.08.31 |
[Python] 파이썬 입력 (0) | 2021.07.21 |