How We Coding

동영상 강의 : http://pythonkim.tistory.com/notice/77


Day_02_03_kma.py


- import requests 에서 requests 는 외부 모듈.


- PyCharm 에서 외부 모듈 추가하기.


>>  preferences (Mac) - Project - Project Interpreter - "+ 버튼" 클릭 - "requests" 검색 - Install Package 


1
2
3
4
5
6
import requests
import re
 
url = 'http://www.naver.com'
recvd = requests.get(url)
print(recvd)    # <Response [200]>
cs



>> www.naver.com 으로부터 데이터를 성공적으로 가져온 상태. (200)



1
print(recvd.text)
cs


>> Chrome 에서 페이지 소스보기 통해 확인할 수 있는 html 소스가 출력된다.



### 기상청의 전국 날씨정보 파싱


http://www.kma.go.kr/index.jsp 에서 날씨누리 바로가기 - 생활과 산업 - 서비스 - RSS 로 이동




 RSS란?


 RSS(Really Simple Syndication, Rich Site Summary)란 블로그처럼 컨텐츠 업데이트가   

 자주 일어나는 웹사이트에서, 업데이트된 정보를 쉽게 구독자들에게 제공하기 위해 XML을 

 기초로 만들어진 데이터 형식입니다. RSS서비스를 이용하면 업데이트된 정보를 찾기 위해 

 홈페이지에 일일이 방문하지 않아도 업데이트 될 때마다 빠르고 편리하게 확인할 수 

 있습니다. 





- 전국의 중기예보 RSS 클릭 후 URL 클립보드에 복사.


1
2
3
4
url = 'http://www.weather.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=108'
recvd = requests.get(url)
print(recvd)    # <Response [200]>
print(recvd.text)
cs


>> 크롤링 이라고 한다. (python 이 편리한 이유)



-


This XML file does not appear to have any style information associated with it. The document tree is shown below.


>> html 은 style 정보가 포함되어 있다.

>> xml 은 순수하게 데이터만 들어가있다.

>> 데이터 전송 포맷의 두가지 (xml, json)


http://www.weather.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=108 에서 날씨 데이터 찾아보기.


>> <item> - <description> - <body> 안에서 확인가능


>> xml 이든 html 이든 여는태그가 있으면 닫는태그가 있다...!!


1
2
3
4
5
6
url = 'http://www.weather.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=108'
recvd = requests.get(url)
 
tmp = re.findall(r'<province>서울ㆍ인천ㆍ경기도</province>', recvd.text)
print(tmp)  # ['<province>서울ㆍ인천ㆍ경기도</province>', '<province>서울ㆍ인천ㆍ경기도</province>', '<province>서울ㆍ인천ㆍ경기도</province>', '<province>서울ㆍ인천ㆍ경기도</province>']
print(len(tmp)) # 4
cs



- 모든 <province> 태그 가져오기 (정규표현식 이용)


1
2
3
prov = re.findall(r'<province>.+</province>', recvd.text)
print(prov) # ['<province>서울ㆍ인천ㆍ경기도</province>', '<province>서울ㆍ인천ㆍ경기도</province>', '<province>서울ㆍ인천ㆍ경기도</province>', '<province>서울ㆍ인천ㆍ경기도</province>', '<province>강원도영서</province>', '<province>강원도영서</province>', '<province>강원도영동</province>', '<province>대전ㆍ세종ㆍ충청남도</province>', '<province>대전ㆍ세종ㆍ충청남도</province>', '<province>대전ㆍ세종ㆍ충청남도</province>', '<province>충청북도</province>', '<province>광주ㆍ전라남도</province>', '<province>광주ㆍ전라남도</province>', '<province>광주ㆍ전라남도</province>', '<province>전라북도</province>', '<province>전라북도</province>', '<province>부산ㆍ울산ㆍ경상남도</province>', '<province>부산ㆍ울산ㆍ경상남도</province>', '<province>부산ㆍ울산ㆍ경상남도</province>', '<province>대구ㆍ경상북도</province>', '<province>대구ㆍ경상북도</province>', '<province>대구ㆍ경상북도</province>', '<province>제주도</province>', '<province>제주도</province>']
print(len(prov))    # 24
cs



>> <province>.+</province> 패턴은 

     <province> 로 시작하고 하나 이상의 문자가 있고, </province> 로 끝나는 패턴



# 문제

# 전체 location 가져오기


- 상위 데이터를 가져온 다음, 하위 데이터를 분리하는 방식으로 진행해야 한다.!!

- 태그를 타이핑 하지 말고 긁어오쟈 (블럭지정 후 복붙)


1
2
location = re.findall(r'<location wl_ver="3">.+</location>', recvd.text)
print(len(location))
cs


>> 실행 결과는 0 이다.

>> 위의 예제의 경우 여는 태그와 닫는 태그 사이에 한줄에 하나의 데이터만 있지만, 이 예제의 경우 데이터가 여러줄에 걸쳐서 존재한다.

>> 옵션을 추가해서 해결할 수 있다.


1
2
location = re.findall(r'<location wl_ver="3">.+</location>', recvd.text, re.DOTALL)
print(len(location))
cs


>> re.DOTALL 옵션 추가. 내가 찾고자 하는 패턴이 여러줄에 걸쳐있을 때 사용. 

>> 정확히는 개행 문자를 무시해준다.

>> 하지만 실행결과는 1.

>> 가장 짧은 패턴과, 가장 긴 패턴 중 가장 긴 패턴을 디폴트로 찾는다. (Greedy 방식)



>> 데이터가 위와 같이 있는 경우, 첫번째 한줄이 가장 짧은 패턴, 모든 줄을 포함 시킨 것이 가장 긴 패턴이 된다.



- non-greedy 방식으로 하려면 '?' 하나를 추가하면 된다.


1
2
locations = re.findall(r'<location wl_ver="3">.+?</location>', recvd.text, re.DOTALL)
print(len(locations))
cs


>> .+? 라고 적음. ? 는 작은 녀석을 먼저 찾았을 때 멈추게 한다.

>> 실행결과는 24


- 이젠 24개의 데이터에서 원하는 데이터를 다시 또 찾으면 된다.


1
2
3
def printLoc():
    for loc in locations:
        print(loc)
cs


>> 24개의 location 확인 가능



# 문제

# province 를 찾아서 출력 


1
2
3
4
def printProvince():
    for loc in locations:
        prov = re.findall(r'<province>.+</province>', loc)
        print(prov)
cs


>> 24 개의 <province> 데이터를 출력한다.

