# 파이썬 웹 크롤링


안녕하세요 코드사기꾼입니다.

오늘부터 웹 크롤링을 주제로 글을 작성해보도록 하겠습니다.

그럼 먼저 개념에 대해서 알고 시작해야겠죠? 크롤링이란 무엇일까요?


크롤링(Crawling)은  사전적으로 기어다니는 것을 뜻합니다. IT쪽에서는 웹페이지를 순회하면서 정보를 수집하는 행위를 말합니다. 크롤링은 스크래핑(Scraping) 또는 데이터 긁기등 다양한 단어로 불리우고 있고, 원하시는 용어를 사용하시면 됩니다.


1. BeautifulSoup


BeautifulSoup는 우리의 크롤링을 도와줄 파이썬 오픈소스 라이브러리 입니다. 정규표현식을 사용해서 크롤링한 데이터(html, xml등)내에서 원하는 부분을 추출할 수 있도록 도와줍니다.


공식사이트 링크:

https://www.crummy.com/software/BeautifulSoup/bs4/doc/#the-keyword-arguments



2. BeautifulSoup 설치


이 글은 파이썬 3.x 버전으로 진행하도록 하겠습니다. pip이 설치되어 있다는 가정하에 커맨드라인 프롬프트(cmd)에 아래와 같이 입력합니다.


1
pip install bs4
c
s



3. HTTP Request/Response


먼저 데이터를 크롤링하기 위해서는 웹소켓을 이용하여 원하는 웹사이트에 연결요청을 진행하여야 합니다. 연결요청을 하면 그에 대한 응답으로 웹서버는 Response를 보내는데요 이 데이터는 일반적으로 html이나 json형식을 띄고 있습니다. 이렇게 받아온 html, json데이터를 Beautiful Soup로 파싱 하는것을 크롤링이라고 하는것 입니다.


웹소켓에 대한 대표적인 라이브러리로는 requests, urllib이 있으며 제 블로그에서 일전에 requests에 관한 글을 작성해 놓았던게 있기 때문에 이번에는 urllib으로 진행하도록 하겠습니다.

urllib은 파이썬 기본 라이브러리입니다. 파이썬 2.x버전에서는 urllib, urllib2로 나누어져 있었는데 이것이 3.x버전에 들어서면서 통합되고 코드가 개선되었습니다.


1
2
3
4
5
6
# urllib을 사용한 Request 보내기
import urllib.request
 
url = "http://www.naver.com/"
req = urllib.request.urlopen(url) # url에 대한 연결요청
res = req.read() # 연결요청에 대한 응답
cs







4. 데이터 크롤링


지금 부터 본격적으로 데이터를 크롤링 해보도록 하겠습니다.

아까 설치한 bs4를 코드 최상단에 import하고 response로 받아온 html파일을 태그(tag)기준으로 크롤링 하겠습니다.

네이버 인기검색어를 크롤링 하도록 할텐데 먼저 어떤 태그안에 인기검색어가 저장되어있는지, 또 그 태그는 어떤 클래스로 정의되어 있는지를 파악해야 합니다. 그러기 위하여 크롬(Chrome)브라우저의 개발자도구를 이용하도록 하겠습니다.(f12를 누르면 개발자도구에 진입합니다.)




인기급상승 검색어는 sapn태그에 ah_k클래스를 사용하고 있다는 것을 확인하였습니다. 그러면 본격적으로 소스코드를 작성해 보겠습니다.(2번째 사진에서 빨간색 박스부분을 클릭한 후 원하는 곳을 클릭하면 해당 태그를 찾아줍니다. )


1
2
3
4
5
6
7
8
9
10
import urllib.request
from bs4 import BeautifulSoup
 
url = "https://www.naver.com/"
req = urllib.request.urlopen(url)
res = req.read()
 
