'전체 글'에 해당되는 글 32건

 이번엔 3장 Introducing Lists에 대해 배워보도록 하자. 저번 장의 피드백을 토대로 내용을 다시 정리해보려고 한다. 이번엔 핵심 단어나 문장 위주로 내가 이해한대로 풀어보려고 한다.

 3장을 시작하기에 앞서 소개글을 읽어보면 저번 장에서 예측했듯이 List에 관해서 소개를 하고 있다. 우리가 기본적으로 알고 있는 List는 여러 개의 데이터가 연결되어 있는 형태로 알고 있는데 여기서도 비슷하게 쓰이지 않을까 싶다. 파이썬의 강력한 기능이라고도 하고 중요한 개념이기도 하고 다른 것들과 묶어서 사용도 많다고 하니까 꽤나 중요한 장이지 않을까 싶다. 그러면 List에 대해서 알아보도록 하자~

 

  • What is a List?

 3장부터는 큼직한 대제목들로만 풀이를 해보려고 한다. 우리는 예전에도 List를 배운 적이 있다.(기억이 난다면....) 흔히 아는 리스트와 예제에서 보이는 리스트가 그렇게 차이가 있어 보이지는 않는다. 예전의 C언어의 리스트를 아래의 예제를 보고 떠올려보기로 하자.

 

int list[5] = {1, 2, 3, 4, 5};
printf(list);

결과
1

 

 우리가 흔히 알고 있는 C언어의 리스트이다. 흔히 배열이라고 많이 불렀는데 미리 데이터 타입을 지정하고 크기도 지정한 다음 그에 맞는 변수를 대입하는 방식으로 사용했다.(물론 나중에는 동적할당, 구조체 등등으로 변형하여 사용도 했지만...^^) 하지만 파이썬에서의 배열? 즉 리스트는 위 코드와 많은 차이점이 있는 것 같다. 아래 예제를 살펴보도록 하자.

 

bicycle = ['trek', 'cannondale', 'redline', 'specialized']
print(bicycle)

결과
['trek', 'cannondale', 'redline', 'specialized']

 

 차이가 많이 느껴지지 않는가? 데이터 타입은 어디갔으며, 크기 지정도 안하고, 심지어 리스트 이름만 출력했을 뿐인데 모든 요소들이 전부 출력된다! 중요한 것은 기존에 쓰던 중괄호{}가 아니라 대괄호[]라는 점을 잘 알고 있어야 한다. 파이썬은 괄호에 따라서 데이터 타입이 여러 개로 나뉘는데 소괄호()는 set, 중괄호{}는 dictionary, 대괄호[]는 list로 나뉘게 된다. 나머지 2개는 뒤에서 배울테니까 넘어가기로 하자. 그리고 대괄호[]만 써서 요소 없이 만들어도 요소 없는 list로 만들어진다.

 저 방식 외에도 리스트를 만드는 다른 방식은 아래 예제를 참고하자.

 

number = list(range(10))			#range(n) : 숫자 n을 0 ~ n-1까지 반환
print(number)

출력
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

 

 다음은 리스트를 만들었으니 인제 활용할 줄 알아야 한다. 우리가 예전에 배열을 쓰기 위해선 index라는 녀석에게 접근해서 요소를 출력했다. 그러면 파이썬은 다른가? 아니다! 아래 예제를 살펴보고 어떻게 요소에 접근하는지 알아보자.

 

bicycles = ['trek', 'cannondale', 'redline', 'specialized']
print(bicycles[0])

출력
trek

 

 역시나! 리스트의 첫 번째 요소는 index 0으로 시작한다는 것을 알 수 있다.(아주 중요한 사실이다!) 그러므로 bicycles이 4개의 요소를 가지고 있으므로 리스트의 index는 0, 1, 2, 3를 가지고 있다고 할 수 있다. 반대로 파이썬에서는 새로운 방법으로도 요소에 접근할 수 있는데...

 아래 예제를 살펴보고 어떻게 접근하는지 알아보자.

 

bicycles = ['trek', 'cannondale', 'redline', 'specialized']
print(bicycles[-1])