>> 한줄안에 있으므로 re.DOTALL 없어도 된다.


>> 실행결과


['<province>서울ㆍ인천ㆍ경기도</province>']

['<province>서울ㆍ인천ㆍ경기도</province>']

['<province>서울ㆍ인천ㆍ경기도</province>']

['<province>서울ㆍ인천ㆍ경기도</province>']

['<province>강원도영서</province>']

['<province>강원도영서</province>']

['<province>강원도영동</province>']

['<province>대전ㆍ세종ㆍ충청남도</province>']

['<province>대전ㆍ세종ㆍ충청남도</province>']

['<province>대전ㆍ세종ㆍ충청남도</province>']

['<province>충청북도</province>']

['<province>광주ㆍ전라남도</province>']

['<province>광주ㆍ전라남도</province>']

['<province>광주ㆍ전라남도</province>']

['<province>전라북도</province>']

['<province>전라북도</province>']

['<province>부산ㆍ울산ㆍ경상남도</province>']

['<province>부산ㆍ울산ㆍ경상남도</province>']

['<province>부산ㆍ울산ㆍ경상남도</province>']

['<province>대구ㆍ경상북도</province>']

['<province>대구ㆍ경상북도</province>']

['<province>대구ㆍ경상북도</province>']

['<province>제주도</province>']

['<province>제주도</province>']



>> 여기서 우리가 필요한 것은 <province> 태그 안의 데이터이므로 , 태그 이름까지는 없어도 된다..!!


1
2
3
4
def printProvinceData():
    for loc in locations:
        prov = re.findall(r'<province>(.+)</province>', loc)
        print(prov)
cs


>> 괄호를 치면 된다.!!

>> 실행결과 


['서울ㆍ인천ㆍ경기도']

['서울ㆍ인천ㆍ경기도']

['서울ㆍ인천ㆍ경기도']

['서울ㆍ인천ㆍ경기도']

['강원도영서']

['강원도영서']

['강원도영동']

['대전ㆍ세종ㆍ충청남도']

['대전ㆍ세종ㆍ충청남도']

['대전ㆍ세종ㆍ충청남도']

['충청북도']

['광주ㆍ전라남도']

['광주ㆍ전라남도']

['광주ㆍ전라남도']

['전라북도']

['전라북도']

['부산ㆍ울산ㆍ경상남도']

['부산ㆍ울산ㆍ경상남도']

['부산ㆍ울산ㆍ경상남도']

['대구ㆍ경상북도']

['대구ㆍ경상북도']

['대구ㆍ경상북도']

['제주도']

['제주도']




# Data 찾기


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
32
33
34
# Data 찾기
 
def findData():
    for loc in locations:
        prov = re.findall(r'<province>(.+)</province>', loc)
        city = re.findall(r'<city>(.+)</city>', loc)
        data = re.findall(r'<data>(.+)</data>', loc, re.DOTALL)
 
        #print(prov[0], prov)
        #print(city[0])
        # print(data)
        # print(len(data))    # 1
 
        for datum in data:
            # print(datum)
 
            # 문제
            # mode 를 비롯한 나머지를 찾아보기
            mode = re.findall(r'<mode>(.+?)</mode>', datum)
            tmEf = re.findall(r'<tmEf>(.+?)</tmEf>', datum)
            wf   = re.findall(r'<wf>(.+?)</wf>', datum)
            tmn  = re.findall(r'<tmn>(.+?)</tmn>', datum)
            tmx  = re.findall(r'<tmx>(.+?)</tmx>', datum)
            reli = re.findall(r'<reliability>(.+?)</reliability>', datum)
            # print(prov[0], city[0], mode[0], tmEf[0], wf[0], tmn[0], tmx[0], reli[0])
 
            row = '{}, {}, {}, {}, {}, {}, {}, {}'.format(prov[0], city[0], mode[0], tmEf[0], wf[0], tmn[0], tmx[0], reli[0])
            print(row)
 
 
findData()
 
 
 
cs


>> datum 하나의 출력 결과


<data>

<mode>A01</mode>

<tmEf>2018-03-02 00:00</tmEf>

<wf>구름많음</wf>

<tmn>6</tmn>

<tmx>13</tmx>

<reliability>보통</reliability>

</data>



>> 25 : print(prov[0], city[0], mode[0], tmEf[0], wf[0], tmn[0], tmx[0], reli[0]) 의 결과


서울ㆍ인천ㆍ경기도 서울 A02 2018-02-24 00:00 구름조금 -2 7 높음

서울ㆍ인천ㆍ경기도 인천 A02 2018-02-24 00:00 구름조금 -2 5 높음

서울ㆍ인천ㆍ경기도 수원 A02 2018-02-24 00:00 구름조금 -3 7 높음

서울ㆍ인천ㆍ경기도 파주 A02 2018-02-24 00:00 구름조금 -7 6 높음

강원도영서 춘천 A02 2018-02-24 00:00 구름조금 -5 6 보통

강원도영서 원주 A02 2018-02-24 00:00 구름조금 -4 6 보통

강원도영동 강릉 A02 2018-02-24 00:00 구름조금 -1 7 보통

대전ㆍ세종ㆍ충청남도 대전 A02 2018-02-24 00:00 구름조금 -4 8 보통

대전ㆍ세종ㆍ충청남도 세종 A02 2018-02-24 00:00 구름조금 -5 7 보통

대전ㆍ세종ㆍ충청남도 홍성 A02 2018-02-24 00:00 구름조금 -4 7 보통

충청북도 청주 A02 2018-02-24 00:00 구름조금 -3 8 보통

광주ㆍ전라남도 광주 A02 2018-02-24 00:00 구름조금 0 12 보통

광주ㆍ전라남도 목포 A02 2018-02-24 00:00 구름조금 1 10 보통

광주ㆍ전라남도 여수 A02 2018-02-24 00:00 구름조금 3 12 보통

전라북도 전주 A02 2018-02-24 00:00 구름조금 -2 9 보통

전라북도 군산 A02 2018-02-24 00:00 구름조금 -3 7 보통

부산ㆍ울산ㆍ경상남도 부산 A02 2018-02-24 00:00 구름조금 3 12 보통

부산ㆍ울산ㆍ경상남도 울산 A02 2018-02-24 00:00 구름조금 0 11 보통

부산ㆍ울산ㆍ경상남도 창원 A02 2018-02-24 00:00 구름조금 1 12 보통

대구ㆍ경상북도 대구 A02 2018-02-24 00:00 구름조금 -1 12 보통

