[python]기초문법8

2 minute read

혼자 공부하는 파이썬 37강 - 튜플

다른 리스트와의 기본적인 차이

  • 대괄호가 아니라 소괄호로 선언
  • 한 번 선언하면 값을 바꿀 수 없음
a = (1, 2, 3, 4)
print(a[0]) #1
print(a[1]) #2
print(a[2]) #3
print(a[3]) #4

a[0] = 100 #TypeError


튜플을 사용하는 경우2. 스왑

a, b = 10, 20
print(a, b) # 10, 20

a, b = b, a
print(a, b) # 20 10


괄호가 없어도 튜플로 인식될 수 있다면 튜플이다

c, d = 30, 40

print(c, d) # 30, 40


for i, a in enumerate( [1, 2, 3, 4, 5] ):
# i, a 는 튜플이다. 


튜플을 사용하는 경우3. 튜플을 리턴하는 함수
2개의 값을 리턴해야 할 때 튜플을 사용한다.

a, b = 97, 40
print(divmod(a,b)) # 2, 17
print(type(divmod(a,b))) # class 'tuple'

#divmod(a, b)는 a를 b로 나눈 몫과 나머지를 반환하는 함수


하나의 요소를 갖는 튜플

print(type((273,))) # class 'tuple'


딕셔너리의 키 값으로 튜플이 사용 가능하다

a = {
        (0, 0) : 10,
        (0, 1) : 20,
        (1, 0) : 30,
        (1, 1) : 40
}

print( a[ (0, 0) ] ) # 10


혼자 공부하는 파이썬 38강 - 콜백함수와 람다, map()/filter() 함수

콜백함수
함수에 다른 매개변수로 다른 함수를 전달하여 실행되게 하는 함수
def call_10_times(func):
        for i in range(10):
                func()

def print_hello():
        print("안녕하세요")

call_10_times(print_hello)


콜백함수의 매개변수

def call_10_times(func):
        for i in range(10):
                func(i)

def print_hello(number):
        print("안녕하세요", number)

call_10_times(print_hello)

람다
콜백함수를 사용하기위해 2개의 함수를 선언해야하는 코드의 낭비를 줄여준다

lambda parameter_list: expression
expression에는 한줄의 코드가 올 수 있고, 자동으로 return 된다

def call_10_times(func):
        for i in range(10):
                func(i)

def print_hello(number):
        print("안녕하세요", number)

call_10_times(lambda number: print("안녕하세요", number))


람다를 사용하는 함수 : map(), filter()

filter() : filter함수의 매개변수를 사용할때는 리턴값이 boolean 이어야 한다.

def 짝수만(number):
        return number % 2 == 0

a = list(range(100))
b = filter(짝수만, a)
print(b) # filter Object


사용 방법1.
반복문에 사용 가능하다

def 짝수만(number):
        return number % 2 == 0

a = list(range(100))
b = filter(짝수만, a)
print(b) # filter Object

#반복문에 사용
for i in b:
        print(i)


사용 방법2.
list로 바로 변환 시킬 수 있다

def 짝수만(number):
        return number % 2 == 0

a = list(range(100))
b = filter(짝수만, a)
print(b) # filter Object

#반복문에 사용
for i in b:
        print(i)
				
print(list(b))

람다로 변형
#def 짝수만(number):
#return number % 2 == 0

a = list(range(100))
b = filter(lambda number: number % 2 == 0, a)


람다를 변수에 저장가능하다

짝수만 = lambda number: number % 2 == 0

a = list(range(100))
b = filter(짝수만, a)

map() 함수
한 리스트를 기반으로 새로운 리스트를 만들어준다.
def 제곱(number):
        return number * number

a = list(range(100))
print(list(map(제곱,a)))

람다로 변형

#def 제곱(number):
 #return number * number

a = list(range(100))
print(list(map(lambda number: number * number,a)))

map()이 어떤 리스트를 기반으로 새로운 리스트를 만들어주는 함수라고했는데,
왜 다시 list()로 감싸줘야하는지 이해는 잘 안된다

리스트 내포와 비교

print([i * i for i in a if i % 2 == 0]) #filter()와 map()을 동시에 적용한 것

리스트 내포를 사용하는 경우, 결과로 리스트가 나온다.
즉 그만큼 리스트가 하나 더 복제되서 메모리를 차지한다는 의미이다.

map(), filter() 함수 등은 제너레이터 함수라서 내부의 데이터가 실제로 메모리에 용량을 차지하는 것들이 아니다.
실제로 호출이 되기 전까지는 가상의 값과 같기때문.


혼자 공부하는 파이썬 39강 - 텍스트 파일 처리 기본

파일을 읽고 쓰는 코드

open() 은 file Object를 생성

file = open("test.txt","w") #"w"는 새 파일 생성, "a"는 존재하는 파일의 뒷부분에 덧붙이는 모드 
file.write("hello world !")
file.close() #close()를 하지않으면 이후에 다른 사람이 파일을 열 수 없다. 


file = open("test.txt","r")#"r"은 파일을 읽는 모드
print(file.read())
file.close()

with 구문
특정범위에서 파일을 읽고 쓴 후 자동으로 close()를 호출함
with open("test.txt","a") as file:
        file.write("hello world !")

Leave a comment