출력
specialized

 

 index값이 보이는가? -1??? 분명히 0, 1, 2, 3밖에 없었는데 -1이라니... 하지만 출력 결과를 보면 제일 마지막 요소가 출력되었다. 그렇다! -1은 제일 마지막 요소를 출력해주는 방법이었다. 반대로 생각해보면 -1은 마지막 요소....그러면 -2는...당연히 마지막에서 두 번째! 즉 역으로 요소들을 출력을 할 수 있다고 생각하면 된다. 얼마나 편리한 기능인가?ㅎㅎ

 

 그러면 list의 특징들에 대해 한 번 정리해보고 기능들을 살펴보러 가자.

  • list의 생성에는 [] or list()를 사용하여 생성한다.
  • list를 생성할 때 요소 없이 만들 수도 있다.
  • list의 index는 0부터 시작하며 역으로 -1부터 출력할 수도 있다.
  • list의 각각의 요소에서는 우리가 알고 있는 method들을 사용할 수 있다.
     - ex) list[0].title(), list[3].lower

 

  • Changing, Adding, and Removing Elements

 다음은 list의 기능들에 대해서 살펴보도록 하자. 제목에서 알 수 있듯이 크게 3가지 기능들을 배울텐데 Changing, Adding, Removing 이 세 가지에 대해서 알아보자~

 

  • Changing

 먼저 Changing을 알아보면 단어 뜻 그대로 요소를 바꾸는 기능을 말한다. 세 가지 기능 중에서 제일 간단한 기능인데 그냥 우리가 아는 요소에 접근해서 변수만 바꾸면 끝난다. 아래 코드를 살펴보고 기능에 대해 이해해보자.(주석 참고)

 

motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)

출력
['honda', 'yamaha', 'suzuki']

motorcycles[0] = 'ducati'		#motorcycles[0] 요소에 접근하여 'ducati'로 수정
print(motorcycles)

출력
['ducati', 'yamaha', 'suzuki']

 

  • Adding

 그 다음으로 알아볼 기능은 Adding이다. 앞서 배웠던 Changing은 원래 있는 요소를 수정하는 기능이라면 Adding은 없는 요소를 추가하여 list에 포함시키는 기능이다. 앞장에서 배웠던 다양한 method들을 사용하면 쉽게 요소들을 추가 할 수 있다. 책에서는 2개의 method에 대해서 소개하고 있는데 아래 예제를 보고 어떻게 사용하는지 이해해보자.(주석 참고)

 

motorcycles = ['honda']			# list motorcycles 생성
motorcycles.append('yamaha')		# append(x) : 요소의 마지막에 x 변수 추가
motorcycles.append('suzuki')
motorcycles.insert(0, 'ducati')		# insert(n, m) : index n에 m 변수 추가
print(motorcycles)

출력
['ducati', 'honda', 'yamaha', 'suzuki']

 

  • Removing

 마지막으로 제거의 의미를 가지고 있는 Removing이다. 본문이 조금 다른 녀석들보다 길어 보이지만 걱정하지 말고 천천히 읽어보자. 고작 method 3개 밖에 안되는 쉬운 녀석이다. 하나씩 천천히 읽어보고 아래의 코드에서 어떻게 사용하는지 이해해보자.(주석 참고)

 

motorcycles = ['honda', 'yamaha', 'suzuki', 'ducati']		# list motorcycles 생성
del motorcycles[0]		# del list[n] : list index n번째 요소 삭제
motorcycles.pop()		# list.pop(n) : list index n번째 요소 삭제(n 생략 시 맨 뒤 요소 삭제)
motorcycles.remove('yamaha')	# list.remove(x) : list의 x 요소 검색 후 삭제
print(motorcycles)

출력
suzuki

 

 추가적으로 Removing 항목에 대해 설명하자면 remove()는 값을 찾아서 삭제하는 method인데 값이 중복이면 어떻게 되는가?에 대한 의문이 생길 수 있다. 결론부터 말하자면 처음으로 찾는 값만 삭제하고 뒤에 중복이 있어도 삭제하지 않고 끝나게 된다. 책에서는 7장에서 또 다룬다고 하니까 이정도만 알고 넘어가기로 하자.

 

 아래 예제는 추가적인 내용이지만 알고 있으면 유용하므로 한 번 살펴보고 넘어가자^^

 