대구ㆍ경상북도 안동 A02 2018-02-24 00:00 구름조금 -3 10 보통

대구ㆍ경상북도 포항 A02 2018-02-24 00:00 구름조금 1 11 보통

제주도 제주 A02 2018-02-24 00:00 구름조금 5 12 보통

제주도 서귀포 A02 2018-02-24 00:00 구름조금 7 13 보통



>> 27 : 데이터를 재사용하기 위해 row 및 문자열 포맷 사용.

>> 데이터와 데이터 사이에 콤마로 구분. comma separated // CSV 



- 이런식으로도 할 수 있다.


1
2
items = re.findall(r'<mode>(.+?)</mode>.+<tmEf>(.+?)</tmEf>.+<wf>(.+?)</wf>', datum, re.DOTALL)
print(items)
cs


>> 태그와 태그 사이에 .+ 추가. re.DOTALL 옵션 추가.

>> 실행결과 (리스트 안의 튜플로 된 구조이다.)


[('A02', '2018-03-03 00:00', '구름조금')]

[('A02', '2018-03-03 00:00', '구름조금')]

[('A02', '2018-03-03 00:00', '구름조금')]

[('A02', '2018-03-03 00:00', '구름조금')]

[('A02', '2018-03-03 00:00', '구름조금')]

[('A02', '2018-03-03 00:00', '구름조금')]

[('A02', '2018-03-03 00:00', '구름조금')]

[('A02', '2018-03-03 00:00', '구름조금')]

[('A02', '2018-03-03 00:00', '구름조금')]

[('A02', '2018-03-03 00:00', '구름조금')]

[('A02', '2018-03-03 00:00', '구름조금')]

[('A02', '2018-03-03 00:00', '구름조금')]

[('A02', '2018-03-03 00:00', '구름조금')]

[('A02', '2018-03-03 00:00', '구름조금')]

[('A02', '2018-03-03 00:00', '구름조금')]

[('A02', '2018-03-03 00:00', '구름조금')]

[('A02', '2018-03-03 00:00', '구름조금')]

[('A02', '2018-03-03 00:00', '구름조금')]

[('A02', '2018-03-03 00:00', '구름조금')]

[('A02', '2018-03-03 00:00', '구름조금')]

[('A02', '2018-03-03 00:00', '구름조금')]

[('A02', '2018-03-03 00:00', '구름조금')]

[('A02', '2018-03-03 00:00', '구름많음')]

[('A02', '2018-03-03 00:00', '구름많음')]


-  

1
2
= items[0]
print(t[0], t[1], t[2])
cs


>> item 은 리스트

>> items[0] 은 튜플





1
2
3
4
5
6
7
8
def findLoc():
    for loc in locations:
        items = re.findall(r'<mode>(.+?)</mode>.+?<tmEf>(.+?)</tmEf>.+?<wf>(.+?)</wf>', loc, re.DOTALL)
        print(items)
        print(len(items))
 
 
findLoc()
cs


>> 태그와 태그 사이 .+ 가 아닌 .+? 이다!!

>> 실행결과의 일부


[('A02', '2018-02-24 00:00', '구름조금'), ('A02', '2018-02-24 12:00', '구름많음'), ('A02', '2018-02-25 00:00', '구름많음'), ('A02', '2018-02-25 12:00', '구름많음'), ('A02', '2018-02-26 00:00', '구름조금'), ('A02', '2018-02-26 12:00', '구름조금'), ('A02', '2018-02-27 00:00', '구름많음'), ('A02', '2018-02-27 12:00', '구름많음'), ('A02', '2018-02-28 00:00', '구름많음'), ('A02', '2018-02-28 12:00', '구름많음'), ('A01', '2018-03-01 00:00', '구름조금'), ('A01', '2018-03-02 00:00', '구름조금'), ('A01', '2018-03-03 00:00', '구름조금')]

13

[('A02', '2018-02-24 00:00', '구름조금'), ('A02', '2018-02-24 12:00', '구름많음'), ('A02', '2018-02-25 00:00', '구름많음'), ('A02', '2018-02-25 12:00', '구름많음'), ('A02', '2018-02-26 00:00', '구름조금'), ('A02', '2018-02-26 12:00', '구름조금'), ('A02', '2018-02-27 00:00', '구름많음'), ('A02', '2018-02-27 12:00', '구름많음'), ('A02', '2018-02-28 00:00', '구름많음'), ('A02', '2018-02-28 12:00', '구름많음'), ('A01', '2018-03-01 00:00', '구름조금'), ('A01', '2018-03-02 00:00', '구름조금'), ('A01', '2018-03-03 00:00', '구름조금')]

13

[('A02', '2018-02-24 00:00', '구름조금'), ('A02', '2018-02-24 12:00', '구름많음'), ('A02', '2018-02-25 00:00', '구름많음'), ('A02', '2018-02-25 12:00', '구름많음'), ('A02', '2018-02-26 00:00', '구름조금'), ('A02', '2018-02-26 12:00', '구름조금'), ('A02', '2018-02-27 00:00', '구름많음'), ('A02', '2018-02-27 12:00', '구름많음'), ('A02', '2018-02-28 00:00', '구름많음'), ('A02', '2018-02-28 12:00', '구름많음'), ('A01', '2018-03-01 00:00', '구름조금'), ('A01', '2018-03-02 00:00', '구름조금'), ('A01', '2018-03-03 00:00', '구름조금')]

13

[('A02', '2018-02-24 00:00', '구름조금'), ('A02', '2018-02-24 12:00', '구름많음'), ('A02', '2018-02-25 00:00', '구름많음'), ('A02', '2018-02-25 12:00', '구름많음'), ('A02', '2018-02-26 00:00', '구름조금'), ('A02', '2018-02-26 12:00', '구름조금'), ('A02', '2018-02-27 00:00', '구름많음'), ('A02', '2018-02-27 12:00', '구름많음'), ('A02', '2018-02-28 00:00', '구름많음'), ('A02', '2018-02-28 12:00', '구름많음'), ('A01', '2018-03-01 00:00', '구름조금'), ('A01', '2018-03-02 00:00', '구름조금'), ('A01', '2018-03-03 00:00', '구름조금')]

13

