Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
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
Archives
Today
Total
관리 메뉴

Super Coding Addict

210111 MON - 파이썬 기본문법 (2) 본문

Python활용 빅데이터전문가과정

210111 MON - 파이썬 기본문법 (2)

밍응애 2021. 1. 13. 01:37

*** 앞전에는 정리를 차곡차곡 해왔는데, 생각보다 복습시간이 너무 길어져서 기본개념과 헷갈렸거나 꼭 짚고가고싶은 예제 위주로 코드를 정리해본다.

 

* 데이터 타입

- 숫자 / 문자

 

* 변수

- 값보다는 의미있는 단어를 기억하기 쉽기 때문에

 

* 자료구조

- 여러 개의 데이터를 관리하기 쉽게하기 위해서

- 메서드 / 함수

 

< 분기문(조건문) - if / if-else / if-elif-else>

* Boolean 데이터 타입

- 참과 거짓을 표현하는 자료형

- True / False

 

* 조건문 [1]

- if 조건 :

      print("실행")

--> 들여쓰기 : IF문에 영향받는 코드의 범위를 정의함

print(1) #일반코드 -> 출력
if True:
    print(2) #True이므로 출력
    if False:
        print(3) #False이므로 출력 X
        print(4) # "   "      출력X
    print(5) #일반코드-> 출력
print(6) #일반코드-> 출력

#결과
1
2
5
6
연습) a가 짝수이고, 10보다 작으면 '정답'을 출력
if (a%2 == 0) :
    if(a < 10) :
        print("정답")

* 조건문 [2]

- 두 개의 조건 비교시 if - else 구문 사용

조건 = True
if 조건 :
    print("참")
else :
    print("거짓")
print(1) #일반코드 -> 출력
if False:
    print(2) #False -> 출력X
else: #True
    if True:
        print(3) #True -> 출력
    else:
        print(4) #False ->출력X
    print(5)      #일반코드 -> 출력

#결과
1
3
5

* 조건문 [3]

- 조건이 3개 이상일 때는 if - elif - else 구문을 사용

- 들여쓰기에 유의!

if 조건-1 :   
    print("state – 1")  
elif 조건-2 :   
    print("state – 2")  
elif 조건-3 :   
    print("state – 3")  
 . . . . . . .  
else :   
    print("state – N") 
scores = int(input("성적을 입력하세요 : "))

# if - elif - else를 사용(1)
if(scores >= 80) :
    print('A')
elif(scores >= 60) :   #항상 성적이 80보다 작은 경우니까 (scores < 80) 조건이 없어도 된다
    print('B')
else :
    print('C')
    
# if - elif - else를 사용(2)
if(scores >= 80) :
    결과 = 'A'
elif(scores >= 60) :   #항상 성적이 80보다 작은 경우니까 (scores < 80) 조건이 없어도 된다
    결과 = 'B'
elif(scores < 60) :
    결과 = 'C'
print(결과)

* 논리연산자

- and : 모든 조건이 참이어야 참

- or : 조건 중 하나라도 참이라면 참

 

* is와 == 차이

- == : 값이 같은 지를 비교할 때 등호를 사용

- is : 값이 아니라, 가리키고 있는 메모리상의 위치가 같은 지를 비교할 때 사용

a = 1000
b = 1000
print(a==b) #True

print(id(a)) #2260359693232
print(id(b)) #2260359694864
--> id값이 서로 다르다! (값은 같지만)

print(a is b) #False (가리키는 메모리상의 위치(id)가 다르기 때문)

cf.
c = a (c, 너도 a가 가리키는 곳을 가리켜라 ! --> a와 c의 id가 같아짐)
print(c == a) # True
print(c is a) # True
#x에 바인딩된 정수가 3보다 크고 10이하인 경우 해당 숫자를 출력\

# if(x > 3):
	if( x <= 10):
    	print(x)
        
#if(3 < x <= 10):
	print(x)
    
 #위의 두 코드는 같으나, 아래 코드가 더 읽기 좋다

 

