# 함수와 메서드
li1 = [10, 20, 30]
# len() : 객체의 길이(항목의 개수)를 반환하는 내장 함수 입니다.
print(len(li1)) # li1에 데이터가 몇개가 있는지 count해주는 함수
3
li1 = [10, 20, 30]
# append() : 리스트에 사용되며, 리스트의 끝에 새로운 항목을 하나만 추가하는 메서드
print(li1)
li1.append(100) # append()함수로 끝에 100을 추가함.
print(li1)
li1.append([200,300]) # 여러개의 값을 넣고 싶으면 list형식으로 넣어야됨(append만 한정 다른함수로 []를 제거후 넣는 방법이 있음.)
print(li1)
[10, 20, 30]
[10, 20, 30, 100]
[10, 20, 30, 100, [200, 300]]
li1 = [10, 20, 30]
# extend() : 리스트에 iterable(반복 가능한 객체)의 모든(여러개의) 항목을 추가하는 메서드
print(li1)
li1.extend([50])
print(li1)
li1.extend([1000,20000]) # append와 다르게 여러개의 값을 추가할때 []가 제거되어 들어간다.
print(li1)
[10, 20, 30]
[10, 20, 30, 50]
[10, 20, 30, 50, 1000, 20000]
li1 = [10, 20, 30, 40, 50]
# pop() : 리스트에서 항목을 삭제하고, 삭제된 항목을 반환하는 메서드
print (li1)
print (li1.pop()) #50 (데이터가 반환이 되었다) 삭제되면서 인플레이스(in-place) 연산도 되었기 때문에 50이 사라짐.
print(li1) # 50이 삭제된 상태로 출력됨. [10, 20, 30, 40]
[10, 20, 30, 40, 50]
50
[10, 20, 30, 40]
li1 = [10, 20, 30, 40, 50]
print (li1)
temp = li1.pop() # temp에 50의 값을 저장 (처음 접하시는 분들은 이해하기가 쉽지가 않다. 그래서 가장 간단하게 설명을 하자면 윈도우 기반 : ctrl + X로 잘라내기 역활이라고 보면 편하다, 잘라낸것을 temp라는 임시변수폴더에 저장을 해서 print로 출력을 한다.)
print(temp) # temp에 저장된 50의 값을 출력
print(li1) # temp에서 50의 값을 가져가서 50을 제외한 [10, 20, 30, 40]을 출력
[10, 20, 30, 40, 50]
50
[10, 20, 30, 40]
# insert() : 리스트에서 특정 인덱스에 항목을 추가하는 메서드
li1 = [10, 20, 30]
li1.insert(1, 100) # index 1번 자리에 100을 추가한다. (append는 리스트 끝부분에만 추가를 하지만 insert는 원하는 인덱스 부분에 데이터를 삽입할 수 있다.)
print(li1)
[10, 100, 20, 30]
print(li1.index(100)) # li1.index(100)에서 숫자 100의 index 위치를 알려줘라
# print(li1.index(50)) # ValueError: 50 is not in list <- 한마디로 데이터가 없어서 에러가 발생
1
# reverse() : 리스트의 항목들의 순서를 뒤집는 메서드
li1 = [100, 50, 70, 60, 20]
li1. reverse() # 순서를 바꾼다! 정렬은 안됨. 자동으로 in-place가 되어서 저장이 된다.
print(li1)
[20, 60, 70, 50, 100]
li1 = ['김사과', '오렌지', '바나나', '이메론']
li1.reverse() # 문자도 상관없이 reverse도 가능
print(li1)
['이메론', '바나나', '오렌지', '김사과']
# 슬라이싱을 사용하여 리스트의 순서를 뒤집는 방법
li1 = ['Apple', 'apple', 'Orange', 'Banana', 'melon']
print(li1[::-1]) #::-1은 start:stop:step으로 start,stop을 생략하고 step을 -1로 설정한 슬라이싱이라는 뜻이다.
# start를 생략하면 -1로 간주. 즉, 시퀀스의 마지막 요소부터 시작
# stop을 생략하면 0으로 간주. 즉, 시퀀스의 시작까지 진행
# step이 -1이므로, 시퀀스의 요소를 뒤에서부터 앞으로 하나씩 건너뛰어서 슬라이싱
# 결국 ::-1은 역순이라는 뜻으로 보면 된다 print(li1[-1:0:-1])이랑 같은 뜻이다.(역순)
['melon', 'Banana', 'Orange', 'apple', 'Apple']
# sort() : 리스트의 항목들을 정렬하는 메서드, in-place 연산을 수행
li1 = [10, 40, 30, 100, 90, 50]
li1.sort() # 오름차순으로 정렬
print(li1)
[10, 30, 40, 50, 90, 100]
# 내림차순 : sort(reverse=True)
li1.sort(reverse=True) # 내림차순으로 정렬
print(li1)
[100, 90, 50, 40, 30, 10]
li2 = ['Apple', 'apple', 'Orange', 'Banana', 'melon']
li2.sort() # 아스키코드 기준으로 정렬이 가능하다.
print(li2)
['Apple', 'Banana', 'Orange', 'apple', 'melon']
li3 = ['김사과', '오렌지', '반하나', '이메론', '배애리']
li3.sort() # 자리수를 비교해서 높은 값이 있으면 해당 값이 가장 먼저 출력이 된다.
print(li3)
['김사과', '반하나', '배애리', '오렌지', '이메론']
# sorted() : iterable(반복 가능한 객체)의 모든 항목들을 정렬한 후, 그 결과를 새로운 리스트에 담아 반환하는 함수
li1 = [10, 40, 30, 100, 90, 50]
print(sorted(li1)) # in-place가 안된다.
print(li1)
print(sorted(li1, reverse=True)) # 내림차순
print(li1)
li1 = sorted(li1) # 이렇게 li1에다가 저장을 해야지 값이 저장이 된다.
print (li1)
[10, 30, 40, 50, 90, 100]
[10, 40, 30, 100, 90, 50]
[100, 90, 50, 40, 30, 10]
[10, 40, 30, 100, 90, 50]
[10, 30, 40, 50, 90, 100]
# count() : 리스트에서 특정 값의 개수를 반환하는 메서드
li1 = [10, 20, 30, 50, 20, 40, 30, 20]
print(li1.count(20)) # 찾고자하는 데이터의 갯수를 알려준다.
print(li1.count(16)) # 없으면 0을 출력한다. 에러발생X
3
0
1. 튜플 : 여러가지 데이터 타입의 값을 저장할 수 있는, 변경 불가능(immutable)한 순서가 있는 컬렉션입니다.
tu1 = (1,) #데이터 한개만 넣을때는 1, 라고 입력을 한다.
# 만약 그냥 1을 넣으면 tulple로 만들어지지 않고, 데이터 1로 지정이 된다. 그래서 고정값을 지정하기 위해 1, 로 넣는다.
print (tu1)
# tu1[0] = 100 # 'tuple' object does not support item assignment <- 한마디로 tuple은 수정이 불가능하다.
(1,)
tu2 = (1, 3, 5, 7)
print (tu2)
(1, 3, 5, 7)
tu3 = 1, 3, 5, 7 #()를 지정안해도 tuple로 저장이 된다.
print(tu3)
print(type(tu3))
(1, 3, 5, 7)
<class 'tuple'>
tu4 = ('apple', 'banana', ('🍏', '🍑'))
print(tu4)
print(tu4[0]) # 인덱스 0번의 값을 출력
print(tu4[2][0]) # 인덱스 2번의 값중에 1번째
print(type(tu4))
print(type(tu4[2])) # <class 'tuple'>
print(type(tu4[2][0])) # 사과의 타입은 string, 이유는 ()로 넣었기 때문에 string문자열로 저장이 된다.
('apple', 'banana', ('🍏', '🍑'))
apple
🍏
<class 'tuple'>
<class 'tuple'>
<class 'str'>
tu5 = ('apple', 'banana', ['🍏', '🍑'])
print(tu5)
print(tu5[2][0])
print(type(tu5)) # tuple
print(type(tu5[2])) # list
print(type(tu5[2][0])) # str
# tu5[0] = 'orange' #'tuple' object does not support item assignment, tuple이여서 에러발생
# tu5[2] = '🥓' # 'tuple' object does not support item assignment, list자체는 tuple것이여서 에러발생
tu5[2][0] = '🥓' # 이렇게 list에 정확하게 지정을 하면 수정이 가능하다.
print (tu5)
('apple', 'banana', ['🍏', '🍑'])
🍏
<class 'tuple'>
<class 'list'>
<class 'str'>
('apple', 'banana', ['🥓', '🍑'])
# 인덱싱 : 튜플의 각 항목은 위치(인덱스)를 가지고 있으며, 인덱스를 사용하여 접근할 수 있습니다. 인덱스는 0부터 시작합니다.
tu1 = (1, 2, 'apple', 'banana')
print(tu1[0]) # 인덱스 0번의 값을 출력
print(tu1[-1]) # 인덱스 끝자리를 출력
1
banana
# 슬라이싱 : 튜플의 일부분만을 추출할 수 있습니다.
tu1 = (1, 2, 'apple', 'banana')
print(tu1[1:]) # 인덱스 1번부터 끝까지 출력
print(tu1[1:3]) # 인덱스 1번부터 3번전까지 출력
(2, 'apple', 'banana')
(2, 'apple')
# 연산 : 튜플 간의 + 연산으로 리스트를 결합할 수 있고, * 연산으로 리스트를 반복할 수 있다.
tu1 = (10, 20, 30)
tu2 = (40, 50, 60)
print (tu1 + tu2)
print (tu2 + tu1)
tu1 = tu1 + (40, 50) # tuple은 변경이 불가능한데, 왜 + 연산자로 출력이 가능하냐? 라고 물으면 tuple속에 있는 데이터의 변경은 안되지만 뒤쪽에 추가만 하는것은 가능하다.
print(tu1)
print(tu1 * 3) # 3번 반복
(10, 20, 30, 40, 50, 60)
(40, 50, 60, 10, 20, 30)
(10, 20, 30, 40, 50)
(10, 20, 30, 40, 50, 10, 20, 30, 40, 50, 10, 20, 30, 40, 50)
tu3 = (10, 20, 30)
print(tu3[0] + tu3[2]) # 10 + 30 = 40
40
# 언패킹 : 튜플의 항목들은 변수들에 할당될 수 있습니다.(리스트도 가능)
apple, banana = ('김사과', '반하나') # 앞쪽 변수에 원하는 값을 지정하여 넣어서 사용할 수 있다.
print(apple)
print(banana)
김사과
반하나
# 멤버십 테스트 : in 연산자를 사용하여 튜플에 특정 값이 있는지 확인할 수 있습니다. (리스트도 가능)
2 in (2, 4, 6, 8, 10) # 2라는 값이 ()안에 있는지 확인
True
# 튜플의 정렬 : 튜플은 sort() 메서드를 제공하지 않습니다.sorted() 함수를 사용합니다.
# 이유는 : 데이터의 수정이 안되기 때문에 sort를 사용하면 안됩니다.
tu1 = (1, 3, 2, 0)
tu2 = sorted(tu1) # sorted()를 사용하여 정렬, sorted의 반환형은 리스트이다.
print (tu2)
[0, 1, 2, 3]
# 변환 : 튜플을 리스트로, 리스트를 튜플로 변환할 수 있습니다.
tu1 = (1, 2, 3, 4)
print(type(tu1)) # tuple
li1 = list(tu1) # tu1을 list로 li1으로 변환
print(type(li1)) # list
tu2 = tuple(li1) # li1을 tuple로 tu2로 변환
print(type(tu2)) # tuple
# tuple과 list의 타입의 변환은 간단하게 변경이 가능하다.
# 한마디로 "이 차는 이제 제것입니다. 제 명의로 등록이 된것입니다."라고 생각하면 편하다.
<class 'tuple'>
<class 'list'>
<class 'tuple'>
---번외편---
input() : 사용자(개발자)에게 데이터를 입력받을 수 있는 함수
데이터는 항상 문자형으로 입력받음
김사과
'김사과'
name = input() # name의 변수에 input이라는 입력 변수를 선언
print (name) # input에서 받은 데이터 값을 name으로 출력하라
test
test
name = input('이름을 출력하세요 : ')
print(f'{name}님 안녕하세요')
이름을 출력하세요 : 이범배
이범배님 안녕하세요
name, age, weight = '김사과', 20, 50.5 # type은 tuple, 이렇게 넣는 방법을 언패킹이라고 한다.
print (name)
print (age)
print (weight)
# 데이터가 이렇게 잘 들어가게 된다.
김사과
20
50.5
name, age, weight = input('이름, 나이, 몸무게를 차례대로 입력하세요 : ').split(' ')
print (name)
print (age + '살')
print (weight + 'kg')
이름, 나이, 몸무게를 차례대로 입력하세요 : 이름 21 60
이름
21살
60kg
num1 = input('첫번째 숫자를 입력하세요 : ')
num2 = input('두번째 숫자를 입력하세요 : ')
print('결과 : ', num1 + num2) # 문자열이여서 해당 데이터끼리 붙는 현상이 발생
첫번째 숫자를 입력하세요 : 1
두번째 숫자를 입력하세요 : 2
결과 : 12
# int() : 문자열을 숫자(정수)타입으로 변환
num1 = input('첫번째 숫자를 입력하세요 : ')
num2 = input('두번째 숫자를 입력하세요 : ')
print('결과 : ', int(num1) + int(num2)) # 형변환 int로 바꾼다음에 덧셈을 해라.
첫번째 숫자를 입력하세요 : 10
두번째 숫자를 입력하세요 : 3
결과 : 13
특별 퀴즈
1. 국어, 영어, 수학 점수를 한꺼번에 입력받아 총점, 평균을 구하는 프로그램을 작성해보자
2. 입력방법 : 100/80/90(입력을 할때 / 로 입력을 받게해라)
korean, math, english = input('국어점수, 영어점수, 수학점수를 순서대로 입력하세요 : ').split('/')
total = int(korean) + int(math) + int(english)
avg = total / 3
print('총점 : ', total)
print('평균 : %.2f' %avg)
# 소숫점 2째 자리까지 할려고 하면 %.2f를 붙히면 된다.
국어점수, 영어점수, 수학점수를 순서대로 입력하세요 : 100/100/100
총점 : 300
평균 : 100.00