[('A02', '2018-02-24 00:00', '구름조금'), ('A02', '2018-02-24 12:00', '구름많음'), ('A02', '2018-02-25 00:00', '구름많음'), ('A02', '2018-02-25 12:00', '구름많음'), ('A02', '2018-02-26 00:00', '구름조금'), ('A02', '2018-02-26 12:00', '구름조금'), ('A02', '2018-02-27 00:00', '구름많음'), ('A02', '2018-02-27 12:00', '구름많음'), ('A02', '2018-02-28 00:00', '구름많음'), ('A02', '2018-02-28 12:00', '구름많음'), ('A01', '2018-03-01 00:00', '구름조금'), ('A01', '2018-03-02 00:00', '구름조금'), ('A01', '2018-03-03 00:00', '구름조금')]

13



1
2
3
4
5
6
7
8
9
10
11
def findLoc():
    for loc in locations:
        items = re.findall(r'<mode>(.+?)</mode>.+?<tmEf>(.+?)</tmEf>.+?<wf>(.+?)</wf>', loc, re.DOTALL)
        # print(items)
        # print(len(items))
 
        for item in items:
            print(item)
 
 
findLoc()
cs


>> 실행결과의 일부


('A02', '2018-02-28 12:00', '구름많고 비')

('A01', '2018-03-01 00:00', '구름많음')

('A01', '2018-03-02 00:00', '구름많음')

('A01', '2018-03-03 00:00', '구름많음')



1
2
for mode, tmEf, wf in items:
    print(mode, tmEf, wf)
cs


>> 이런식으로도 가능하다.



1
2
3
4
5
6
7
8
9
def findLoc2():
    for loc in locations:
        items = re.findall(r'<mode>(.+?)<.+?>.+?<.+?>(.+?)<.+?>.+?<.+?>(.+?)<.+?>', loc, re.DOTALL)
 
        for mode, tmEf, wf in items:
            print(mode, tmEf, wf)
 
 
findLoc2()
cs


>> 이런식으로도 가능하다.

>> 맨 앞에 <mode> 를 남긴 이유는 그 상위 데이터가 더 존재하므로...




'Language > Python' 카테고리의 다른 글

<3-2> Set 과 Dictionary  (0) 2018.03.02
<3-1> 파일 입출력  (0) 2018.02.23
<2-2> 리스트, 튜플  (0) 2018.02.15
<2-1> 제어문과 반복문의 연결고리  (0) 2018.02.06
<1-7> 정규표현식 with Python  (0) 2018.02.03



# Day_02_02_list.py


- Collection 

[] : list

() : tuple

{} : set/dictionary

<> : not used



- list


1
2
3
4
5
6
= [135]
print(a)    # [1, 3, 5]
print(a[0], a[1], a[2])     # 1 3 5
 