- input 함수 이용

** input함수로 받은 값의 형은 문자열!!! --> 연산 등이 필요하면 int로 형변환해주기!!

#사용자로부터 하나의 숫자를 입력받고, 입력 받은 숫자에 10을 더해 출력

입력 = int(input("숫자를 입력하세요."))
print(입력 + 10)

#입력받은 값은 문자열이므로 연산을 하려면 int로 형변환이 필요
#입력받은 수 홀짝 구분하기

입력=int(input("숫자 입력하세요."))
if 입력 % 2 == 0:
    print("짝수")
else:
    print("홀수")
# 사용자로부터 시간을 입력 받고 정각인지 판별

현재시각 = input("현재 시각을 입력하세요:")
if 현재시각[3:5] == "00":
    print("정각 입니다.")
else:
    print("정각이 아닙니다")
#사용자로 입력받은 단어가 아래 fruit 리스트에 포함되어 있는지를 확인
fruit = ["사과", "포도", "홍시"]
정답 = input("좋아하는 과일은?")
if 정답 in fruit:
    print("정답입니다")
else:
    print("오답입니다")
# 학점주기
score = 83
if score >= 81 :
    학점 = 'A'
elif score >= 61 :
    학점 = 'B'
elif score >= 41 :
    학점 = 'C'
elif score >= 21 :
    학점 = 'D'
else :
    학점 = 'E'

print(f"grade is {학점}")
#입력받은 원화를 환전한 금액 구하기

금액 = input("입력: ").split()

amount = int(금액[0])
currency = 금액[1]

if(currency == '달러') :
    ratio = 1167
elif(currency == '엔') :
    ratio = 1.096
elif(currency == '유로') :
    ratio = 1268
else:
    ratio = 171
print(amount*ratio, '원')

-> split함수를 쓸 때 () 안에 아무 것도 안넣으면 공백이 기준이다.

 

# 입력받은 수 중에서 가장 큰 수 출력하기

숫자1 = int(input("input number1:"))
숫자2 = int(input("input number2:"))
숫자3 = int(input("input number3:"))

if(숫자1 > 숫자2):
    if(숫자1 > 숫자3):
        print(숫자1)
else:
    if(숫자2 > 숫자3):
        print(숫자2)
    else:
        print(숫자3)
#성별판단

1)
주민등록번호 = input("주민등록번호: ")
if 주민등록번호[7] in ['2', '4']:
    성별 = '여자'
else:
    성별 ='남자'
print(성별)

2)
주민등록번호 = input("주민등록번호: ")
if int(주민등록번호[7]) % 2 == 0:
    성별 = '여자'
else:
    성별 ='남자'
print(성별)

-> if 변수 in [리스트] : 리스트 안에 변수가 있으면~

# 주민등록번호 유효성 검사하기
주민등록번호는 13자리로 구성되는데 마지막 자리수는 주민등록번호의 유효성을 체크하는데 사용된다. 
먼저 앞에서부터 12자리의 숫자에 2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5를 차례로 곱한 뒤 
그 값을 전부 더한다. 연산 결과 값을 11로 나누면 나머지가 나오는데 
11에서 나머지를 뺀 값이 주민등록번호의 마지막 번호가 된다.

주민등록번호 = input("주민등록번호: ")
j = 2
합 = 0
for i in range(len(주민등록번호)):
    if(주민등록번호[i] != '-'):
        if(2 <= j < 8):
            합 += int(주민등록번호[i])*j
            j += 1
        else:
            j = 2
            합 += int(주민등록번호[i])*j
            j += 1
    else:
        pass
if (11 - 합%11) == 주민등록번호[13]:
    print('정상')
else:
    print('에러')


# 주민등록번호 가운데 문자열 -가 들어가는 걸 생각 못하다가 극적으로 디버깅함ㅠㅠ

 

< 반복문 - for / while >