motorcycles = ['honda', 'yamaha', 'suzuki', 'ducati']		# list motorcycles 생성
motorcycles[0:3]		# list[n:m] : list index n번째부터 m-1까지 요소 반환
motorcycles[:]			# list[:] : list index 처음부터 마지막까지 전체 요소 반환

응용
motorcycles[:-1]		# 처음부터 마지막 요소 전까지 반환

 

  • Organizing a List

  다음 단원으로는 List에 관련된 몇 가지 method들이 소개되고 있다. 각각의 method들을 책에 나와 있는 예제들을 살펴보고 이해해보도록 하자.

 

  • sort()

 제일 먼저 소개되고 있는 method는 sort()이다. 단어의 뜻만 봐도 '분류', 즉 정렬하는 뜻을 가지고 있고 알고리즘에서도 자주 나오는 단어이다. 단어가 모두 소문자라는 가정 하에 알파벳순으로 정렬을 해주며 한글도 실행해 본 결과 우리가 알고 있는 순서(가나다라마....)에 따라 정렬을 해주는 것 같다. 그러면 아래 예제를 살펴보고 어떻게 쓰이는지 이해해보자.(주석 참고)

 

cars = ['bmw', 'audi', 'toyota', 'subaru', '현대', '기아']
cars.sort()
print(cars)

출력
['audi', 'bmw', 'subaru', 'toyota', '기아', '현대']		//한글보다 영어가 우선순위

cars.sort(reverse=True)		//역순으로 정렬
print(cars)

출력
['현대', '기아', 'toyota', 'subaru', 'bmw', 'audi']

print(sorted(cars))		//출력할 때만 정렬

출력
['audi', 'bmw', 'subaru', 'toyota', '기아', '현대']

 

  • reverse()

 다음 method인 reverse()는 단어 뜻 그대로 '역순'을 의미하며 역순으로 정렬이 되는 것이 아니라 들어 있는 값들을 반대로 정렬하는 기능이다. 그러므로 역순으로 정렬하려면 sort()로 정렬 후 reverse()를 하면 역순 정렬이 된다. 아래 예제를 살펴보고 어떻게 사용하는지 알아보자.(주석 참고)

 

cars = ['bmw', 'audi', 'toyota', 'subaru']
cars.reverse()		//역순 정렬
print(cars)

출력
['subaru', 'toyota', 'audi', 'bmw']

 

  • len()

 마지막 method는 len()이다. '길이'라는 뜻을 가지고 있고 list의 길이를 반환해주는 method이다. len()은 반복문에서도 많이 활용되기 때문에 꼭 숙지하고 있는 편이 좋다. 간단하게 아래 예제를 살펴보고 어떻게 사용하는지 알아보자.(주석 참고)

 

cars = ['bmw', 'audi', 'toyota', 'subaru']
len(cars)		//list cars의 객체 수 반환

결과
4

 

  • Avoiding Index Errors When Working with Lists

 자! 3단원의 마지막인 Index Errors에 관해 설명하고 있다. errors는 저번 장에서와 같이 알고만 있으면 해결하기 쉬우므로 여러 가지 error 해결 방법을 알고 있으면 좋다.(내가 만들고 싶지 않아도 생기는 것이 바로 ERROR...) 아래 예제를 살펴보고 error를 한 줄씩 이해해보자.

 

motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles[3])

