[Python] 언더바/ 언더스코어/ 밑줄 문자(_)

Sujin Lee·2021년 11월 11일
1

Python

목록 보기
1/13
post-thumbnail
post-custom-banner

📚 5가지 쓰임

1. 인터프리터에서의 사용

  • 파이썬 인터프리터에서 가장 마지막 표현식의 결과값을 자동적으로 _ 라는 변수에 저장
  • 여기에 저장된 값을 다른 변수에 저장 가능
  • 일반적인 값처럼 사용 가능
>>> 5 + 4 
9 
>>> _
9
>>> _ + 6
15
>>> a = _
>>> a
15

2. 무시하는 값

  • unpack할 때 특정 값을 사용하지 않으려면 해당 값을 밑줄 _에 지정
# 하나의 값 무시
a, _, b = (1, 2, 3) 
print(a, b) # 1,3

# 여러 개의 값 무시
# *을 이용하여 여러 개의 값을 하나의 변수에 저장할 때 쓰임
# "Extended Unpacking"이며, Python 3.x에서 사용 가능
a, *_, b = (7, 6, 5, 4, 3, 2, 1)
print(a, b) # 7,1

3. 반복문에서 사용

  • 일반 변수처럼 사용
for _ in range(5):
   print(_)
0
1
2
3
4
lang = ["Python","JS","PHP","Java"]
for _ in lang:
   print(_)
Python
JS
PHP
Java
 _ = 5
 while _ < 10:
   print(_, end = ' ')
   _ += 1
 # end의 기본값은 \n
5 6 7 8 9

4. 숫자값의 구분

  • 숫자가 길다면 자릿수 구분을 위해 _를 사용
  • 2진수, 8진수, 16진수 사용 가능
  • (참고) 파이썬은 기본 10진수 -> 접두어가 붙음
    • 2진수: 0b
    • 8진수: 0o
    • 16진수: 0x
million = 1_000_000
binary = 0b_0010 # 2진수
octa = 0o_64 # 8진수
hexa = 0x_23_ab # 16진수

print(million) # 1000000
print(binary) # 2
print(octa) # 52
print(hexa) # 9131

5. 변수명에서의 사용

  • 변수, 함수, 클래스 명 등에 언더바 사용

1) 앞에 한개: _variable

  • 내부용으로만 사용됨
class Test:
	def__init__(self):
    	self.name = "test"
        self._num = 7
 obj = Test()
 print(obj.name) # test
 print(obj._num) # 7
  • 모듈을 import해서 사용할 때
# my_functions.py
def func():
	return "test"
def _private_func():
	return 7
    
# 다른 파일에서 my_function.py를 import
# 하지만 파이썬은 언더바 하나로 시작한 이름들은 import하지 않는다!
>>> from my_functions import *
>>> func()
"test"
>>> _private_func()
Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name '_private_func' is not defined

# 모듈 자체를 import하기!
>>> import my_functions
>>> my_functions.func()
"test"
>>> my_functions._private_func()
7

2) 뒤에 한개: variable_

  • 파이썬 키워드를 변수, 함수, 클래스 명등으로 사용하려는 경우
  • 이름 끝에 _를 사용하여 파이썬 키워드와의 충돌을 피할 수 있음

3) 앞에 두개: __variable

  • name mangling: 파이썬이 해당 변수/함수의이름을 짓이겨 바꿔버림
  • 맹글링을 당한 변수/함수는 원래의 이름을 접근할 수 없음
  • 언더바 2개로 맹글링을 적용한 변수/함수는 _클래스명__변수/함수명 으로 이름이 변경 됨
class TestClass():
    def __init__(self):
        self.name = "Peter"
        self.gender = "male"
        self.__age = 32

man = TestClass()

print(man.name) # Peter
print(man.gender) # male
print(man.__age) # AttributeError 발생

# dir함수는 클래스 객체의 모든 attribute들을 리턴
# gender, name는 보이지만 __age는 _TestClass__age라는 이름이 보인다
print(dir(man))
['_TestClass__age', '__class__', '__delattr__', '__dict__', '__dir__', 
'__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__',
 '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', 
'__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', 
'__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'gender', 'name']
print(man._TestClass__age) # 32 출력

4) 앞,뒤에 두개: __variable__

  • 클래스 안에 정의할 수 있는 스페셜 메서드이며, 클래스를 int(),str(),list() 등 파이썬의 빌트인 타입과 같은 작동을 하게 해줌
  • +, -, >, < 등의 오퍼레이터에 대해서 각각의 데이터 타입에 맞는 메소드로 오버로딩하여 백그라운드에서 연산
  • magic method, dunder method
  • __ init __함수: 클래스의 인스턴스가 생성될 때 가장 처음으로 실행되는 함수로 생성자 역할
class TestClass(): 
    def __init__(self): # 클래스 내부에 정의된 함수를 메서드, TestClass가 하는 행동을 정의
        print("Hello World")

test = TestClass()  # 인스턴스 명 = 클래스()

Reference

profile
공부한 내용을 기록하는 공간입니다. 📝
post-custom-banner

0개의 댓글