a[0= 99
print(a)    # [99, 3, 5]
cs


>> 1 : list 의 선언

>> python 에서는 array 가 없다고 함.

>> 3 : 인덱스를 통한 접근

>> 5 : 값의 변경



- 반복문을 통한 접근


1
2
for i in range(len(a)):
    print(a[i])
cs


>> len(a) : list 의 갯수를 리턴해준다.



- 문제

- 100 보다 작은 난수 10개로 이루어진 리스트를  반환하는 함수 만들기


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def makeRandom1():
    a = [0000000000]
    for i in range(10):
        a[i] = random.range(100)
    return a
 
 
def makeRandom2():
    a = [0]*10
    for i in range(10):
        a[i] = random.range(100)
    return a
 
 
def makeRandom3():
    a = []
    for i in range(10):
        a.append(random.randrange(100))
    return a
cs


>> makeRandom3() 에서 처럼 append() 를 많이 쓴다고 한다.

>> 하지만 느리다고 한다.

>> append() 는 리스트의 맨 뒤에 내용을 추가.



- 문제

- 리스트를 거꾸로 뒤집는 함수 만들기


1
2
3
4
5
def reverseList(c):
    size = len(c)
    for i in range(size//2):
       c[i], c[size-1-i] = c[size-1-i], c[i]
    return c
cs




1
2
for i in a:
    print(i, end=' ')
cs


>> 여기서 a는 리스트

>> i는 인덱스가 아닌, 리스트의 각 요소



- range() 와 리스트의 타입


1
2
3
print(type(range(5)), type(a))  
 
# <class 'range'> <class 'list'>
cs


>> range, list 는 utterable 객체



- reversed(obj)


1
2
3
4
5
6
7
8
9
for i in a:
    print(i, end=' ')
print()
# 37 67 44 50 25 65 15 66 5 86 
 
for i in reversed(a):
    print(i, end=' ')
print()
# 86 5 66 15 65 25 50 44 67 37
cs


>> list 가 뒤집어진 상태로 진행이 된다.


1
2
3
4
for i in reversed(range(len(a))):
    print(a[i], end=' ')
print()
# 86 5 66 15 65 25 50 44 67 37 
cs


>> 이런식으로도 가능하다.



- enumerate()


1
2
3
4
for i in enumerate(a):
    print(i, end=' ')
print()
# (0, 37) (1, 67) (2, 44) (3, 50) (4, 25) (5, 65) (6, 15) (7, 66) (8, 5) (9, 86) 
cs


>> i는 (index, value) 의 형태를 갖는다. 데이터 타입은 튜플..!!

>> 특정 데이터가 몇번째 데이터인지 알고 싶을 때 enumerate() 을 사용


1
2
3
4
for i in enumerate(a):
    print(i[0], i[1], end=' ')
print()
# 0 37 1 67 2 44 3 50 4 25 5 65 6 15 7 66 8 5 9 86 
cs


>> 괄호를 없애고 싶을 땐 인덱스를 활용한다.



- 튜플(tuple)은 리스트의 상수버전...

- 리스트와 사용방법이 동일하다. 다만, 내용을 바꿀수 없을 뿐..!!


1
2
3
= (123)
t[0= 99
# TypeError: 'tuple' object does not support item assignment
cs

 

>> 튜플은 보통 파이썬이 사용한다.

>> 매개변수를 전달하거나, 반환값을 전달할 때.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def sumOfOddEven():
    odd, even = 00
    for i in range(1100):
        if i%2 == 1: odd  += i
        else :       even += i
 
    return odd, even
 
 
s1, s2 = sumOfOddEven()
print(s1, s2)       # 2500 2450
 
= sumOfOddEven()
print(s)            # (2500, 2450)
print(type(s))      # <class 'tuple'>
cs


>> 13 : s 의 타입은 튜플이다.


1
2
3
= 12
print(t)            # (1, 2)
print(type(t))      # <class 'tuple'>
cs



- 그래서 enumerate() 이런식으로 사용한다.


1
2
3
for i, k in enumerate(a):
    print(i, k, end=' ')
print()
cs




- list 로 강제 캐스팅하기


1
2
= list(range(0102))
print(a)    # [0, 2, 4, 6, 8]
cs



- 레퍼런스

 

1
2
3
4
5
6
7
= list(range(0102))
print(a)    # [0, 2, 4, 6, 8]
 
= a;
a[0= 99
print(a)    # [99, 2, 4, 6, 8]
print(b)    # [99, 2, 4, 6, 8]
cs


>> 6 번 라인의 결과는 명확하다.

>> 7 번 라인의 결과는..???

    레퍼런스 개념으로 a와 b는 같은 리스트를 가리킨다..!!

>> 4 번 라인을 얕은복사 라고 한다. (shallow copy)

>> 데이터가 같이 바뀌므로 주의해야한다.



- 데이터의 복사 (깊은복사)


1
2
3
4
5
6
7
= list(range(0102))
print(a)    # [0, 2, 4, 6, 8]
 
= a.copy();
a[0= 99
print(a)    # [99, 2, 4, 6, 8]
print(c)    # [0, 2, 4, 6, 8]
cs


>> copy() 를 사용한다.



- 음수 인덱스


1
2
3
= list(range(0102))
print(a)    # [0, 2, 4, 6, 8]
print(a[0], a[-1])      # 0 8
cs


>>  파이썬은 음수 인덱스를 지원한다. -1은 마지막 값, -2은 뒤에서 두번째 값

- C언어에서는 다른 함수에있는 변수에 접근하기 위해 포인터를 사용했다.

- C++ 에서는 레퍼런스 라는 것을 통해 가능하다.



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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <cstdio>
 
typedef struct arr100 {
    int arr[100];
} Arr100;
 
void c_Swap(int *a, int *b)
{
    int t = *a;
    *= *b;
    *= t;
}
 
void ref_Swap(int &a, int &b)
{
    int t = a;
    a = b;
    b = t;
}
 
int sum(Arr100 &t) // Decreasing memory overhead.
{
    int Sum=0;
    for(int i=0; i<100; i++)
        Sum += t.arr[i];
    return Sum;
}
 
int main()
{
    int x = 3;
    int y = 5;
 
    // int &ref; => impossible
    // &ref = x; => impossible
    int &ref = x; 
    printf("%d %d\n", x, ref);      // 3 3
    printf("%p %p\n"&x, &ref);    // 0x7ffee122ca68 0x7ffee122ca68
 
    c_Swap(&x, &y);
    printf("%d %d\n", x, y);        // 5 3
 
    ref_Swap(x, y);
    printf("%d %d\n", x, y);        // 3 5
 
        
    Arr100 A;
    for(int i=0; i<100; i++)
        A.arr[i] = 100-i;
 
    int Sum = sum(A); 
    printf("%d\n", Sum);        // 5050
 
    return 0;
}
 
cs


>> 34 : 선언과 동시에 초기화가 필요하다.

>> 35 : 한번 가리킨 대상을 바꿀 수 없다.

>> 36 : 레퍼런스의 선언. 변수이름 앞에 &를 붙인다. 

     자료형 &변수명 = 참조할 변수명; 의 형태를 가진다.

>> 37 : x와 x를 reference 로 하는 ref 는 같은 값을 갖는다.

>> 38 : 역시 같은 주소를 갖는다. 즉 어떤 변수에 새로운 이름을 부여한다고 생각하면 된ㄷ

>> 40 : c 언어에서의 swap 함수이다. 포인터를 사용

>> 43 : 레퍼런스를 이용한 swap 으로, 매개변수를 전달할 때 주소를 전달하지 않으며,

            14 라인에서 보듯이 매개변수를 참조형으로 선언해서 전달받는다.

>> 51, 21 :  이렇게 참조형으로 매개변수를 전달 받으면, 메모리 오버헤드를 줄일 수 있다. 

  매개변수도 일종의 지역변수 이므로 그만큼의 메모리를 차지하지만, 참조형으로 전달 

  받으면 그렇지 않다. 재귀함수에서 변하지 않는 객체를 넘길 경우에서 유용하다.



- 그 외 상수값으로 초기화 할 수 없다. 바인딩을 할 수 없다는 컴파일 에러 발생


1
int &refConstant = 10;
cs


error: non-const lvalue reference to type 'int' cannot bind to a temporary of type 'int'

    int &refConstant = 10;



- 그 외 레퍼런스로 이루어진 배열을 만들 수 없다고 한다.



- 기본적인 내용은 이정도 이며, 나중에 참조형이 참 재미있는(?) 기능임을 알게 될 것이다. 

  (함수의 리턴형이 참조형인 경우)



- 또한, 래퍼런스의 필요성은 [] 등 오퍼레이터 오버로딩에서 나타난다고 한다.

  *vec[10] = 3; 같은 이상한 표현을 쓰지 않아도 된다고 하는데, 

  이 글을 작성하고 있는 시점에서 아직 은 모르는 내용이다.....



- '레퍼런스로 이루어진 배열'(int &arr[10])은 만들 수 없지만, '배열의 레퍼런스'(int (&arr)[10])은 

   만들 수 있다고 한다.. 함수의 인자로 넘겨서 항상 특정 길이를 가진 배열만을 받게 할 수도 있지만, 

  그러느니 그냥 std::array나 std::vector 쓰는 게 낫다고 함.




출처 : http://kks227.blog.me/60204949464


'Language > C++' 카테고리의 다른 글

<3> namespace (네임스페이스)  (0) 2018.02.22
<1> C++ 에서 확장된 기능  (0) 2018.02.12

- 변수를 생성과 동시에 초기화 하는 방법 추가.


1
2
3
4
5
int a = 5;
int a(5);
 
int a=2, b=3;
int a(2), b(3);
cs


>> 모든 자료형에 적용 가능.

>> 배열은 초기화 방법이 다르므로 이런식으로는 불가능



- for 문의 초기식에서 변수 선언 가능


1
2
for(int i=0; i<n; i++)
    scanf("%d"&k);
cs


>> 여기서 i 의 스코프(scope)는 해당 for 문의 안쪽이 된다.



- bool 타입의 자료형 추가.


1
2
bool isTrue = true;
bool isFalse = false;
cs



- 형변환(type casting) 의 추가.


1
2
3
4
5
double d = 3.14;
int n = (int)d;
 
double f = 3.141592;
int k = static_cast<int>(f);
cs


>> static_cast<자료형>(값) 의 형태를 가지고 있다.


>> 용도는 추후 포스팅..



- c 언어의 헤더파일 사용방법


1
2
3
4
5
#include <stdio.h> // C 
#include <stdlib.h> // C
 
#include <cstdio> // C++
#include <cstdlib> // C++
cs


>> 뒤의 .h 를 없애고, 앞에 c를 붙인다.





출처 : http://kks227.blog.me/60204924344


'Language > C++' 카테고리의 다른 글

<3> namespace (네임스페이스)  (0) 2018.02.22
<2> 레퍼런스 (reference)  (0) 2018.02.12

동영상 강의 : http://pythonkim.tistory.com/notice/77


# Day_02_01_loop.py



# 제어문과 반복문의 연결고리


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# 문제
# count 에 0~3 사이의 숫자를 입력 받아서
# 입력받은 숫자 만큼 아침인사를 해봅니다.
# 2가지 종류의 코드를 만들어보기.
 
 
def ans1():
    count = int(input('count : '))
 
    if count == 1:
        print("Good Morning!")
    elif count == 2:
        print("Good Morning!")
        print("Good Morning!")
    elif count == 3:
        print("Good Morning!")
        print("Good Morning!")
        print("Good Morning!")
 
 
def ans2():
    count = 2
    if count >= 1:
        print("Good Morning!")
    if count >= 2:
        print("Good Morning!")
    if count >= 3:
        print("Good Morning!")
 
 
def ans3():
    count = 2
    i = 0
    if i < count:
        print("Good Morning!")
        i += 1
        if i < count:
            print("Good Morning!")
            i += 1
            if i < count:
                print("Good Morning!")
                i += 1
                if i < count:
                    print("Good Morning!")
                    i += 1
                    if i < count:
                        print("Good Morning!")
                        i += 1
 
 
def ans():
    count = 3
    i = 0
    while i < count:
        print("Good Morning!")
        i += 1
 
cs




- 규칙


# 규칙을 찾는 것이 중요. (시작, 종료, 증감)

# 1 3 5 7 9     1~9 까지 2칸씩 건너뛴다.

# 0 1 2 3 4     0~4 까지 1칸씩 건너뛴다.

# 5 4 3 2 1     5~1 까지 -1칸씩 건너뛴다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def rule1():
    i = 1                   # 시작
    while i <= 9:           # 종료
        print("Hello")
        i += 2              # 증감
 
 
def rule2():
    i = 0
    while i <= 4:
        print("Hello")
        i += 1
 
 
def rule3():
    i = 5
    while i >= 1:
        print("Hello")
        i -= 1
cs


>> Python 에서는 i++ 과 같은 증감 연산자를 제공하지 않는다고 한다. ㅜㅜ

>> 세 개 모두 "Hello" 를 5번 출력한다.



- 줄이 바뀌지 않게 하기


1
2
3
4
5
rint('Hello', end=' ')
print('python')
 
# 실행결과 
# Hello python
cs


>> end 파라미터를 사용하면 된다.


- end 파라미터의 또 다른 예시.


1
2
3
4
5
print('Hello', end='***')
print('python')
 
# 실행결과
# Hello***python
cs



-  문제


# 0 ~ 99 까지 출력하는 함수를 만드시오.


1
2
3
4
5
def show100():
    i = 0
    while i <= 99:
        print(i, end=' ')
        i += 1
cs




- for in 문 


1
2
3
4
5
6
7
8
9
10
11
12
13
for i in range(0101):
    print(i, end=' ')
print()
 
for i in range(010):
    print(i, end=' ')
print()
 
for i in range(10):
    print(i, end=' ')
print()
 
# 0 1 2 3 4 5 6 7 8 9 
cs


>> 시작 : 0, 종료 : 10, 증감 : 1

>> 시작, 종료, 증감이 명확한 경우 for 문을 사용한다.

>> 증감의 기본은 1, 시작의 기본은 0



# 문제

# count 에 0~3 사이의 숫자를 입력 받아서

# 입력받은 숫자 만큼 아침인사를 해봅니다.

# 2가지 종류의 코드를 만들어보기.


1
2
3
4
5
6
7
8
9
10
11
def sumOfOddEven():
    odd, even = 00
    for i in range(1100):
        if i%2 == 1: odd  += i
        else :       even += i
 
    return odd, even
 
 
s1, s2 = sumOfOddEven()
print(s1, s2)       # 2500 2450
cs



# 난수


1
2
3
4
5
import random
 
print(random.randrange(10))
print(random.randrange(1020))
print(random.randrange(10202))
cs


>> random 모듈을 import 한다.

>> randrange() 는 range() 와 같이 3가지의 종류의 파라미터를 갖는다.

>> 5 줄의 경우 [10, 20) 에서 2씩 증가하는 수들 중에서 난수가 발생함.



# placeholder


1
2
for _ in range(5):
    print(random.randrange(10), end=' ')
cs


>> for i in range(5): 라고 썼을 때, i 를 사용하지 않는다.

>> 하지만 i 를 지우면 에러.

>> 필요가 없는 변수로 의미를 약화시킬 수 있음. _ 로 표현 (placeholder)

>> _ 는 변수이지만 변수로 사용하지 않겠다는 의미..



# random.seed(1)


1
2
3
random.seed(1)
for _ in range(5):
    print(random.randrange(10), end=' ')    # 2 9 1 4 1
cs


>> 난수값을 고정시킬 수 있다.

>> seed 가 1이 되고 나서의 첫번째 숫자, 두번째 숫자 ...

>> 프로그램 처음에 딱 한번 호출해서 사용한다.



1
2
3
4
5
next = 1
def rand():
    global next
    next = next * 1103515245 + 12345
    return int(next // 65536) % 32768
cs


>> seed() 의 원리 같은 코드라고 한다.







### Day_01_05_re.py


동영상 강의 : http://pythonkim.tistory.com/notice/77



- import re 를 해주어야 한다.


- Google 에서 "3412 bob 123" 검색 

>> http://www.linuxfocus.org/Korean/July1998/article53.html 에서 db 데이터 가져올 수 있음.


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
import re
 
db = '''3412    Bob 123
3834  Jonny 333
1248   Kate 634
1423   Tony 567
2567  Peter 435
3567  Alice 535
1548  Kerry 534'''
 
print(db)
 
# 3412    Bob 123
# 3834  Jonny 333
# 1248   Kate 634
# 1423   Tony 567
# 2567  Peter 435
# 3567  Alice 535
# 1548  Kerry 534
 
 
ns = re.findall(r'[0-9]', db) # 숫자
print(ns)
 
# ['3', '4', '1', '2', '1', '2', '3', '3', '8', '3', '4', '3', '3', '3', '1', '2', '4', '8', '6', '3', '4', '1', '4', '2', '3', '5', '6', '7', '2', '5', '6', '7', '4', '3', '5', '3', '5', '6', '7', '5', '3', '5', '1', '5', '4', '8', '5', '3', '4']
 
 
ns = re.findall(r'[0-9]+', db) # 숫자 한개 이상
print(ns)
 
# ['3412', '123', '3834', '333', '1248', '634', '1423', '567', '2567', '435', '3567', '535', '1548', '534']
cs



# 문제

# 이름만 찾아보기


1
2
3
4
5
6
7
# 문제
# 이름만 찾아보기
# names = re.findall(r'[a-zA-Z]+', db)
names = re.findall(r'[A-Z][a-z]+', db)  # 처음 대문자 한글자 + 소문자 한개 이상.
print(names)
 
# ['Bob', 'Jonny', 'Kate', 'Tony', 'Peter', 'Alice', 'Kerry']
cs


>> [A-Za-z]+ 와 [A-Z][a-z]+ 는 다르다..!!



# 문제

# T로 시작하는 이름

# T로 시작하지 않는 이름


1
2
3
4
5
6
7
8
9
10
11
12
# 문제
# T로 시작하는 이름
# T로 시작하지 않는 이름
 
Tname = re.findall(r'T[a-z]+', db)
print(Tname)    # ['Tony']
 
nTname = re.findall(r'[^T][a-z]+', db)  # bug
print(nTname)   # ['Bob', 'Jonny', 'Kate', 'ony', 'Peter', 'Alice', 'Kerry']
 
nTname = re.findall(r'[A-SU-Z][a-z]+', db)
print(nTname)   # ['Bob', 'Jonny', 'Kate', 'Peter', 'Alice', 'Kerry']
cs


>> T로 시작하지 않는 단어 중 [^T][a-z] 로 했을 때 문제가 있었다.

>> 바로 'ony' 라는 단어까지 검색이 되어버렸다.



# raw string


r'string' : raw


- 파이썬에서 사용하는 문자열로 일반 문자열과 충돌을 막기 위해 제공하는 것 같다 .

- 정규표현식 외에 쓸일은 없다고 한다.



'Language > Python' 카테고리의 다른 글

<2-2> 리스트, 튜플  (0) 2018.02.15
<2-1> 제어문과 반복문의 연결고리  (0) 2018.02.06
<1-6> 정규표현식 (Regular Expression)  (0) 2018.02.02
<1-5> 함수(function)  (0) 2018.02.01
<1-4> 제어문(if)  (0) 2018.01.31

### 정규표현식


- 특정한 규칙을 가진 문자열의 집합을 표현

- 문자열의 검색과 치환을 위해 지원.



POSIX 기본 및 확장 표준 문법

메타문자기능설명
.문자1개의 문자와 일치한다. 단일행 모드에서는 새줄 문자를 제외한다.
[ ]문자 클래스"["과 "]" 사이의 문자 중 하나를 선택한다. "¦"를 여러 개 쓴 것과 같은 의미이다. 예를 들면 [abc]d는 ad, bd, cd를 뜻한다. 또한, "-" 기호와 함께 쓰면 범위를 지정할 수 있다. "[a-z]"는 a부터 z까지 중 하나, "[1-9]"는 1부터 9까지 중의 하나를 의미한다.
[^ ]부정문자 클래스 안의 문자를 제외한 나머지를 선택한다. 예를 들면 [^abc]d는 ad, bd, cd는 포함하지 않고 ed, fd 등을 포함한다. [^a-z]는 알파벳 소문자로 시작하지 않는 모든 문자를 의미한다.
^처음문자열이나 행의 처음을 의미한다.
$문자열이나 행의 끝을 의미한다.



양의 지정
?물음표는 0번 또는 1차례까지의 발생을 의미한다. 이를테면 colou?r는 "color"와 "colour"를 둘 다 일치시킨다.
*별표는 0번 이상의 발생을 의미한다. 이를테면 ab*c는 "ac", "abc", "abbc", "abbbc" 등을 일치시킨다.
+덧셈 기호는 1번 이상의 발생을 의미한다. 이를테면 ab+c는 "abc", "abbc", "abbbc" 등을 일치시키지만 "ac"는 일치시키지 않는다


출처 : Wiki (https://ko.wikipedia.org/wiki/정규_표현식)



### Regex Crossword (https://regexcrossword.com/) ###


- Regular Expression 을 crossword 퍼즐을 통해 익힐 수 있게 도와주는 사이트


- Tutorial Play 을 통해 기본적인 학습을 할 수 있다.


Ex)

- (A)\1 에서 ( )\ 는 한 쌍..!! 여기서 \ 의 뜻은 ( )의 인덱스. ( )는 9개까지 쓸 수 있다.

- A{2, } : 두 번 이상.

- A{1} : 한 번.

- \s 는 공백



- Beginner 등을 통해 연습을 할 수 있다.


Ex)

- .* : 아무 글자. 있어도 되고 없어도 되고.

- M? : M이 하나 있거나 없거나.

- / 는 문자. \ 는 의미가 있다.

- *가 [] 안에 들어가면 단순 문자. >> [*]

- \d : 숫자, [0-9] 와 동일

- \D : 숫자가 아닌 것들.







'Language > Python' 카테고리의 다른 글

<2-1> 제어문과 반복문의 연결고리  (0) 2018.02.06
<1-7> 정규표현식 with Python  (0) 2018.02.03
<1-5> 함수(function)  (0) 2018.02.01
<1-4> 제어문(if)  (0) 2018.01.31
<1-3> 연산자  (0) 2018.01.30

동영상 강의 : http://pythonkim.tistory.com/notice/77



# Day_01_04_Function.py



# Function


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
32
33
34
35
36
37
38
39
40
41
42
43
# 함수의 핵심 : 데이터를 넘겨주고 넘겨받기
# 매개변수 : 넘겨주는 데이터
# 리턴값 : 넘겨받는 데이터
 
 
# 매개변수 없고, 반환값도 없고.
def f1():
    print('f1')
 
 
f1()    # f1
 
 
# 매개변수 있고, 반환 값 없고
def f2(a, b):
    print('f2', a, b)
 
 
f2(23'abc')   # f2 23 abc
 
 
# 매개변수 없고, 반환 값 있고.
def f3():
    # pass      # 아직 코딩 전이라는 뜻..
    print('f3')
    return 17
 
 
= f3()
print(a)        # 17
print(f3())     # 17
 
 
# 매개변수 있고, 반환 값 있고.
# 두 자리 양수를 거꾸로 뒤집는 함수 만들기
def f4(num):
    return num%10*10 + num//10
 
 
print(f4(25))    # 52
 
 
 
cs



# 문제


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 문제
# 두 개의 정수 중에서 큰 숫자를 찾는 함수
def max2(a, b):
    if(a > b):
        return a
    return b
 
 
print(max2(37))   # 7
print(max2(73))   # 7
 
 
# 문제
# 네 개의 정수 중에서 큰 숫자를 찾는 함수
def max4(a, b, c, d):
    x, y = max2(a, b), max2(c, d)
    return max2(x, y)
 
 
print(max4(3917))
cs


>> 함수의 목적은 재사용..!!



'Language > Python' 카테고리의 다른 글

<1-7> 정규표현식 with Python  (0) 2018.02.03
<1-6> 정규표현식 (Regular Expression)  (0) 2018.02.02
<1-4> 제어문(if)  (0) 2018.01.31
<1-3> 연산자  (0) 2018.01.30
<1-2> 파이썬 입문  (0) 2018.01.29

동영상 강의 : http://pythonkim.tistory.com/notice/77


# Day_01_03_if.py


- 들어가기 앞서, 파이썬은 인덴트에 민감하다..!!

- " : "(콜론) 이 나왔을 땐 들여쓰기가 있어야 한다.



# if: else:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
= 13
print(a % 2)        # 1
 
if a%2 == 1:
    print('홀수')     # 홀수
else:
    print('짝수')
 
if a%2:              # 1 은 True
    print('홀수')     # 홀수
else:
    print('짝수')
 
if a:
    print(a)          # 13
 
cs

 


# 문제

# 0 ~ 999 사이의 값을 입력 받아 

# 몇 자리 숫자인지 맞춰보기


1
2
3
4
5
6
7
8
# 문제
# 0 ~ 999 사이의 값을 입력 받아
# 몇 자리 숫자인지 맞춰보기
 
= input("number : ")    # 키보드로 부터 입력을 기다린다., input 안의 문자열은 프롬프트
 
if a >= 100:
    print("3자리 숫자")
cs


- 하지만 위와 같이 작성하면 파이썬은 에러를 발생시킨다.

>> a 에는 str 타입이 저장되기 때문..!!


1
2
3
4
5
= input("number : ")    
print(type(a))            # <class 'str'>
 
= int(input("number : "))   
print(type(a))            # <class 'int'>
cs



- 지금까지 배운 내용으로는 이정도로..


1
2
3
4
5
6
7
if a >= 100:
    print(3)
else:
    if a >= 10:
        print(2)
    else:
        print(1)
cs



# 공백 : space , enter, tab


- 파이썬 인터프리터가 무시하는 세가지. 

1. 스페이스

2. 엔터

3. 탭


1
2
3
4
5
6
print(     'Hello')
print(
 
    'Hello'
)
print(          'Hello')
cs



# elif


1
2
3
4
5
6
if a >= 100:
    print(3)
elif a >= 10:
    print(2)
else:
    print(1)
cs






'Language > Python' 카테고리의 다른 글

<1-7> 정규표현식 with Python  (0) 2018.02.03
<1-6> 정규표현식 (Regular Expression)  (0) 2018.02.02
<1-5> 함수(function)  (0) 2018.02.01
<1-3> 연산자  (0) 2018.01.30
<1-2> 파이썬 입문  (0) 2018.01.29

<1-3> 연산자

Language/Python2018. 1. 30. 08:31

동영상 강의 : http://pythonkim.tistory.com/notice/77


# Day_01_02_Operator.py


# 연산자 : 산술, 관계, 논리, 비트



- 산술 : +    -    *    /    //    %    **    


1
2
3
4
5
6
7
8
9
# 산술 : +    -    *    /    //   %   **
a, b = 175
print(a+b)      # 22
print(a-b)      # 12
print(a*b)      # 85
print(a/b)      # 3.4
print(a//b)     # 3
print(a%b)      # 2 , mod
print(a**b)     # 1419857, 17^5
cs


# 문제


1
2
3
4
5
6
= 37
a1 = n//10
a2 = n%10
 
= a2*10 + a1
print(n)    # 73
cs



- 관계 : >    >=    <    <=    ==    !=


1
2
3
4
5
6
7
8
9
10
11
# 관계 : > >= < <= == !=
 
a, b = 175
print(a, b)
 
print(a > b)    # T
print(a >= b)   # T
print(a < b)    # F
print(a <= b)   # F
print(a == b)   # F
print(a != b)   # T
cs

- 단어에도 대소가 있다. >> 아스키 코드로 비교.

- 대문자보다 소문자가 크다.

- 한글은 유니코드 사용

- True 나 False 도 숫자로 이루어져 있다.

>> 데이터 변환을 통해 확인.


# 형변환(casting) : int    float    str    bool


1
2
3
4
5
6
7
# 형변환(casting) : int, float, str, bool
 
print(int(True))    # 1
print('345')        # 345
print(int('345'))   # 345
print(int(a != b))  # 1
print(int(False))   # 0
cs

# 문제

# 10대인지 판단해보기.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 문제
# 10대인지 판단해보기.
 
age = 15
b1 = age >= 10      # T, F
b2 = age <= 19      # T, F
 
# T * T = T
# T * F = F
# F * T = F
# F * F = F
 
print(bool(b1*b2))  # True
print(age >= 10  *  age <= 19)    # False
print((age >= 10* (age <= 19))    # 1
print(10 <= age <= 19)      # True (python only)

cs




- 논리 : and    or    not

>> 관계 연산자를 묶을 때 사용한다.


1
2
3
4
5
6
7
8
# 논리 : and  or  not
 
print(True and True)    # True
print(True and False)    # False
print(False and True)    # False
print(False and False)    # False
 
print(age >= 10  and  age <= 19)    # True

cs


- 비트 연산자는 pass



'Language > Python' 카테고리의 다른 글

<1-7> 정규표현식 with Python  (0) 2018.02.03
<1-6> 정규표현식 (Regular Expression)  (0) 2018.02.02
<1-5> 함수(function)  (0) 2018.02.01
<1-4> 제어문(if)  (0) 2018.01.31
<1-2> 파이썬 입문  (0) 2018.01.29