- 에러 발생 -
1 Traceback (most recent call last):
2 	File "motorcycles.py", line 2, in <module>    
3 		print(motorcycles[3]) 
4 IndexError: list index out of range 

 

  • 1번째 줄 : 에러가 어디서 발생하는지 찾는 메시지
  • 2번째 줄 : 저번 장에서도 나왔듯이 motorcycles.py에서 에러가 발생했고 2번째 line에서 발생
  • 3번째 줄 : 2번째 줄의 확장으로 print(motorcycles[3]에서 에러 발생
  • 4번째 줄 : IndexError가 발생했으며 IndexError는 list의 Index를 잘못 사용(없는 인덱스 or 잘못된 인덱스 값 사용 시 발생)했을 때 발생하는 error

 결국 에러를 전체적으로 이해해보자면 Index 잘못 써서 나는 에러나는 이야기이다. 3이라는 인덱스를 0,1,2밖에 존재하지 않기 때문에 이 셋 중 하나로 고쳐주면 사라지는 에러이다. 에러는 천천히 이해해보면 해결할 수 있기 때문에 당황하지 말고 코드의 오타나 설명을 잘 읽어보자!!!(모르면 구글링!!)

 

 자 인제 3장이 끝이 났다. list의 생성이나 기초적인 method들을 배워봤으며 summary를 읽어 보면 4장은 우리가 기초적으로 배운 list를 더 활용하는 내용이 나오는 것 같다.(예를 들어 더 많은 method나 반복문이 나올 것 같다.) 3장의 내용을 잘 이해하고 4장으로 넘어가서 여러가지 list 활용을 배워보도록 하자!

'Python > No Starch Press_Python' 카테고리의 다른 글

Chapter7. USER INPUT AND WHILE LOOPS  (0) 2020.04.20
Chapter6. DICTIONARIES  (0) 2020.04.17
Chapter5. IF STATEMENTS  (0) 2020.04.10
chapter4. working with lists  (0) 2020.04.10
Chapter2. Variables and simple data types  (2) 2020.03.12
블로그 이미지

Mr.HB

프로그래밍 이야기

,

 PWM(Pulse Width Modulation)이란 펄스 폭 변조라고도 하며 우리가 쓰는 디지털 신호를 아날로그 신호처럼 흉내내서 사용한다고 볼 수 있다. 먼저 디지털 신호와 아날로그 신호의 차이를 아래의 그림을 보고 이해하자.

 

 

디지털 신호 vs 아날로그 신호

 

 우리가 흔히 알고 있는 디지털 신호와 아날로그 신호이다. 1과 0밖에 없는 딱딱하고 각지게 생긴 위에 녀석이 디지털, 웨이브 치게 생긴 sin, cos 등등 부드럽게 생견 녀석이 아날로그이다. 디지털은 LED로 표현하면 on, off밖에 없지만 아날로그 같은 경우에는 조명의 밝기도 다양하게 표현할 수 있는 차이점이 있다. 그러면!! 디지털 신호로 LED의 밝기를 조절하려먼 어떻게 해야 하는가??? 그 해답이 PWM에 있다.

 이제 PWM의 주요 개념에 대해 알아보자. 아래 그림을 보면서 이해해보도록 하자.

 

 

PWM 구조<출처 : 위키백과>

 

 위에서 분명히 디지털 신호는 0과 1밖에 쓰지 못한다고 했었다. 그렇기 때문에 그림에서도 아날로그처럼 유연한 곡선이 보이는 것은 아니다. 하지만 PWM은 그런 디지털 신호를 Duty Cycle 비율로 나누어서 마치 아날로그 신호처럼 보이게 만들어 주는 것이다.

  • Duty Cycle : PWM에서 쓰이는 비율로 1이 차지하고 있는 비율이다.

     - 그림에서 보듯이 0%는 1이 하나도 없고 50%는 1의 비율이 50%라는 뜻이다.

 이처럼 0과 1의 비율을 무수히 쪼개어서 LED가 실제로는 on, off만 반복하지만 우리의 눈에는 밝기가 약해진 것처럼 느껴지는 그러한 현상이 일어난다. 우리가 1초에 한 번씩 on, off되는 것은 인식할 수 있지만 0.01초에 한 번씩 on, off되는 것은 인식하지 못하는 것처럼 착각을 하게 되는 것이다. 파형의 주기가 짧으면 짧을수록 부드럽게 동작하며 0에서는 전력을 소모하지 않기 때문에 Duty Cycle 비율에 따라서 전력 소모도 줄일 수 있다. 

 

 

PWM 변화<출처 : 위키백과>

'용어사전' 카테고리의 다른 글

플레밍의 법칙(Fleming's rule)  (0) 2020.05.15
OAM(Operation Administration Maintenance)  (2) 2020.02.20
4-way-handshaking  (3) 2020.01.29
3-way-handshaking  (3) 2020.01.29
블로그 이미지

Mr.HB

프로그래밍 이야기

,

 SPI(Serial Peripheral Interface Bus)란 직렬 주변기기 인터페이스 버스라고도 하며 전이중 통신 모드로 동작하고 1:N의 동기식 고속 통신 방식이다. SPI는 Master와 Slave로 구성되어 있으며 아래 그림과 같이 4개의 핀이 필요하다. 그림을 살펴보고 4개의 핀에 대해 알아보자.

 

SPI버스<출처 : 위키백과>

 

  • MOSI(Master out, Slave In) : 해석 그대로 마스터에서 데이터를 출력하기 위한 신호 선

  • MISO(Master In, Slave Out) : 위와 반대로 슬레이브에서 데이터를 출력하기 위한 신호 선

     - 각각의 출력 신호 선이 따로 있기 때문에 전이중 방식 가능

  • SCLK(Slave Clock) : 클럭 주파수를 맞추기 위한 신호 선

     - 동기 방식이기 때문에 클럭 주파수 신호 선 필요(마스터에서만 출력)

  • SS(Slave Select) : 데이터를 송수신할 때 슬레이브를 선택하기 위한 신호 선

     - 1:N의 특성에 따라 1개의 마스터와 여러 개의 슬레이브 가능

 위와 같이 SPI에서는 4개의 신호 선을 가지고 통신을 하게 되고 1개의 마스터와 1개 이상의 슬레이브가 필요하며 송수신 선이 따로따로 존재하기 때문에 동시에 데이터를 주고 받을 수 있으며 송수신 선을 한 개만 가지고 있는 I2C보다 속도가 빠르다. 하지만 슬레이브의 수가 많아질수록 SS선도 비례해서 늘어나므로(1 slave = 1 ss) 물리적 단점이 일어날 수도 있다.(나머지 3개의 선은 슬레이브가 많아지더라도 계속 공유할 수 있다.)

 

 다음은 아래에 그림을 참고하여 SPI의 통신 순서를 생각해보자.

 

SPI 통신 방법<출처:https://learn.sparkfun.com/tutorials/serial-peripheral-interface-spi>

 

  1.  송수신 할 슬레이브를 선택하기 위해 SS 신호를 보낸다.

  2.  슬레이브 선택 후 SCK 신호를 통해 클럭 신호를 맞춘다.

     - 클럭 신호는 마스터와 슬레이브만 맞추면 되기 때문에 High에서 보내든 Low에서 보내든 상관없다.

  3.  클럭 신호에 따라 MOSI or MISO를 통해 데이터를 송수신한다.

     - 그림에서는 따로따로 실행되고 있지만 동시에 송수신이 이루어져도 상관없다.

  4.  데이터 송수신이 끝나면 SS를 끊고 종료

 

 이와 같은 순서로 SPI는 통신이 이루어지며 장점도 존재하지만 단점 또한 같이 존재한다. 마지막으로 내용을 정리해보고 끝마치도록 하자.

 

  • SPI는 송수신 신호 선이 따로 있는 전이중 방식으로 I2C보다 통신 속도가 빠르다.

  • SPI 통신에는 총 4개의 신호 선이 필요하다.(MOSI, MISO, SCK, SS)

  • SPI 통신은 동기 방식이다.(SCK)

  • 1개의 마스터와 1개 이상의 슬레이브가 필요하며 1:N 통신 방식이다.

  • 슬레이브 수가 증가할 때마다 비례하여 SS 신호 선이 추가로 필요하다.(물리적 단점)

'MCU' 카테고리의 다른 글

I2C 통신이란?  (0) 2020.03.06
AVR Studio 4 vs Atmel Studio 7  (0) 2019.08.10
Atmega8(A) 특징  (0) 2019.08.10
Atmega8(A) 소개  (0) 2019.08.10
ADC(Analog-Digital Converter)  (0) 2019.08.05
블로그 이미지

Mr.HB

프로그래밍 이야기

,