soup = BeautifulSoup(res,'html.parser'# BeautifulSoup 객체생성
keywords = soup.find_all('span',class_='ah_k'# 데이터에서 태그와 클래스를 찾는 함수
print(keywords)
cs




크롤링해온 데이터는 html 태그에 쌓여진 리스트 형태로 리턴된다는 것을 알았습니다. 이번에는 코드에 함수하나를 추가해서 각 태그의 텍스트만 뽑아오도록 변경해 보겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import urllib.request
from bs4 import BeautifulSoup
 
#여기에 함수를 구현해봅시다.
url = "https://www.naver.com/"
req = urllib.request.urlopen(url)
res = req.read()
 
soup = BeautifulSoup(res,'html.parser')
keywords = soup.find_all('span',class_='ah_k')
#get_text() == 데이터에서 문자열만 추출
#strip() == 데이터의 양옆 공백제거
#[:20]의 이유? 인기검색어의 중복을 막고 20위까지만 출력하기 위함
keywords = [each_line.get_text().strip() for each_line in keywords[:20]]
print(keywords)
cs



결과를 보시면 깔끔하게 검색어가 뽑혀있는것을 확인할 수 있습니다.

# 파이썬 제어문



1. for문의 기본적인 사용법


for문은 while문과 같이 특정작업을 반복해야 할 때 사용합니다. while문과의 차이점이라면 특정 조건식이 참인 동안 동작하는 것이 아니라 in 키워드 뒤에오는 자료 구조에 대하여 원소단위로 순환하며 순환이 끝날때 까지 반복합니다.

즉 in 뒤에 오는 객체는 반드시 iterable 해야 합니다. 


1
2
for each in 시퀀스자료형 or iterable한 객체:
    print(each)
cs


for 키워드 다음에 오는 each는 for문이 iterable 객체에 접근하여 원소를 하나씩 순환하는 동안에 원소 하나하나가 저장되기 위한 변수입니다. 이름은 아무렇게나 정하셔도 무방합니다. 아래 그림을 보고 다시한번 이해해 보도록 하겠습니다.


for문이 자료구조의 요소 각각에 접근하면서 그 요소들은 임시적으로 each에 저장되고 다음 스텝에서 다른 값으로 대체 됩니다. 


요약하자면 for문은 이터러블 객체를 인자로 사용하는 것이 가능하고 해당 객체의 요소 각각에 접근하는 방식으로 동작합니다. 

그러면 간단하게 숫자를 하나씩 늘려가면서 반복할 수 있는 fot문은 없을까요? 답은 간단합니다. 숫자요소로 이루어진 iterable 객체를 만들어서 인자로 사용하면됩니다. 게다가 파이썬에서는 이 방식을 지원하고 있습니다.

range라는 내장함수는 숫자로 이루어진 이터러블 객체를 만들어냅니다. 


1
2
3
range(10# [0,1,2,3,4,5,6,7,8,9]
range(1,10# [1,2,3,4,5,6,7,8,9]
range(0,10,2# [0,2,4,6,8]
cs


range는 3개의 int형 데이터를 인자로 받습니다. 첫 번째 인자는 시작점인데 ~이상 으로 해석할 수 있고 두 번째는 종료점입니다. ~미만 으로 해석 가능합니다. 마지막 인자는 step으로 작동합니다. 만약 첫번째 인자가 빈칸이라면 인터프리터는 이를 0부터라고 해석합니다.


이를 for 문에 적용하면 아래와 같이 사용할 수 있습니다.


1
2
for i in range(10):
    print(i)
cs


# 파이썬 제어문



!!시퀀스 자료형은 추후에 배울 이터레이터, 제너레이터등을 위하여 필수적으로 알아야 하는 지식입니다!!


1. 시퀀스 자료형


시퀀스 자료형은 원소들을 가지고 있는 데이터 구조이며 멤버쉽 테스트를 지원하는 자료형입니다. 이는 메모리에 상주하는 데이터 구조로써, 보통 모든 원소 값을 메모리에 저장합니다. 파이썬에서 지원하는 시퀀스 자료형은 아래와 같습니다.


- list

- dictionary

- set

- tuple

- string


특정한 자료구조가 원소를 포함하고 있는지 판단 가능하면 시퀀스자료형이라고 생각하시면 됩니다. set, list, dictionary, tuple 등은 간단히 생각해도 원소를 담고 있는데 string은 이해가 쉽지 않죠?

C언어에서 string을 생각해보면 간단합니다. C 언어에서는 char* string = "my name is Rekt77"과 같은 형태로 문자열을 선언하고 각각 문자에대해 인덱스로 접근하는것이 가능합니다.

파이썬에서도 마찬가지 입니다. string은 연속적인 문자의 집합입니다. 고로 인덱스로 접근하는 것이 가능하고 각각의 문자로 분리가능하기 때문에 한 자료구조안에 원소를 담고 있다고 볼 수 있습니다.


1
2
3
4
5
assert 1 in [1,2,3# list
assert 1 in (1,2,3# tuple
assert 1 in {1,2,3# set
assert 1 in {1:"a",2:"b",3:"c"#dictionary
assert "1" in "123" # string
cs


위의 코드는 시퀀스 자료형의 멤버쉽 테스트입니다. assert 문은 시퀀스 자료형의 멤버쉽 테스트를 위해 쓰이는 명령어입니다. 조건이 맞지 않을 경우에는 Assertion Error를 출력하여 자료구조 테스트로 자주 사용됩니다.



2. 이터러블(iterable)


이터러블하다의 의미는 사전적 정의로 '개별 원소를 반복적으로 셀 수 있는' 이라는 뜻을 가지고 있습니다. 이는 파이썬에서 상당히 중요한 의미를 지니는데, 반복문의 사용시 자료구조 내에 포함되어 있는 원소 하나하나에 접근할 수 있는 객체를 뜻합니다. 앞서 말씀드린 시퀀스 자료형들은 전부 이터러블한 객체입니다. 즉 인덱스나 키를 이용하여 접근할 수 있습니다. 

앞으로 for문 같은 반복문에서 자주 보게될 형태이므로 반드시 기억해 놓으셔야 합니다.


# 파이썬 제어문



제어문이란 프로그래밍 언어에서 실행순서를 변경시키거나 또는 조건에 따라 실행해야 할 명령문을 제어하는데에 사용되는 구문입니다. 일반적으로 프로그램은 위에서 아래로 순차적으로 실행되지만, 어떤 조건에 대해서만 실행해야 하는 경우나 특정 부분을 반복하여 실행해야 하는 경우 등이 있습니다.

python에서는 if, for, while문을 사용하여 흐름을 제어할 수 있습니다.



1. while 문


특정작업을 반복하여 실행해야 할 경우 반복문을 사용하면 간단히 해결할 수 있습니다. while문은 반복문의 일종으로 조건문이 참일 경우 반복을 계속합니다. 


1
2
3
while 조건:
    수행할 작업
    ...
cs


while이라는 키워드를 먼저 적고 그 뒤에 조건을 적어주면 됩니다. 앞선  if문 강의에서 배웠던 비교, 논리연산자가 쓰일 수 있습니다.


2. while 문 사용예제


glass라는 변수의 값을 0으로 초기화 하고 while문의 조건으로 glass가 10보다 작을 경우를 설정합니다. 이렇게 하면 while문의 조건이 참이니 동작을 시작하겠죠? 하지만 glass 의 값을 while문 안에서 늘려주지 않는다면 while은 무한히 실행될 것입니다. 고로 glass의 값을 +=을 통해 1씩 늘려주기로 하겠습니다. 또 while 문안에 print문을 넣어 한잔 마셨습니다. 를 출력해 보도록 하겠습니다. 그리고 glass의 값이 10이 되었을 때 취했으니 집에 돌아가요. 라는 문구를 출력해보도록 하겠습니다.



1
2
3
4
5
6
7
8
glass = 0
#10번 반복
while glass < 10:
    glass+=1
    print("한잔 마셨습니다.")
    if glass == 10:
        print("취했으니 집에 돌아가요.")
    
cs




3. while문 이스케이프(escape)


while문은 조건문이 참인 동안 계속해서 하위 구문을 반복적으로 실행합니다. 하지만 중간에 while문을 빠져나가고 싶을 경우에는 break문을 넣어 즉시 while문을 빠져나갈 수 있습니다.


1
2
3
4
5
6
7
8
9
number = 77
counter = 2
while counter < number:
    if number%counter == 0:
        print("소수가 아닙니다.")
        break
    counter += 1
    if counter == number
        print("소수 입니다.")
cs


'Dev > python' 카테고리의 다른 글

[python] 제어문(if, for, while) - 3  (0) 2019.03.23
[python] 시퀀스 자료형과 이터러블  (1) 2019.03.23
[python] 제어문(if, for, while) - 1  (0) 2019.02.15
[python] 튜플과 Immutable  (0) 2019.02.14
[python] 딕셔너리(dictionary)  (0) 2019.02.13

# 파이썬 제어문



제어문이란 프로그래밍 언어에서 실행순서를 변경시키거나 또는 조건에 따라 실행해야 할 명령문을 제어하는데에 사용되는 구문입니다. 일반적으로 프로그램은 위에서 아래로 순차적으로 실행되지만, 어떤 조건에 대해서만 실행해야 하는 경우나 특정 부분을 반복하여 실행해야 하는 경우 등이 있습니다.

python에서는 if, for, while문을 사용하여 흐름을 제어할 수 있습니다.



1. if문


if문은 일반적으로 프로그램의 흐름을 조건에 따라 다르게 해야하는 경우 사용합니다. 예를 들어 홀, 짝을 구분해야하는 프로그램에서는 if 조건에서 2로 나눈 나머지 연산의 결과가 0이냐 1이냐에 따라 다른 흐름을 갖도록 작성해야 겠죠?


if문을 선언하는 방법은 아래와 같습니다. if뒤에 조건을 넣어주고 그 값이 참이면 동작하고 참이 아니면 동작하지 않습니다.

여러가지 조건을 넣고 싶은 경우에는 elif 명령어를 씁니다. elif는 기존 if가 참이아니라 동작하지 않았을 경우 다른 대안을 제시하는데에 사용합니다. 물론 if가 참이 아니라고해서 elif가 무조건 동작하는 것은 아닙니다. 반드시 '조건이 참일 때'라는 전제조건을 수반합니다.


if나 elif의 조건에 부합하지 않았을 경우 실행시킬 루틴을 작성하고 싶을 때에는 else 명령어를 사용하시면됩니다. if나 elif가 참이 아닐경우 무조건 else가 실행됩니다.


ps.elif가 없어도 else사용가능


 

1
2
3
4
5
6
7
8
9
#elif를 추가하면 다중 조건 사용가능
#else는 위 조건에 부합하지 않는 모든 조건(여집합)
 
if 조건1:
    ...
elif 조건2:
    ...
else :
    ...
cs


하위 구문을 작성할 때 파이썬만의 독특한점이 있는데요 바로 indent라는 것입니다. indent는 들여쓰기라는 뜻입니다. 즉 하위 구문을 들여쓰기의 정도로 구분하겠다는 소리죠. 파이썬에서 공식적으로 indent로 인정받는 것은 space 4번과 tab입니다. tab이 에디터 상에서 space 4번과 동치일 경우에만 tab이 indent로 인정받는데 대부분의 에디터가 그러합니다. 하지만 간혹 space 8번으로 인식하는 경우가 있으므로 주의하셔서 사용하시면 됩니다.



2. 비교 연산자


비교 연산자라는 것은 값을 비교하여 참, 거짓을 판단해야 할 경우 사용합니다. if 문에서는 조건이 참인지 거짓인지의 여부가 대단히 중요하기 때문에 비교연산자를 상당히 많이 사용하게됩니다.

그럼 연산자의 종류에 관하여 알아볼까요?


 연산자

 설명

a < b

 a가 b보다 작으면 true 

a > b

a가 b보다 크면 true

a == b

a와 b가 같으면 true

a != b

a와 b가 같지 않으면 true

a >= b

a가 b보다 크거나 같으면 true

a <= b

a가 b보다 작거나 같으면 true


꽤 많은 연산자의 종류가 있습니다. 상황에 따라서 바꿔가며 사용하시면 됩니다.

추가적으로 if문은 0이 아닌 숫자나 비어있지 않은 자료형에 관하여 true로 인식합니다. 즉 1도 true고 'a'도 true입니다. 하지만 빈 리스트나 빈 튜플같이 비어있는 자료형은 false로 인식합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if 'a':
    print("1_True")
 
if 1:
    print("2_True")
 
if []:
    print("3_True")
 
if '':
    print("4_Ture")
 
# 결과 값
# 1_True
# 2_True
cs



3. 논리연산자


논리연산자는 조건식이나 값을 논리적으로 판단하여 참과 거짓을 판단하는데 사용됩니다. 일반적으로 if문에서는 조건을 다중으로 설정하고 싶을 경우에 사용합니다.


다른 언어에서 && 나 ||와 같은 연산자가 파이썬에서는 명령어 형태로 제공되고 있으니 명령어를 꼭 기억하셔야 합니다.


그리고의 조건을 만드는 연산자는 and입니다. 다른 언어에서의 &&과 똑같습니다. or 명령어는 다른언어에서의 ||와 같고 ~이거나라는 조건식을 만드는데에 사용됩니다.


마지막으로 조건을 부정하는 연산자는 !연산자입니다. 파이썬에서는 not이라는 명령어로 제공됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
= 2
= 3
 
if a%2==0 and b%2==0:
    print("1_True")
 
if a > 3 or b < 5:
    print("2_True")
 
if not a==b:
    print("3_True")
 
# 결과 값
# 2_True
# 3_True
cs


4번 라인을 보시면 a는 짝수이기 때문에 첫번째 조건에서 true를 반환합니다. 하지만 두번째 조건이 맞지않아 if 절이 실행되지 않았습니다. and 연산자가 두개의 조건이 전부 참일 때만 ture를 반환하기 때문이죠.

반대로 7번 라인에서는 첫번째 조건이 false고 두번째 조건이 true인데 true로 인식이 되었습니다. or 연산자 때문인데요 둘중 하나만 참이면 true를 반환합니다.

마지막으로 not 연산자는 조건을 반전시킨다고 했죠 ? a==b는 누가 봐도 false입니다. 하지만 앞에 not을 붙여서 true로 인식이 됩니다.



'Dev > python' 카테고리의 다른 글

[python] 시퀀스 자료형과 이터러블  (1) 2019.03.23
[python] 제어문(if, for, while) - 2  (0) 2019.03.23
[python] 튜플과 Immutable  (0) 2019.02.14
[python] 딕셔너리(dictionary)  (0) 2019.02.13
[python] 리스트 함수  (0) 2019.02.11

# 파이썬 튜플



튜플은 몇 가지 특성을 빼면 리스트와 거의 동일하다고 볼 수 있는 자료구조입니다.

인덱싱, 슬라이싱이 가능하고 튜플끼리의 연산 또한 가능하죠.


차이점이 있다면, 리스트는 '[]'을 이용하여 선언하는 반면 튜플은 '()'을 이용해서 감싸줍니다.


1
2
3
4
tup1 = () # 빈 튜플 선언
tup2 = tuple() # 빈 튜플 선언
tup3 = (1,2,3# tup3 == (1,2,3)
tup4 = 1,2,3 # tup4 == (1,2,3)
cs


1. Immutable


튜플은 한번 정의되는 순간 그 요소를 변경하거나, 삭제하는것이 불가능해집니다.

이러한 특성을 영어로는 Immutable하다고 이야기합니다. Immutable한 자료형은 데이터의 오염이 적기 때문에 데이터 분석에서 원시데이터를 저장할 때 자주 쓰입니다.


그렇다면, 한번 테스트를 안해볼 수 없겠죠?


1
2
myTup = ('python',['anaconda','spyder'])
myTup[1= ['man']
cs


이 코드를 실행시키면 인터프리터는 에러를 출력할 것 입니다.


tuple 객체는 새로운 요소의 할당을 지원하지 않는다면서 TypeError가 출력되었습니다. 그러면 진짜로 tuple에서는 값을 전혀 못바꾸는게 확정이네요??  결론부터 말하자면 그렇지 않습니다.


우리는 리스트에서 배웠던 Shallow Copy를 떠올려보셔야 합니다. Shallow Copy는 레퍼런스를 그대로 가져오는 반면 Deep Copy는 값만 복사해 오기 때문에 실질적으로 같은 객체가 아닙니다. 즉 아래와 같은 식이 성립됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
origin = ('python', ['anaconda''spyder'])
clone = ('python', ['anaconda''spyder'])
 
# 값이 같기 때문에 True
origin == clone
 
# 같은 객체가 아니기 때문에 False
origin is clone
 
# Shallow Copy
clone = origin
 
# 같은 값, 같은 객체이기 때문에 True
origin == clone
origin is clone
cs


origin과 clone을 같은 값으로 설정하면 == 에서는 true를 보이지만 is 연산에서는 false를 보입니다. 둘의 레퍼런스 id가 다르기 때문입니다. 하지만 clone에 origin을 대입하면 레퍼런스를 그대로 가져오기 때문에 ==, is 둘 다에서 true를 보이죠? 이 방법을 이용하면 튜플안의 값을 변경할 수 있습니다.

파이썬에서 Immutable이라는것은 어디까지나 레퍼런스가 변경되지 않는다는 의미로만 동작합니다. 즉, 레퍼런스가 변하지 않으면 값이 변해도 상관이 없다는 의미겠죠?


그러면 바로 테스트 해보도록 하겠습니다.


1
2
3
4
5
6
myTup = ('python',['anaconda','spyder'])
myTup[1].append("pig")
print(myTup)
 
# 결과 값
# ('python', ['anaconda', 'spyder', 'pig'])
cs


myTup의 1번째 인덱스에 있는 리스트의 내용이 바뀐것을 확인할 수 있습니다. append는 레퍼런스가 변경되지 않는 대표적인 함수이기 때문에 레퍼런스를 유지 하면서 값을 바꿀 수 있었습니다.


하지만 위에서 처럼 myTup[1]에 = 연산자를 통해 값을 대입하려는 순간 레퍼런스가 변경되기 때문에 TypeError가 발생한 것입니다. 

'Dev > python' 카테고리의 다른 글

[python] 제어문(if, for, while) - 2  (0) 2019.03.23
[python] 제어문(if, for, while) - 1  (0) 2019.02.15
[python] 딕셔너리(dictionary)  (0) 2019.02.13
[python] 리스트 함수  (0) 2019.02.11
[python] 리스트와 Shallow Copy  (0) 2019.02.10

# 파이썬 딕셔너리



딕셔너리란 대응되는 데이터를 Key:Value 형식으로 저장할 수 있는 자료구조입니다. 타 언어에서는 연관배열이나 해시맵이라고 하죠?


딕셔너리는 리스트처럼 순차적으로 요소에 접근하는 시퀀스 자료형이 아닙니다. 반드시 Key를 통하여 Value값을 얻습니다. 예를 들어 language라는 KeyPython이라는 Value가 저장되어있을 경우 language를 통해 Python이라는 값을 얻을 수 있습니다.



1. 딕셔너리 선언


딕셔너리의 각 요소는 Key:Value 형태로 이루어져 있고 쉼표(",")로 데이터를 구분 짓습니다. 그리고 Key와 Value가 같은 자료형일 필요는 없습니다. Key가 문자열이고 Value가 숫자나 리스트나 딕셔너리여도 상관이 전혀 없습니다.

하지만 만약 중복되는 키를 입력시에는 데이터가 무시 되기 때문에 필수적으로 중복검사를 실시해야 합니다.


1
2
3
dic ={} # 빈 딕셔너리 선언
dic = dict() # 빈 딕셔너리 선언
dic = {"Key":"Value","number":1234#여러데이터 저장 가능
cs



2. 딕셔너리 값 추가 및 수정


딕셔너리의 값을 수정하기 위해서는 먼저 요소에 키를 통하여 접근할 필요가 있습니다. 만약 수정하려는 값의 key가 2일 경우에는 2로 접근하시면 됩니다.

값을 추가하고 싶은 경우에도 마찬가지입니다. 딕셔너리 이름이 dic일 경우에 dic["newKey"] 처럼 새로운 키를 설정해주고 값을 대입하면 됩니다. newKey라는 키는 제가 임의로 만든것이며 어떤 값이여도 상관없습니다. 


1
2
3
4
5
6
dic = {1:"a"}
dic[2= "b"
# dic == {1:"a",2:"b"}
 
dic[2= "c"
# dic == {1:"a",2:"c"}
cs



3. 딕셔너리 데이터 접근


리스트에서는 요소 값에 접근하기 위하여 인덱싱을 사용하였지만 딕셔너리는 인덱싱이아니라 Key이름을 기반으로 데이터에 접근합니다.


1
2
3
dic = {"apple":500,"banana":1000}
#dic["apple"] == 500
#dic["banana"] == 1000
cs



# 딕셔너리 내장함수



1. keys


딕셔너리 모든 Key를 객체로 리턴합니다. key만을 추출할 때 사용합니다.


1
2
3
4
dic = {"apple":500"banana":1000}
dic.keys()
 
#dict_keys(['apple', 'banana'])
cs



2. values


딕셔너리 모든 Value를 객체로 리턴합니다. Value만을 추출할 때 사용합니다.


1
2
3
4
dic = {"apple":500"banana":1000}
dic.values()
 
# dict_values([500, 1000])
cs


3. items


items 함수는 딕셔너리의 모든 데이터를 객체로 리턴합니다.


1
2
3
4
dic = {"apple":500"banana":1000}
dic.items()
 
# dict_items([('apple', 500), ('banana', 1000)])
cs


4. get


get함수는 키를 알고 있을 데 value를 추출할 때 사용합니다.


1
2
3
4
dic = {"apple":500"banana":1000}
dic.get("apple")
 
# 500
cs



'Dev > python' 카테고리의 다른 글

[python] 제어문(if, for, while) - 1  (0) 2019.02.15
[python] 튜플과 Immutable  (0) 2019.02.14
[python] 리스트 함수  (0) 2019.02.11
[python] 리스트와 Shallow Copy  (0) 2019.02.10
[python] 문자열 함수  (0) 2019.02.09

# 리스트 함수



일전 문자열 내장함수 강의를 보면 알 수 있듯이 리스트도 문자열과 마찬가지로 리스트뒤에 "."을 사용하여 내장함수를 사용할 수 있습니다.


1. append


append 함수는 리스트에 요소를 추가할 때 사용합니다. append에 의하여 추가된 요소는 리스트의 맨 뒤에 저장됩니다. 값이 존재하지 않는 빈리스트일 경우에도 마찬가지로 첫번째 인자부터 새로 생성됩니다. 


1
2
3
4
5
6
7
8
#!/usr/bin/python36
arr = [1,2,3]
arr.append(4)
 
print(arr)
 
#결과값
[1234]
cs



2. extend


append는 유용하지만 여러 원소를 한번에 집어 넣거나 리스트끼리 합치는것은 불가능 합니다. 이런 경우는 어떻게 해결할까요? 바로 extend를 사용하시면됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/python36
arr = [1,2,3]
arr.extend([3,4,5,6,7])
 
print(arr)
 
arr = [1,2,3]
arr = arr + [3,4,5,6,7]
 
print(arr)
#결과값
[12334567]
[12334567]
cs


extend함수는 사실 list의 더하기 연산과 크게 다르지 않습니다.  + 연산자가 편하신 분은 +를 사용하고 extend를 쓰고 싶은 분은 extend를 사용하면 됩니다.


참고 : https://stackoverflow.com/questions/3653298/concatenating-two-lists-difference-between-and-extend


3. reverse


리스트를 생성하고 인자의 순서를 반대로 뒤집고 싶을 경우에는 어떻게 하면 될까요? 해답은 바로 reverse 함수에 있습니다.


1
2
3
4
5
6
7
#!/usr/bin/python36
arr = [1,2,3]
arr.reverse()
print(arr)
 
#결과값
[3,2,1]
cs


4. sort


뒤집는 것도 좋지만, 리스트 안의 값을 정렬하고 싶을경우에는 어떻게 하냐고요? sort함수를 사용하시면 됩니다.

sort함수는 리스트를  정렬해주는 함수입니다. 기본적으로 오름차순으로 정렬해주며 reverse라는 인자의 값을 True로 바꿔주면 내림차순으로 정렬해줍니다.

추가적으로 sorted 함수는 arr의 값에 영향을 미치지 않으면서 바꿀 수 있는 내장함수입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/python36
arr = [5,2,7]
print(sorted(arr))
 
print(arr)
 
arr.sort()
print(arr)
 
arr.sort(reverse=True)
print(arr)
 
#결과값
[257#sorted
[527#arr
[257#sort
[752#sort-reverse
cs



5. remove


remove함수는 리스트에 존재하는 인자를 제거하는 함수입니다. 인자의 값이 중복되는 상황이면 인덱스가 낮은 수 먼저 제거합니다.


1
2
3
4
5
6
7
8
9
#!/usr/bin/python36
arr = [1,5,2,7,1]
arr.remove(1)
print(arr)
arr.remove(1)
print(arr)
#결과값
[5271]
[527]
cs


6. insert


위에서 append를 언급했을 때 분명히 맨앞에서 부터 추가하는 방법이 궁금하셨던 분들 계실겁니다. insert 함수는 인자로 인덱스와 값을 받아서 해당인덱스에 값을 추가하는 방식으로 구동됩니다.


1
2
3
4
5
6
7
8
9
10
#!/usr/bin/python36
arr = [1,5,2,7,1]
arr.insert(0,10)
print(arr)
arr.insert(100,10)
print(arr)
 
#결과값
[1015271]
[101527110]
cs

insert함수의 인덱스를 리스트의 길이보다 크게 주었을 경우에는 append와 똑같은 위치에 인자가 삽입됩니다. 그리고 인덱스 값으로 음수를 주면 뒤에서 부터 삽입이 가능합니다.



7. pop


자료구조를 구성할 때 단골손님처럼 쓰이는 함수, pop입니다.

pop는 기본적으로 맨뒤의 인자를 remove하면서 동시에 return하는데요 함수 인자값으로 인덱스를 넣는 것이 가능하여 원하는 위치의 값을 remove하면서 return하는 것이 가능합니다.


1
2
3
4
5
6
7
8
9
10
#!/usr/bin/python36
arr = [1,5,2,7,1]
print(arr.pop())
print(arr.pop(0))
print(arr)
 
#결과값
1
1
[527]
cs


'Dev > python' 카테고리의 다른 글

[python] 튜플과 Immutable  (0) 2019.02.14
[python] 딕셔너리(dictionary)  (0) 2019.02.13
[python] 리스트와 Shallow Copy  (0) 2019.02.10
[python] 문자열 함수  (0) 2019.02.09
[python] 문자열  (0) 2019.02.07

# 파이썬 리스트



리스트란 여러가지 데이터를 저장하는 자료구조입니다. 리스트를 이용하면 숫자나 문자열 등의 데이터를 다량의 변수를 선언하지 않고도 간단하게 표현할 수 있습니다.

무엇보다 Python에서의 리스트는 자료형에 구애받지 않고 자료형에 상관없이 한개의 리스트에 혼합하여 저장할 수 있는 장점이 있습니다.


1. 리스트의 생성 및 데이터 저장


1
2
3
4
5
6
arr1 = [1,2,3,4,5# ok
arr2 = ["a","b","c","d"# ok
arr3 = ["1",2,"3",4,"babo"# ok
arr4 = [1,2,[3,4,5,6]] # ok
arr5 = [] # 빈 리스트 생성
arr6 = list() # 빈 리스트 생성
cs



2. 인덱싱


리스트는 문자열과 같이 인덱싱을 적용하는것이 가능합니다. 리스트의 첫번째 요소를 0번 인덱스로 지정하고 마지막요소에 리스트의 크기-1 인덱스를 지정합니다.

- 참고 : 마지막 인덱스는 -1로 표현하고 1씩 감하여 이전 인덱스를 표현합니다.


1
2
3
4
5
arr = [1,2,3,4,5]
# a[0] == 1
# a[4] == 5
# a[-1] == 5
# a[-2] == 4
cs


만약, 리스트안에 다중으로 리스트가 들어있는 경우에는 인덱싱을 두번하여 중첩 리스트안에 있는 데이터에 접근할 수 있습니다.


1
2
3
arr = [1,2,[1,2,3]]
# arr[-1] == [1,2,3]
# arr[-1][-1] == [3]
cs



3. 슬라이싱


리스트는 문자열과 마찬가지로 인덱싱 뿐만아니라 슬라이싱 또한 가능합니다.  범위를 지정하여 시작 인덱스의 요소부터 마지막 인덱스의 요소로 구성된 리스트로 분할합니다.


1
2
3
arr=[1,2,3,4,5]
# arr[0:2] = [1,2]
# arr[2:] = [3,4,5]
cs


4. 리스트 요소 수정


리스트의 데이터를 변경하고 싶을 경우에는 해당 인덱스에 대입연산자를 사용하여 데이터를 삽입하면 됩니다.


1
2
3
arr = [1,2,3,4,5]
arr[0= 5
# arr == [5,4,3,2,5]
cs




# 객체의 복사


파이썬에서는 리스트도 객체에 해당하기 때문에 복사를 하게되면 바로보는 객체가 동일하기 때문에 두개의 리스트 중 하나만 변경해도 나머지 하나가 동일하게 수정되는 현상이 발생합니다.


1. shallow copy(얕은 복사)


1
2
3
4
5
6
7
8
9
10
11
= [1234]
= a
print(b)
b[2= 5
print(b)
print(a)
 
#결과값
[1234]
[1254]
[1254]
cs


a라는 변수를 선언하고 리스트를 만들어 a에 할당하면 a는 리스트객체의 주소가 저장된 변수가 됩니다.

그럼 a라는 변수의 값을 b라는 인자에 할당하였을 경우, b는 a와 같은 객체의 주소가 저장된 변수가 되는걸까요? 정답은 예,그렇습니다. b를 불러와 인덱스 2번의 값을 5로 변경하면, a에도 똑같이 적용되어 a의 값이 1,2,5,4가 되는 것을 위의 코드를 통하여 알 수 있습니다.



리스트는 값을 대입하면 값에 대한 메모리가 새로이 할당되는 것이 아닌 기존 값의 메모리 주소를 공유하기 때문에 발생하게 됩니다. 리스트 같은 경우 리스트 자체뿐만 아니라 리스트 내 요소들도 같은 주소를 공유하고 있습니다. 이를 Shallow Copy(얕은 복사)라고 부릅니다.



2. Deep Copy(깊은 복사)


이러한 현상을 방지하기 위해서는 Deep copy를 사용하여 복사하면 됩니다. 방법은 간단합니다. 기본라이브러리인 copy를 사용하는 방법이 있지만 더욱 간단한 사용을 위해 다른방법을 설명드리겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#1번 방법
= [1234]
= a[:]#리스트 슬라이싱
print(b)
b[2= 5
print(b)
print(a)
 
#2번 방법
= [1234]
= list(a)#리스트 내장함수사용
print(b)
b[2= 5
print(b)
print(a)
 
#결과값(1번과 2번 동일)
[1234]
[1254]
[1234]
cs


간단하게 리스트를 슬라이싱하여 대입하면 shallow copy가 일어나지 않습니다. 또 list 내장함수를 사용하면 Deep copy가 진행되어 리스트 복사문제를 해결 할 수 있습니다.

'Dev > python' 카테고리의 다른 글

[python] 딕셔너리(dictionary)  (0) 2019.02.13
[python] 리스트 함수  (0) 2019.02.11
[python] 문자열 함수  (0) 2019.02.09
[python] 문자열  (0) 2019.02.07
[python] 기본자료형 - 숫자  (0) 2019.02.07

# 파이썬 문자열 함수



안녕하세요 코드사기꾼입니다.

저번 강의에 이어서 오늘은 문자열 클래스의 함수에 관하여 알아보도록 하겠습니다.

문자열 클래스란, 따옴표로 감쌓여 있는 값을 의미하며 통상적으로 str이라고 표현합니다. python에서는 강력한 기능의 문자열 함수를 제공하고 있는데요 한번 그 것들에 관하여 알아보도록 하겠습니다.


1. 접근방법


문자열 클래스의 함수에 접근하기 위해서는 먼저 문자열 객체가 있어야겠죠? python은 모든 것을 객체로 인식하기 때문에 문자열 변수나 상수도 객체로 인식합니다. 객체 내부에 있는 함수에 접근하기 위해서는 점(.)을 사용하여 접근합니다.

즉, 객체 내부에있는 함수나 변수에 대한 접근은 객체.함수, 객체.변수로 표현됩니다.


예를 들어 python이라는 클래스에 short이라는 함수가 있다면 이와같이 접근할 수 있습니다.


1
2
myClass = python() # python클래스 객체의 선언
myClass.short() # 객체 내부의 함수에  
cs

 

class를 만들어 놓았으면 먼저 그 클래스를 담는 객체를 선언을 해야겠죠? 그것을 myClass라는 임의의 이름을 가진 변수에 할당합니다. 이렇게 되면 myClass는 python의 인스턴스이니 내부에 있는 변수나 함수에 접근하는 것이 가능해지겠죠? 그래서 myClass.short()라는 구문이 성립하게 되는 것입니다.


문자열클래스도 똑같습니다. 문자열.함수이름 으로 접근하시면 됩니다. 실제 코드를 보면서 이해를 해보도록 하죠.


1
2
3
4
5
6
7
8
9
10
11
myStr = "I love python" # 문자열 선언
 
print(myStr.upper()) # 문자열 클래스의 upper 메소드 사용
 
print("I love python".upper()) # 문자열 클래스의 upper 메소드 사용
 
 
#결과값
 
I LOVE PYTHON
I LOVE PYTHON
cs


1번 라인에 I love python이라는 문자열 변수 myStr을 선언하였습니다. 그렇다면 myStr은 문자열 클래스의 인스턴스나 다름없겠죠? 그렇기 때문에 upper라는 문자열 클래스의 메소드를 사용할 수 있는 것 입니다.(upper는 소문자를 대문자로 변경해주는 메소드입니다.)


5번라인에 보면 I love python을 변수에 할당하지않고 그냥 .upper를 붙여서 사용했는데요, 이 방법 또한 사용 가능합니다. 결과는 보시는 것과 같이 I LOVE PYTHON으로 동일합니다.




# 문자열 함수의 종류


python에는 강력한 성능의 문자열 함수가 다수 포함되어 있습니다. 그것들에 관하여 한번 알아보도록 하죠.


1. find


find 함수는 검색문자나 문자열이 처음나온 위치를 반환하는 함수입니다. 만약 검색한 대상이 문자열에 존재하지 않을 경우 -1을 리턴합니다.


1
2
3
4
5
6
7
8
9
10
"abc".find("a")
"abc".find("ab")
"abc".find("bc")
"abc".find("d")
 
# 결과값
0
0
1
-1
cs



2. join


join 함수는 인자로 받은 문자열으 각 문자사이에 문자열을 삽입하는 함수입니다. 예를 들어 Rekt라는 문자열에 /을 삽입하면 R/e/k/t가 되는 것이죠.


1
2
3
4
"/".join("Rekt")
 
# 결과값
"R/e/k/t"
cs



3. upper & lower


upper는 소문자를 대문자로 변경해주는 함수이며 lower는 대문자를 소문자로 변환합니다.


1
2
3
4
5
6
7
"life is short you need python".upper()
"LIFE IS SHORT YOU NEED PYTHON".lower()
 
# 결과값
 
"LIFE IS SHORT YOU NEED PYTHON"
"life is short you need python"
cs



4. replace


기존 문자열을 원하는 새 문자열로 치환해주는 함수입니다. 문자열에서 일괄적으로 수정할 내용이 있을 경우에 유용하게 사용됩니다.


1
2
3
4
5
"my name is rekt77".replace("rekt77","python")
 
# 결과값
 
"my name is python"
cs



5. split


구분자를 기준으로 문자열을 나눠 리스트로 반환하는 함수입니다. 여기서 리스트라는 것은 python에서 배열같은 자료구조입니다.

제가 생각하기에 가장 많이 쓰는 문자열함수 top 3 에 들어갈것 같습니다. 정말 기능자체가 너무 강력합니다.


1
2
3
4
5
6
"hello python".split()
"010-7607-4401".split("-")
 
# 결과값
["hello","python"]
["010","7607","4401"]
cs


1번 라인에는 아무인자를 넣어주지 않았는데 공백을 기준으로 문자열이 잘린 것을 볼 수 있습니다. 그 이유는 split의 기본 인자가 공백이기 때문입니다. 따라서 공백을 기준으로 나눌 때에는 아무 것도 넣어주시지 않으셔도 무방합니다.



6. count


count함수는 인자로 입력받은 문자열이 문자열내에 몇번 출현하는지 숫자로 반환해주는 함수입니다. 예를 들어 어떤 기사에서 아이언맨이란 단어가 몇 번 출현하였는지 궁금할때에는 기사.count("아이언맨") 하시면 되겠죠? 


1
2
3
4
5
6
7
8
9
10
article = """
The US Military Is Chopping Up Its Iron Man Suit For Parts
It’s no wonder Stan Lee had to invent a power-source that defied
the laws of physics to make Iron Man feasible even as a comic-book.
"""
 
article.count("Iron Man")
 
# 결과값
2
cs


7. startswith


startswith 함수는 어떤 문자열이 특정 단어로 시작하는지 체크할 때 쓰이는 함수입니다. 예를 들어 a로 시작하는 단어만을 검사하고 싶을 때가 있죠? 이런 경우에 사용하면 굉장히 유용한 함수입니다. 결과값은 참/거짓으로 리턴됩니다.


1
2
3
4
"apple".startswith("a")
 
# 결과값
True
cs


'Dev > python' 카테고리의 다른 글

[python] 리스트 함수  (0) 2019.02.11
[python] 리스트와 Shallow Copy  (0) 2019.02.10
[python] 문자열  (0) 2019.02.07
[python] 기본자료형 - 숫자  (0) 2019.02.07
[python] 파이썬 설치하기  (0) 2019.02.07

+ Recent posts