* 자료구조에 있는 데이터를 하나씩 바인딩한 후 들여쓰기 된 코드를 실행하는 과정을 반복!

* 반복문 기본형 

- for 변수 in 자료구조 :

        code

#자료구조 대입방법 2가지

1) 자료구조에 직접 리스트 넣기
for 변수 in [10, 20, 30]:
  print(변수

2) 리스트를 작성 후 그 리스트를 넣기
리스트 = [10, 20, 30]
for 변수 in 리스트:
  print(변수)

 

- 반복횟수는 자료구조의 개수!

리스트 = ["가", "나", "다"]
for 변수 in 리스트 :
    print(변수)   
print("-" * 10)
for 변수 in 리스트 :
    print(변수)

#결과 :
가
나
다
----------
가
나
다

for 변수 in 리스트:
    print("@@@@@")

#결과:
@@@@@
@@@@@
@@@@@

# 리스트에 있는 변수의 개수만큼 @@@@@를 print하는 일을 반복
#이처럼, for문은 자료구조의 데이터 개수만큼 들여쓰기 된 코드를 반복 실행한다!
#곱하기
3 x 1 = 3
3 x 2 = 6
3 x 3 = 9

1)
리스트 = [1, 2, 3]
for 숫자 in 리스트:
    print(f'3 x {숫자} = {3*숫자}')
    
2)
리스트 = [1, 2, 3]
for 변수 in 리스트:
  print("3 x {} = {}".format(변수, 3 * 변수))
# 학생 5명의 성적을 리스트에 저장하라
점수 = [4, 6, 8, 2, 9]
list = []   # 반복문 밖에서 비어있는 리스트 먼저 선언하기~
for 변수 in 점수:
    if(변수 >= 7):
        list.append('A')
    elif(변수 >= 4):
        list.append('B')
    else:
        list.append('C')
print(list)

-> 반복문 밖에서 미리 선언한 리스트에 append하여 마지막에 리스트만 출력

 

# 사용자로부터 점수의 리스트를 받아서 학생들의 성적을 리스트로 출력하라
# 0부터 9까지만 입력함

val = input("점수입력") # 3 6 8 9 입력한다고 가정
temp = [ ]   # 점수를 저장할 리스트
for 변수 in val.split():   # split함수에서 ()안에 아무것도 안넣으면 자동으로 공백이 기준
    temp.append(int(변수))
list = [ ]   # 결과를 저장할 리스트
for 변수 in temp:
    if(변수 >= 7):
        결과 = 'A'
    elif(변수 >= 4):
        결과 = 'B'
    else:
        결과 = 'C'
    list.append(결과)
print(list)
#성적출력하기

my_grade = ["1999-수", "2000-양", "2001-미", "2002-수"]

for 년도_성적 in my_grade:
    print(f"{년도_성적[:4]}년 성적: {년도_성적[5]}")
 
#결과
1999년 성적: 수
2000년 성적: 양
2001년 성적: 미
2002년 성적: 수

 

- 자료구조 자리에서 슬라이싱 쓰기

#리스트에서 Naver와 Samsung 출력하기
리스트 = ["Naver", "Samsung", "SK Hynix"]

# 슬라이싱
for name in 리스트[:2]:   #자료구조 자리에 슬라이싱도 쓸 수 있다
    print(name)

cf. 슬라이싱 추가문제1 - '가', '다'만 출력하기
리스트 = ["가", "나", "다", "라"]
for 변수 in 리스트[ : : 2]:  #전체슬라이싱 증감폭2
  print(변수)
  
cf. 슬라이싱 추가문제2 - '라' '다' '나' '가' 출력
리스트 = ["가", "나", "다", "라"]
for 변수 in 리스트[ : : -1]: #전체슬라이싱 역순
  print(변수)

# 분기문
for name in 리스트:
    if name != 'SK Hynix':
        print(name)

 

#반복문으로 리스트 값들의 합 구하기

