[Python] Randomisation and Python Lists
- -
무작위화 및 파이썬 리스트
[Random 모듈]
예측 불가능성을 가진 컴퓨터 프로그램을 만들고자 할 때,
무작위화는 아주 중요하다.
하지만 컴퓨터에 대해 이야기한다면,
컴퓨터는 결정론적이라 할 수 있다.
그렇다면 어떻게 기본적으로 0과 1로 작동하는 컴퓨터가 무작위 숫자를 생성하게 될까?
의사 난수 생성기라고 불리는 것을 만들기 위해 적용할 수 있는 수학이 많이 있다.
그리고 파이썬이 사용하는 것은 메르센 트위스터(Mersenne Twister)라고 불리는 것이다.
이런 의사 난수 생성기에 대해 알아보고 싶다면 Khan Academy의 무료 동영상 중 하나인
Pseudorandom number generator 영상을 보자.
파이썬에서 랜덤한 값을 가져오고 싶다면 파이썬의 random 모듈을 사용하자.
오늘은 무작위 정수를 생성하기 위해 radom.randint 를 사용해보자.
random.randint(a, b)
이것은 a와 b 사이의 무작위 정수를 생성한다.
randint는 a보다 크거나 같고 b보다 작거나 같은 무작위 숫자를 생성하게 된다.
무작위 숫자를 출력하는지 실행시켜보자.
위에서 우리는 random 모듈이 파이썬의 모듈이라고 했다.
그렇다면 모듈이란 정확히 무엇일까?
[Module]
우리는 대부분의 코드를 일종의 스크립트 스타일로 같은 페이지에 작성해왔다.
모든 것이 위에서 아래로 실행된다.
하지만, 복잡한 것을 만들려고 할 때 코드가 너무 길어져서
큰 코드 덩어리에서 무슨 일이 일어나고 있는지 이해할 수 없게 된다.
그런 경우 사람들은 코드를 개별 모듈로 나누어,
각 모듈이 프로그램의 서로 다른 기능을 담당하게 한다.
그리고 많은 모듈이 있는 복잡한 프로젝트가 있다면 다른 사람과 협업할 수도 있을 것이다.
많은 사람들이 각기 다른 작업을 할 수 있다.
쉬운 예로 공장에서 자동차를 만들 때
한 사람이 바퀴에서 차축, 차제까지 전체 자동차를 만드는 것은 말이 되지 않는다.
대신 타이어 모듈, 차제 모듈, 엔진 모듈 등 서로 다른 사람들이 각각 작업한 후,
모든 것을 조립하면 자동차가 완성된다.
그래서 앞서 설명한 random 모듈은 의사 난수를 생성하는 데
필요한 모든 복잡한 수학을 거치지 않고도 임의의 숫자를 쉽게 생성할 수 있도록
파이썬에서 만든 모듈이다.
이때, 우리가 직접 모듈을 만들려면 어떻게 해야 하고 모듈은 어떻게 작동할까?

1. 파일 인스펙터를 열고 작업하는 파일로 간다.

2. 새 파이썬 파일을 만들고 이름을 설정한다.

3. 변수를 하나 생성한다.

