[프로그래밍활용] Python Workspace Final Term 본문
# 중첩 for 반복문
# 1. for 문에 다른 for 문을 포함
for a in range(5):
# 매개변수 a, 5번 반복
for b in range(5):
# 매개변수 b 추가, 5번 반복
print('*', end = '')
# 5개의 별들이 서로 붙여진 상태로 출력되게 하기 위해서 end = ''를 추가한다.
print()
# 4행부터 9행까지의 프로세스가 for b in range(5) 인 셈이고
# 그러한 프로세스들을 5번 하는 것이 for a in range(5) 인 것이다.
# 이런 식으로 중첩 for 반복문을 시행하는 것이다.
# 2. 구구단 출력
# 위의 방식을 활용하여 구구단을 출력하게 할 수도 있다.
for a in range(1, 10):
# range() 안의 정숫값이 하나일 때엔 그 횟수만큼 반복하고
# range() 안의 정숫값이 두개일 때엔 첫번째 수에서 두번째 수-1 만큼 반복한다.
# for a in range(1, 10)일 시엔, 9번 반복하는 것 = 9단까지만 계산
for b in range(1, 10):
print('%d * %d = %d ' % (a, b, a*b), end = '\n')
# 10진 정수로 포매팅 (%d)하여 처리한다.
# 각각 대응되는 값을 괄호 안에 넣어줌 (a, b, a*b)
print()
# 하지만 결괏값은 일렬로 나열된 값의 연속으로 가독성은 떨어진다.
# 이를 해결하기위해선 end = '' 안에 \n을 넣어주면 된다.
# 3-1. 별찍기 - 삼각형 모양 출력
for a in range(5):
for b in range(0, a+1):
# 여기서의 a값은 5이기에 range(0, 6)이 되고, 총 5층의 별을 쌓는 다는 것을 알 수 있다.
print("*", end = '')
print()
print("-------------------------------")
# 3-2. 별찍기 - 역삼각형 모양 출력
for a in range(5):
for b in range(0, 5-a):
# 역삼각형은 큰 수에서 작은 수로 내려가는 형식이기 때문에 정해진 수 - a로 측정한다.
print("*", end = '')
print()
# 1. 중첩 while문을 이용하여 구구단을 출력
a = 1
# 먼저 변수 선언
while a < 10:
# while문은 특정 조건을 만족할 때 까지 계속해서 명령문을 반복하는 함수.
# while 문 안에 for문 혹은 while문을 또 넣음으로써 중첩문을 실행할 수 있다.
b = 1
# b가 다시 초기화되지 않으면 2번째 행부터 제대로 출력이 되지 않음
# 곱해질 수는 a와 b
while b < 10: # 내부 반복문
print("%d * %d = %d, " % (a, b, a*b), end = '')
# 10진수에 맞게 적절히 포매팅해준다.
b += 1
print()
a += 1
print("--------------------------------")
# 2. 중첩 while문을 이용하여 별삼각형을 출력
a = 0
while a < 5:
b = 0
# 제어변수 하나 더 생성
while b < a + 1:
# b 는 a에 비례하여 값이 바뀌어야 함.
print("*", end = "")
b += 1
print()
a += 1
print("--------------------------------")
# 3. 중첩 for문과 while문을 이용하여 역삼각형을 출력
a = 0
while a < 5:
b = 0
# 제어변수 하나 더 생성
while b < 5 - a:
# b 는 a에 비례하여 값이 바뀌어야 함.
print("*", end = "")
b += 1
print()
a += 1
print("--------------------------------")
a = 0
while a < 5:
b = 5
while b > 4 - a:
print("*", end = '')
b -= 1
print()
a += 1
'''리스트'''
# 단일 변수명에 여러 개의 값을 저장하는 것을 리스트라고 함
# 예를들어 score = [75, 88, 92, 65, 99]
# 접근법은 순번을 사용함
''' 리스트 각각의 원소의 누적합'''
score = [75, 88, 92, 65, 99]
tot = 0
for i in score:
# 위의 score 리스트에 있는 값들을 모두 불러오는 것.
tot += i
# i의 값 누적 = score의 모든 값을 더하는 것.
print(tot, tot / len(score))
# tot / len(score)은 평균값
'''리스트 원소 읽기'''
print(score[0])
# 인덱스를 활용, 0번째 원소를 print하는 문.
print(score[2:])
# 2번째 원소부터 끝까지
print(score[2:4])
# 2번째 원소부터 4번째 변수 '전'까지
title = ['python', 'programming']
print(title[0])
'''리스트 원소 수정 및 삭제'''
score [2] = 95
# 0, 1, 2번째 값을 95로 대체하는 명령문 (92 -> 95)
print(score)
del score[0]
# 0번쨰의 원소를 삭제하는 명령문
print(score)
'''리스트 원소 추가, 삭제'''
score.append(73)
# 73이라는 원소를 추가
print(score)
score.insert(2, 85)
# 2의 위치에 85라는 원소를 추가
# 위치 좌표를 추가함에 차별점을 둠.
print(score)
score.remove(85)
# score이라는 리스트 중 85라는 원소 값을 찾아서 삭제
print(score)
del(score[2])
print(score)
'''리스트 정렬'''
# 정렬을 실행하면 리스트 데이터가 변경됨
score.sort()
# 오름차순 정렬
print(score)
score.reverse()
# .sort가 위에서 아래로 오름차순이었다면 .reverse는 아래에서 위로의 내림차순이다.
print(score)
'''빈 리스트 생성 후 추가'''
myList = []
myList.append(10)
myList.append(20)
print(myList)
# 비어있는 리스트를 만든다 [], 안에는 아무런 원소값도 존재하지 않음.
# 위에서 배운 append를 이용하여 list에 10을 추가한다. [10]
# 같은 방법으로 20도 추가한다. [10, 20]
'''튜플'''
# 리스트와 구조가 유사하나, 데이터를 수정할 수 없는 경우에 사용하는 format이다.
tscore = (88, 76, 55, 90, 83)
# 대괄호 대신에 일반괄호를 사용하여 차별점을 둠.
print(tscore)
print(tscore[2:4])
''' 튜플의 특징'''
# 여러 개의 변수를 한번에 반환받을 수 있음
tu = ("Python", "Programming")
var1, var2 = tu
print(var1, var2)
# 결괏값은 Python Programming일 것이다.
# 튜플의 특징:
# 리스트의 메모리값 > 튜플의 메모리값 (리스트에 비해 메모리를 절약할 수 있음.)
# 리스트의 속도 < 튜플의 속도 (리스트에 비해 속도가 빠름)
# 리스트: 수정가능 / 튜플: 수정불가능
# 리스트의 반환값: 0~1개 / 튜플의 반환값: 여러개의 값
'''딕셔너리'''
# 딕셔너리는 key와 value의 조합
# key: 구분자
# value: 실제 데이터
# 문법:
# 변수명 = {key1 : value 1, key2: value2, key3: value3}
# 딕셔너리 생성과 출력
fruit = {"사과": 1000, "배": 2000, "포도": 1500}
print(fruit["사과"])
# 여기서의 "사과"는 Key에 해당함. Key 값을 이용하여 값을 출력함
print(fruit)
# fruit은 딕셔너리 전체의 이름이다.
print(fruit.keys())
# fruit 안에 있는 모든 keys의 값들을 출력 (키)
print(fruit.values())
# fruit 안에 있는 모든 Value 값들을 출력 (값)
print(fruit.items())
# fruit 안에 있는 모든 item 값들을 출력 (키와 값)
# 딕셔너리 반복
for k, v in fruit.items():
print("Key: ", k)
print("Value: ", v)
# 이에 예상되는 결과값은
'''
Key: 첫 번쨰 키값
Value: 첫 번째 밸류값
Key: 두 번째 키값
Value: 두 번째 밸류값
...
...
'''
# 포함 여부 판단
'사과' in fruit.keys()
# key값에 '사과'가 있는지의 포함 여부를 판단하는 것.
'복숭아' in fruit.keys()
1000 in fruit.values()
# 객체지향 프로그래밍
'''
생성자
파이썬의 클래스 선언 형식은 다음과 같다.
키워드 class로 시작하고 클래스 이름을 적되 대상을 잘 표현하는 이름을 붙인다.
클래스는 변수나 함수보다는 덩치가 커 첫 자를 대문자로 적는 것이 관행이다.
class 이름:
def __init__ (self, 초기값):
멤버 초기화
메서드 정의
클래스 선언문 안에 속성에 해당하는 변수와 동작에 해당하는 메서드를 나열한다.
첫번쨰 메서드는 통상 객체를 초기화하는 __init__ 생성자이다.
앞뒤로 밑줄 두 개가 있는 메서드를 특수 메서드라고 하는데 용도와 이름이 미리 정해져 있다.
메서드의 첫 번쨰 인수는 자기 자신을 의미하는 self이며 멤버 참조시 self.멤버 구문을 사용한다
인수명인 self는 키워드가 아니여서 아무 이름이나 쓸 수 있지만, self라는 명칭을 쓰는 것이 관행이다
'''
class Car:
# 객채를 구현하기 위한 클래스 만들기 시작!
# 클래스의 이름을 'Car'로 지정
def __init__(self, carName):
# def로 메서드 생성, 초기화 메서드 init (initialize) 입력
# 인수 중 첫번쨰의 self는 자신을 지칭하는 것이며, 멤버 참조 시 self.멤버 의 구문을 사용한다
self.carName = carName
# 좌항의 self.carName은 객체의 멤버를 지칭하는 것이며, 우항의 carName은 값을 지칭한다.
self.carSpeed = 100
print(carName, '생성')
# 사용된 carName이 무엇인지 확인하기 위해 print 하는 듯.
def speedUp (self, speed):
# speedUp이라는 이름의 함수 (메서드)를 추가하는 과정. __init__과는 다르다!
self.carSpeed += speed
# speed, 즉 속도값은 지속적으로 우상향하니 값이 계속 중첩되어 더해져야 맞다.
print(self.carName, "의 속도는:", self.carSpeed)
# 총 사용된 메서드는 2개, carName과 carSpeed
car1 = Car("승용차 no.1")
car1.speedUp(20)
# 기존의 100 값에 20이 추가된 값이 출력되어 120이 된다.
car1.speedUp(50)
# 이는 속도값이 중첩되고 있음을 확인하기 위한 추가작업이다.
car2 = Car("승용차 no.2")
car2.speedUp(50)
import numpy as np
# 넘피 모듈을 불러온다
arr1 = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
#생성된 메서드의 이름은 arr1, 3행 [n1, n2, n3]에 4열 [[1개] [2개] [3개] [4개]]
print (arr1)
print (arr1.shape)
# 속성 출력, 속성이라 함은 3행 4열을 나타냄. 보여지는 순서는 (열, 행)순.
# 그렇기에 출력값은 (4, 3) 일 것이다.
print(arr1[1,2])
# 1행 1열 (0행 0열부터 시작)
print(arr1[:, 2])
# 2열 전체 (시작과 끝을 명시하지 않았으니 전체라는 뜻.)
# 생략기법을 사용할 수 있음 (쉼표를 사이에 두고 앞이 행, 뒤가 열.
# 2열만 나타내겠다고 하면 뒤에 2, 앞에는 콜론 (:)
data1 = np.random.randn(5,5)
# 랜덤클래스의 randn(정규분포의 난수를 발생시키는 메서드)
# 5행의 5열, 총 25개의 원소가 들어있는 집합을 생성.
print(data1)
np.sum (data1)
# data1의 모든 값들을 sum하는 문
# data1의 모든 값들의 합 = 3.6407936404217893
np.mean(data1)
# mean은 평균값을 뜻함.
# data1의 모든 값들의 평균 = 0.14563174561687156
import matplotlib.pyplot as plt
# 수학 관련 모듈인 matplotlib.pylot을 불러온다
# 이미지를 불러올 수도 있다.
import numpy as np
# 수학 관련 모듈인 numpy 모듈을 볼러온다 (함수와 그래프 관련)
plt.plot ([1,2,3,4])
# plot은 현재 [ ] 안에 있는 수들로 플롯 그래프를 그리는 기능을 제공한다.
# 요소가 1, 2, 3, 4인 리스트를 생성한다. 즉, 그래프의 실질적인 값.
# ()로 이루어지면 튜플
plt.xlabel ('decimal')
# 함수의 x그래프의 이름을 붙인다 (label 한다)
plt.ylabel ('number')
plt.show()
plt.plot([1, 2, 3, 4], [1, 4, 9, 16])
# 그래프의 기본형은 파란색 선그래프.
plt.show()
plt.plot ([1,2,3,4],[1,4,9,16], 'ro')
# 리스트에 대응되는 함수 값은 (1,1), (2,4), (3,9), (4,16)
# ro는 red o, 즉 빨간 동그라미의 그래프라는 뜻
plt.axis ([0, 6, 0, 20])
# 2개로 나누어 본다. 차례대로 [xmin, xmax, ymin, ymax]
# x축의 최솟값과 최대값의 범위는 0에서 6까지
# y축의 최솟값과 최대값의 범위는 0에서 20까지
plt.show()
# np.arrange를 사용한다면 실수의 값을 구간으로 지정할 수 있다.
t = np.arange(0., 5., 0.2)
# 쉼표와 점의 차이를 잘 구분하자!
# 원래 증감값의 최솟값은 1이지만 numpy를 이용해 0.2의 구간의 리스트(배열)를 만들어낼 수 있다.
# 0부터 5까지 0.2 간격으로 리스트생성
plt.plot (t, t, 'r--', t, t**2, 'bs', t, t**3, 'g^')
# (t, t, 'r--' )일때 x축이 t, y축이 t, r--는 빨간색의 점선그래프
# (t, t**2, 'bs' )일때 x축이 t, y축이 t의 2제곱, 'bs'는 blue square 그래프
# (t, t**3, 'g^' )일때 x축이 t, y축이 t의 3제곱, g^는 green 삼각형 그래프
plt.show()
# 사실상 똑같은 그래프를 그리지만 다음과 같은 포매팅을 한다.
names = ['group_a', 'group_b', 'group_c']
values =[1, 10, 100]
# 데이터 준비 완료. 한 섹터에 3개의 그래프를 그릴 것.
plt.figure (figsize = (9, 3))
# figure size는 인치단위
plt.subplot (1, 3, 1)
# subplot이라는 함수를 이용
# (1, 3, 1)은 1행 3열의 첫번째라는 뜻
plt.bar (names, values)
# '이에 대해 그래프를 그려라'의 명령이 plt.bar이다.
# 막대그래프에 넣을 값은, x축에 names(group_a나 group_b와 같은), y값에는 values(1, 10, 100과 같은)
# 똑같은 방식으로 위와 같은 그래프를 2개 더 만든다
plt.subplot (1, 3, 2)
plt.scatter(names, values)
# scatter은 그래프의 종류 중 하나로 점그래프를 뜻한다.
plt.subplot (1, 3, 3)
plt.plot (names, values)
# plot은 기본적인 선그래프
plt.suptitle ("Categorial Plotting")
# 그래프 위에 붙일 제목을 정한다 "Categorial Plotting"
plt.show ()
# sin그래프 그리기.
t = np.arange(0.0, 2.0, 0.01)
# x축으로 활용한 numpy 배열을 만든다.
# (0.0, 2.0, 0.01) = 0.0부터 시작해서 2.0까지 0.01의 간격
s = 1 + np.sin ( 2 * np.pi * t)
# s는 t를 이용해 만든다. 1 + np.sin ( 2 * np.pi * t)
# sin값은 0과 1 사이, 이를 그래프로 그리면 굉장히 작을 수 밖에 없기에 앞에 1를 더해준다.
# np.pi는 3.141592... sin 2파이가 360도, t가 2일 경우 720도
fig, ax = plt.subplots ()
# 살짝 다른 방식 (튜플을 이용하는)으로 그래프를 그려본다.
# subplots로 복수형으로 만들면 반환값이 2개가 만들어진다. (축 관련)
# 축과 관련된 것은 ax (axis, 축)로 그린다. 그렇기에 아래의 모든 그래프들은 ax로 시작한다.
ax.plot (t, s)
# x값은 t, y값은 s로 그래프를 만든다.
ax.set(title = 'Sample Plot')
ax.grid()
# 간단하게 격자를 만들어주는 기능.
plt.show()
x1 = np.linspace (0.0, 5.0)
# numpy를 활용한 linespace 점 생성
x2 = np.linspace (0.0, 2.0)
y1 = np.cos (2 * np.pi * x1 ) * np.exp (-x1)
# cosin 그래프 그리기. 지수함수까지 추가.
y2 = np.cos (2 * np.pi * x2 )
# 720도 구간에 해당하는 그래프를 그리는 것이다.
# 여기까지의 과정은 아래의 그래프를 만들게 될 때에 사용될 요소들의 생성과정이다.
plt.subplot (2, 1, 1)
# 2행 1열의 첫번째 그래프.
plt.plot (x1, y1, 'o-')
# 위의 과정에서 만든 x1, y1을 활용한다.
# o-는 dot들이 선으로 연결된 모양의 그래프.
plt.subplot (2, 1, 2)
plt.plot (x2, y2, '.-')
# 이번엔 점과 선으로 연결된 모양의 그래프.
plt.show()
# label 지정하기.
plt.plot([1, 2, 3], label="Line 1", linestyle='--')
# 그래프의 모형은 정하지만 width는 따로 정하지 않음.
plt.plot([3, 2, 1], label="Line 2", linewidth=4)
# width 값을 정해준 모습.
plt.legend()
# 범례 표시
# 왼쪽 중단의 박스처리된 것이 그 범례이다.
plt.show()
import matplotlib.image as mpimg
# 이미지를 불러오는 기능을 불러온다.
# 꼭 미리 실행 한 번 해주고 다른 데이터를 run해야한다.
img = mpimg.imread ("image1.png")
# imread는 이미지를 불러오는 코드이다.
# 파일의 디렉토리는 C, 사용자
plt.imshow(img)
plt.xticks([])
plt.yticks([])
# 눈금이 보여질 것을 공백[]으로 만들어야 눈금이 보이지 않는다.
plt.show ()
# 추가, 만약 plt.xticks([])를 포함하지 않았을 경우의 결과값.
plt.subplot(2, 2, 1)
img1 = mpimg.imread ("image1.png")
plt.imshow(img1)
# 일부러 plt.xticks([])를 넣지 않았다.
# 결과를 보면 알 수 있듯, 사진의 크기에 비례하여 x값과 y값이 숫자로 보이게 된다.
plt.subplot(2, 2, 2)
img2 = mpimg.imread ("image2.jpg")
plt.imshow(img2)
plt.xticks([])
plt.yticks([])
# 깜짝과제
# 임의의 이미지 4개를 각각 2행 2열로 배치해보기. (image 1, 2, 3, 4)
plt.subplot(2, 2, 1)
img1 = mpimg.imread ("image1.png")
plt.imshow(img1)
plt.xticks([])
plt.yticks([])
plt.subplot(2, 2, 2)
img2 = mpimg.imread ("image2.jpg")
plt.imshow(img2)
plt.xticks([])
plt.yticks([])
plt.subplot(2,2,3)
img3 = mpimg.imread ("image3.jpg")
plt.imshow(img3)
plt.xticks([])
plt.yticks([])
plt.subplot(2,2,4)
img4 = mpimg.imread ("image4.jpg")
plt.imshow(img4)
plt.xticks([])
plt.yticks([])
plt.show()
from bs4 import BeautifulSoup
import pandas as pd
import urllib.request as ulib
url = 'http://apis.data.go.kr/B552584/ArpltnInforInqireSvc/getCtprvnRltmMesureDnsty?serviceKey=mmIBgSEMnYrX52paL0N0sksCAWsUIAhEQUPk4jbZIGJvaKEPWtj6Q7owFDlUHGnc4ROmxAkK0EvfaNlUuxkMEA%3D%3D&returnType=xml&numOfRows=100&pageNo=1&sidoName=%EC%84%9C%EC%9A%B8&ver=1.0'
res = ulib.urlopen(url)
air = BeautifulSoup (res, "html.parser")
df1 = []
df2 = []
for item in air.findAll('item'):
for stationname in item.findAll('stationname'):
df1.append(stationname.string)
for pm10value in item.findAll('pm10value'):
df2.append(pm10value.string)
print(df1)
print(df2)
# 숫자가 아니라 문자.
# '-'는 계측기가 고장난것.
df = pd.DataFrame ({'측정소': df1, 'pm10': df2})
df.head()
df.to_csv ('test100.scv')
df1 = []
df2 = []
for item in air.findAll('item'):
for stationname in item.findAll('stationname'):
df1.append(stationname.string)
for pm10value in item.findAll('pm10value'):
df2.append(pm10value.string)
print(df1)
print(df2)
url = "http://apis.data.go.kr/B552584/ArpltnInforInqireSvc/getMsrstnAcctoRltmMesureDnsty?serviceKey=mmIBgSEMnYrX52paL0N0sksCAWsUIAhEQUPk4jbZIGJvaKEPWtj6Q7owFDlUHGnc4ROmxAkK0EvfaNlUuxkMEA%3D%3D&returnType=xml&numOfRows=10&pageNo=1&stationName=%EC%A2%85%EB%A1%9C%EA%B5%AC&dataTerm=DAILY&ver=1.0"
res = ulib.urlopen(url)
air = BeautifulSoup (res, "html.parser")
df1 = []
df2 = []
for item in air.findAll('item'):
for stationname in item.findAll('datatime'):
df1.append(datatime.string[11:])
for pm10value in item.findAll('pm10value'):
df2.append(pm10value.string)
print(df1)
print(df2)
df = pd.DataFrame({'시간': df1, 'pm10': df2},)
df.head() # df.head()는 5개만 출력하는 것이고 df만 치면 10개가 출력된다.
'대학교 > 대학 과제' 카테고리의 다른 글
[미디어읽기와보기] 담론 주장펼치기 (0) | 2021.08.21 |
---|---|
[미디어읽기와보기] THE POST 영화감상문 제작 기획서 (0) | 2021.08.21 |
[프로그래밍활용] Python Workspace Mid Term (0) | 2021.08.21 |
[기초통계학] 14주차 과제 (0) | 2021.08.16 |
[디지털미디어의이해] 디지털컨버전스 발표 원고 (0) | 2021.08.16 |
Comments