리스트 = [10, 20, 30, 40]
sum = 0   # 반복문 밖에서 합을 나타내는 변수인 sum을 먼저 선언
for val in 리스트:
    sum += val
print(sum)

# 다 곱하려면?
multi = 1   # 여기서 0으로 하면 곱해도 0이 되므로 1로!
for val in 리스트:
    multi *= val
print(multi)
# 대문자만 출력하기 - isupper 함수 활용

리스트 = ["A", "b", "c", "D"]
for i in 리스트:
    if i.isupper():
        print(i)
#파일 이름이 저장된 리스트에서 확장자를 제거하고 
#파일 이름만 출력 (힌트: split() 메서드)
리스트 = ['hello.py', 'ex01.py', 'intro.hwp']

for file in 리스트:
    list = file.split('.') # .을 기준으로 문자열을 분할해 list에 저장 -> 리스트 형태
    print(list[0]) # 파일명은 list[0]에, 확장자는 list[1]에 있음
    
#파일 이름이 저장된 리스트에서 확장자가 .h나 .c인 파일을 화면에 출력하라.
리스트 = ['intra.h', 'intra.c', 'define.h', 'run.py']

for file in 리스트:
    list = file.split('.')
    if(list[1] == 'h' or list[1] == 'c' ):
        print(list[0])

 

- range

: range(숫자) --> 0부터 숫자-1까지의 리스트

: range(숫자1, 숫자2) --> 숫자1부터 숫자2-1까지의 리스트

: range(숫자1, 숫자2, 숫자3) --> 숫자1부터 숫자2까지 증감폭이 숫자3인 리스트

price_list = [32100, 32150, 32000, 32500]
#아래와 같은 형태로 출력
3 32100
2 32150
1 32000
0 32500

for i in range(len(price_list)):
	print((len(price_list)-1)-i, price_list[i])   # print(3-i, price_list[i])를 좀 더 일반화


#아래와 같은 형태로 출력
100 32150
110 32000
120 32500

for i in range(1, len(price_list)):   # range 1부터 시작!
    print(100 + (i-1)*10, price_list[i])
my_list = ["가", "나", "다", "라", "마"]

# 아래와 같이 출력
가 나 다
나 다 라
다 라 마

1)
for i in range(len(my_list)-2):
    print(my_list[i], my_list[i+1], my_list[i+2])
    
2)
for i in range(1, len(my_list)-1):  
	print(my_list[i-1], my_list[i], my_list[i+1]

3)
for i in range(2, len(my_list)):
	print(my_list[i-2], my_list[i-1], my_list[i])
my_list = ["가", "나", "다", "라"]
# 아래와 같이 출력
라 다
다 나
나 가

1)
for i in range(len(my_list)-1, 0, -1): # 3 2 1
    print(my_list[i], my_list[i-1])
    
2)
for i in range(len(my_list) - 1):
    print(my_list[len(my_list) - 1 - i], my_list[len(my_list) - 2 - i])

 

- 2차원리스트

#2차원리스트 stock 만들기

시가	종가
100	80
200	210
300	330

stock = [
	["시가", 100, 200, 300]
    , ["종가", 80, 210, 330] 
]

#딕셔너리 사용, value를 리스트로 작성
10/10 -	80	110	70	90
10/11 -	210	230	190	200

stock = {
    '10/10': [80, 110, 70, 90]
    , '10/11' : [210, 230, 190, 200]
}
apart = [ [101, 102], [201, 202], [301, 302] ]
#아래와 같이 출력
101 호
102 호
201 호
202 호
301 호
302 호

for row in apart:
    for col in row:   # 리스트 형태 ex) [101, 102]
        print(col, '호')

 

- for문 들여쓰기에 따라 결과가 달라짐

apart = [ [101, 102], [201, 202], [301, 302] ]

#1)
for row in apart:
    for col in row:
        print(col, '호')
		print('-----')   #col을 찍고 -----를 찍는 것을 반복