4. 내 모듈에서 사용하고 싶다면 random 모듈과 동일하게 import 해준다.
그리고 출력하면 내가 my_module 모듈에 지정했던 숫자가 출력된다.
# main.py
import random
import my_module
random_integer = random.randint(1, 10)
print(random_integer)
print(my_module.my_favorite_number)
=================================================================================
# my_module.py
my_favorite_number = 4444
[무작위 부동 소수점 숫자 생성]
파이썬 문서에 가서 실수 값 분포(Real-valued distributions)라는 영역으로 가면
무작위 부동 소수점 숫자를 생성하는 방법 중 하나는 random.random 함수를 사용하는 것임을 알 수 있다.
random.random 함수는 파이썬에서 무작위 숫자를 다룰 때 많이 사용하는 핵심 함수 중 하나이다.
이 함수는 0과 1 사이의 무작위 부동 소수점 숫자를 생성한다.
한 번 확인해보자.
random.random 함수는 입력을 받지 않는다. 따라서 빈 괄호만 추가하면 된다.
문서를 살펴보면 또 다른 함수인 부동 소수점 난수 생성기가 있다.
random.uniform(a, b)
이 함수는 하한보다 크거나 같고 상한보다 작거나 같은 부동 소수점 난수를 반환한다.
따라서 a와 b 사이의 숫자를 생성하며 a와 b를 포함한다.
import random
random_float = random.uniform(1, 10)
print(random_float)
random.uniform 함수는 상한의 반올림에 따라 달라지므로,
상한을 얻을 수도 있고 얻지 못할 수도 있다.
따라서 가능하다면 random.random을 사용하는 것을 추천한다.
[실습]
오늘 배운 개념들을 사용해서 동전의 앞/뒷 면이 나오는 랜덤 프로그램을 만들어보자.
[답]
[오프셋을 이해하고 리스트에 항목 추가하기]
파이썬에서 정말 중요한 개념인 리스트(LIST)에 대해 배워보자.
리스트는 데이터 구조(Data Structure)라고 부를 수 있는 것이다.
조금 더 쉽게 말하면 파이썬에서 데이터를 조직하고 저장하는 방법이다.
fruits = [apple, orange]
리스트의 항목들은 어떤 데이터 타입이든 될 수 있다.
문자열과 숫자 또는 불리언 집합을 함께 저장하는 등 혼합 데이터 타입도 가능하다.
리스트는 항상 여는 대괄호로 시작하고, 항목들을 쉼표로 구분한 다음 닫는 대괄호로 마무리한다.
리스트에는 순서 또한 존재한다.
그리고 그 순서는 리스트 안의 순서에 의해 결정된다.
변수 안에 저장하면 해당 순서가 손실되지 않으며 나중에 리스트가 필요할 때 사용할 수 있다.
fruit = ['apple', 'orange', 'pear']
print(fruit[0])
이와 같이 작성하므로써 fruit의 0번째 인덱스인 apple을 출력할 수 있다.
fruit[0]은 apple
fruit[1]은 orange
fruit[2]는 pear
이때, 리스트 안의 값을 바꾸고 싶다면 어떻게 해야할까?
값을 바꾸고 싶다면
fruit = ['apple', 'orange', 'pear']
fruit[2] = 'bear'
print(fruit[2])
fruit[2]의 값을 bear로 바꿔준다면
출력할 때 pear가 아닌 bear로 출력하는 것을 볼 수 있다.
그럼 이번엔 리스트 안에 값을 추가해보자.
fruit = ['apple', 'orange', 'pear']
fruit.append('blueberry')
print(fruit[3])
이렇게 list.append() 를 사용하면 간단하게 리스트에 항목을 추가할 수 있다.
여러 개의 항목을 추가하고 싶다면
fruit = ['apple', 'orange', 'pear']
fruit.extend(['blueberry', 'blackberry'])
print(fruit[4])
extend를 사용하면 리스트 끝에 여러 항목을 추가할 수 있다.
[실습-금융가 룰렛]
friends = ["alice", "bob", "charlie", "david", "emanuel"]
이 친구 목록을 살펴보고 지금까지 배운 무작위화와 리스트를 사용하여
이 이름들 중 하나를 무작위로 출력하는 코드를 만들어보자.
[답 1]
[답 2]
[IndexError 및 중첩 리스트 활용하기]
리스트를 다룰 때 가장 흔히 접하게 되는 오류 중 하나는
인덱스 범위 초과 오류(list index out of range)이다.
index out of range는 단순히 숫자 하나 차이로 발생할 수 있는 오류다.
리스트 안에 여러 항목이 있다고 가정해보자.
그럴 때는
fruit = ['apple', 'orange', 'blueberry', 'blackberry', 'pineapple']
last = len(fruit)
print(fruit[last-1])
fruit 항목의 갯수를 구한 다음, 1을 빼주면 된다. (인덱스는 0부터 시작, len은 1부터 시작)
[중첩 리스트]
지금 나에게는 과일과 채소가 있다.
과일과 채소는 모두 음식이다! 맛있겠다.
이 과일, 채소라는 리스트를 어떻게 하면 음식이라는 하나의 리스트 안에 넣을 수 있을까?
어떻게 리스트 안에 리스트를 가질 수 있을까?
이것을 중첩 리스트(nested list)라고 한다.
fruit = ['apple', 'orange', 'blueberry', 'blackberry', 'pineapple']
veg = ['spinach', 'kale', 'tomatoes', 'celery', 'potatoes']
food = [fruit, veg]
print(food)
위 코드처럼 fruit와 veg라는 리스트를 food 안에 넣어주면
[['apple', 'orange', 'blueberry', 'blackberry', 'pineapple'], ['spinach', 'kale', 'tomatoes', 'celery', 'potatoes']]
이렇게 출력이 된다.
시작과 끝에 두 개의 대괄호가 있다.
그 이유는 fruit이 하나의 리스트, veg가 하나의 리스트.
이 두 리스트를 모두 담은 food 리스트가 있기 때문이다.
IQ 테스트를 할 때 삼각형 안에 삼격형을 넣어두고 총 몇 개인지 묻는 문제가 생각난다....
'Programming > Python' 카테고리의 다른 글
| [Python] Python Functions & Karel (0) | 2024.12.01 |
|---|---|
| [Python] Python Loops (0) | 2024.12.01 |
| [Python] Control Flow and Logical Operators (0) | 2024.11.30 |
| [Python] Understanding Data Types and How to Manipulate Strings (0) | 2024.11.28 |
| [Python] Working with Variables in Python to Manage Data (0) | 2024.11.28 |
소중한 공감 감사합니다