#결과
101호
-----
102 호
-----
201 호
-----
202 호
-----
301 호
-----
302 호
-----

2)
for row in apart:
    for col in row:
        print(col, '호')
    print('-----')      # 1개의 row에 있는 col을 찍는 두번째 for문을 다 돌고 ----- 찍음

#결과
101 호
102 호
-----
201 호
202 호
-----
301 호
302 호

3)
apart = [ [101, 102], [201, 202], [301, 302] ]
for row in apart:
    for col in row:
        print(col, '호')
print('-----')     #모든 for문을 다 돌고 난 뒤 마지막에 ----- 찍음

#결과
101 호
102 호
201 호
202 호
301 호
302 호
-----
# 다음과 같은 2차원배열로 저장하기
data = [
    [ 2000,  3050,  2050,  1980],
    [ 7500,  2050,  2050,  1980],
    [15450, 15050, 15550, 14900]
]

data = []
for line in data:
	temp = []
    for col in line:
        temp.append(col)
    data.append(temp)   #for
        
print(result)


# 어떠한 과정으로 돌아가는 지를 한번 살펴보자
result = []
for line in data:
    sub = []
    for col in line:
        sub.append(col)
        print("한 column 추가완료")
        print(sub)
    result.append(sub)
print(result)

하나의 col 추가완료
[2000]
하나의 col 추가완료
[2000, 3050]
하나의 col 추가완료
[2000, 3050, 2050]
하나의 col 추가완료
[2000, 3050, 2050, 1980]
하나의 col 추가완료
[7500]
하나의 col 추가완료
[7500, 2050]
하나의 col 추가완료
[7500, 2050, 2050]
하나의 col 추가완료
[7500, 2050, 2050, 1980]
하나의 col 추가완료
[15450]
하나의 col 추가완료
[15450, 15050]
하나의 col 추가완료
[15450, 15050, 15550]
하나의 col 추가완료
[15450, 15050, 15550, 14900]
[[2000, 3050, 2050, 1980], [7500, 2050, 2050, 1980], [15450, 15050, 15550, 14900]]

 

- print명령의 end인수 활용 : 문자출력 후 이어서 출력할 문자 설정, 이 때 end인수에 다른 문자를 설정하면 개행코드 대신 이 문자가 출력됨. 예제에서는 " "를 넣어 공백이 한칸 찍히고 이어서 다음 문자를 print하게 됨 

# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 출력

for i in range(25):
    print(i, end=' ')
    
#
0 1 2 3 4
5 6 7 8 9
10 11 12 13 14
15 16 17 18 19
20 21 22 23 24

1) for문 한 개만 사용
for i in range (25) :
    print (i, end=" ")
    if (i + 1) % 5 == 0 :    #5개 단위로 줄바꿈문자 넣기
        print ("")

2) for문 두 개 사용
2-1) 내 풀이
for i in range(5):
    for j in range(5*i, 5*i+5):
        print(j, end= ' ')
    print('')
    
2-2) 모범답안 풀이
for i in range (0, 25, 5) :
    for j in range(5) :
        print (i + j, end=" ")
    print("")

2-3) 모범답안 풀이
for i in range(5) :
    for j in range(5) :
        print (5 * i + j, end=" ")
    print("")
#for문 2개 사용하여 출력

5 4 3 2 1
10 9 8 7 6
15 14 13 12 11
20 19 18 17 16
25 24 23 22 21

1)
for i in range(5, 30, 5): 
    for j in range(5):
        print(i-j, end=" ")
    print("")

2)
for y in range(1, 6) :
    for x in range(5) :
        print (y * 5 - x, end=' ')
    print ("")
#for문 2개 사용하여 출력
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
5 10 15 20 25

1)
for i in range(1,6):
    for j in range(1,6):
        print(i*j, end =" ")
    print("")

2)
for i in range(5) :
    for j in range(5) :
        print ((i + 1) * (j + 1), end=" ")
    print("")