Programming Language/Python

for 문 테스트 (IP 주소 생성기)

GGkeeper 2022. 1. 13. 21:33

for문 테스트

counter = 10
total = 0
for x in range(0, counter):
    total += 1  # total = total + 1
    # print(x, end=' ')
    print(x)
print('프로그램 종료')  

random 모듈 테스트
>>> from random import randint
>>> randint(1, 10)
7
>>> randint(1, 10)
7
>>> randint(1, 10)
1
>>> randint(1, 10)
6
>>> randint(1000, 9000)
3470
>>> randint(1000, 9000)
7583
>>> randint(1000, 9000)
2512

for + random 테스트
randint(정수1, 정수2) : 정수1 ~ 정수2 까지 무작위 수를 뽑아주는 함수
-- testRandom.py --
# import random 
# def randInt():
#     # import로 모듈을 불러들이면 모듈명.함수명()으로 호출한다.
#     x = random.randint(1000, 9000)
#     return x

from random import randint
def randInt():
    # from 으로 모듈을 불러들이면 함수명()으로 호출한다.
    x = randint(1000, 9000)
    return x

#for x in range(10):
for x in range(0, 10):
    # s_port = randInt()
    # print(s_port)
    print(f'{x}: {randInt()}')
    
print('프로그램 종료')    
-- testRandom.py --

IP주소를 만들어주는 함수
-- testIPv4.py --
"""
파일명 : testIPv4.py
프로그램 설명 : 랜덤 IP주소 생성을 위한 지식들
"""

# 1. join() 
# a = ['1', '2', '3', '4', '5']
# print(a, type(a))   # ['1', '2', '3', '4', '5'] <class 'list'>
# ip = ".".join(a); print(ip, type(ip))  # 1.2.3.4.5 <class 'str'>
# print(".".join(a))  # 1.2.3.4.5

# 2. for문
# 반복문
# 형식 : 
# 이터러블 : 반복 가능한 객체(문자열,리스트,튜플,딕셔너리,셋,range())
# for 변수 in 이터러블:
#     실행문1
# else:
#     실행문2

# for x in [1,2,3,4,5]:
#     print(x)
# else:
#     print('for문 종료')
    
# 3. range() 
https://docs.python.org/ko/3/tutorial/index.html
https://docs.python.org/ko/3/tutorial/controlflow.html#the-range-function

# range() 함수(클래스)를 이용한 숫자 증가하기
# 형식 : 
# range(숫자) : 숫자가 1개가 인수로 올 경우
# range(시작숫자,끝숫자) : 숫자가 2개가 인수로 올 경우
# range(시작숫자,끝숫자,증가할개수) : 숫자가 3개가 인수로 올 경우
# range(시작숫자,끝숫자,감소할개수) : 숫자가 3개가 인수로 올 경우
# range() 함수는 0부터 시작한다. 끝숫자는 포함이 안된다.

# range(3) : 0,1,2
# range(5) : 0,1,2,3,4
# range(1,11) : 1,2,3,4,5,6,7,8,9,10
# range(5,11) : 5,6,7,8,9,10
# range(1,6) : 1,2,3,4,5
# range(1,6,1) : 1,2,3,4,5
# range(1,11,2) : 1,3,5,7,9
# range(5,0,-1) : 5,4,3,2,1
# range(10,0,-2) : 10, 8, 6, 4, 2    
    
# for x in range(5):  # 0 ~ 4
# for x in range(1,11):  # 1 ~ 10
#     print(x)
# else:
#     print('for문 종료')
        
# 4. 리스트 컴프리헨션 (list comprehension)
# 리스트 컴프리헨션이란 리스트를 간략하게 표현한 것으로 
# 리스트 안에 for문을 사용할 수 있도록 한 것이다.
# 형식 : 변수명 = [실행문 for문]
# 형식 : 변수명 = [실행문 for문 if문]
# 형식 : 변수명 = [실행문 if 조건식 else 실행문 for문 ]

# 실행문 for 변수명 in 리스트:
# >>> for i in range(1,6): i
# >>> [i for i in range(1,6)]
#
# >>> i = []
# >>> for a in range(1,6):
# ...     i.append(a)
#
# >>> b = [i for i in range(1,6)]
    

# 4. 리스트 컴프리핸션으로 변경하는 방법
# for문을 한 줄로 줄인다.
# 콜론(:)을 삭제한다.
# 실행문을 왼쪽으로 이동시킨다.
# b.append()를 삭제한다.
# 대괄호([]) 안으로 이동시킨다.

# 리스트 컴프리핸션을 사용하지 않은 경우
# b = []
# for a in range(1,6):
#     b.append(a)
  
# 리스트 컴프리핸션을 사용한 경우
# b = [a for a in range(1,6)]
# print(b)

# 5. 시간측정 
# import time
# start = time.time()  # 시작 시간을 기록한다.

# # 1. 리스트 컴프리핸션을 사용하지 않은 경우
# # append로 1억번 반복하는 시간 : 10.58 초
# listData = []
# for a in range(100000000):  # 1억번 반복
#     listData.append(a)
# end = time.time()   # 끝 시간을 기록한다.
# endtime = end - start
# print(format(endtime, '.2f'), '초')    
# print(listData[0], listData[-1])  # 0 999999999
    
# # 2. 리스트 컴프리핸션을 사용한 경우
# # 리스트컴프리핸션으로 1억번 반복하는 시간 : 4.50 초
# listData = [a for a in range(100000000)]
# end = time.time()   # 끝 시간을 기록한다.
# endtime = end - start
# print(format(endtime, '.2f'), '초')    
# print(listData[0], listData[-1])  # 0 999999999
    
# 6. randint()
# 난수를 발생시키는 함수
# 형식 : randint(시작숫자, 끝숫자)
# 시작숫자 ~ 끝숫자까지 랜덤하게 숫자를 생성하고 정수형으로 리턴한다.
# import random 
# print(random.randint(1,10))  # 1 ~ 10까지 무작위 수를 생성해서 리턴한다.
# print(type(random.randint(1,10)))  # <class 'int'>

# from random import randint
# print(randint(1,10))  # 1 ~ 10까지 무작위 수를 생성해서 리턴한다.
# print(type(randint(1,10)))  # <class 'int'>

# from random import randint
# for _ in range(4):
#     print(randint(0,255))  # IP주소에 들어가는 숫자

# 리스트 컴프리핸션으로 변경하는 방법
# for문을 한 줄로 줄인다.
# 콜론(:)을 삭제한다.
# 실행문을 왼쪽으로 이동시킨다.
# print()를 삭제한다.
# 대괄호([]) 를 붙인다.
# 변수에 할당한다.
# from random import randint
# ip = [randint(0,255) for _ in range(4)]
# print(ip, type(ip[0]))  # [158, 237, 120, 185] <class 'int'>

# 7. str()
# 정수를 인수로 넘겨주면 문자열로 리턴한다.
# >>> a = 100
# >>> a
# 100
# >>> type(a)
# <class 'int'>
# >>> a = str(a)
# >>> a
# '100'
# >>> type(a)
# <class 'str'>

# a = 100
# print(a, type(a))  # 100 <class 'int'>
# a = str(a)
# print(a, type(a))  # 100 <class 'str'>

# 아래처럼 변환하면 안된다.
# a = [1,2,3,4]
# a = str(a)
# print(a, type(a))
# >>> a = [1,2,3,4]
# >>> a
# [1, 2, 3, 4]
# >>> a = str(a)
# >>> a
# '[1, 2, 3, 4]'

# 8. int()
# 문자열을 인수로 넘겨주면 정수로 리턴한다.
# 형식 : int('문자열로된숫자')
# listData = ['1','2','3','4']  
# print(listData)  # ['1', '2', '3', '4']
# print(listData[0], type(listData[0]))  # 1 <class 'str'>

# # listData[0]에 저장된 값을 정수로 변환해서 다시 listData[0] 에 저장한다.
# i = 0
# length = len(listData)  # 4
# while i < length:  # 0 < 4
#     listData[i] = int(listData[i])
#     print(listData[i], type(listData[i]))  # 1 <class 'int'>
#     i += 1

# 9. list(이터러블)
# 인수로 넘겨진 값을 리스트로 변환해서 리턴하는 함수.
# 형식 : list((1,2,3,4,5)) list({1,2,3,4,5})
# a = (1,2,3,4,5)
# print(a, type(a))  # (1, 2, 3, 4, 5) <class 'tuple'>
# b = list(a)
# print(b, type(b))  # [1, 2, 3, 4, 5] <class 'list'>

# 10. map(함수, 이터러블)
# 형식 : map(int, iterable)
# 첫 번째 인수로 함수, 두 번째 인수로 이터러블(반복 가능한 자료형)이 온다.
# a = ['1','2','3','4']
# print(a)
# ip = list(map(int, a))  # [1, 2, 3, 4]
# print(ip)

# b = [1,2,3,4]
# print(b)  # [1, 2, 3, 4, 5]
# ip = list(map(str, b))  # ['1', '2', '3', '4']
# print(ip)

# a = (randint(0, 255)for _ in range(4))
# b = map(str, a)
# ip = ".".join(b)
# print(ip)

# 11. 최종 IP주소 생성
# 실행 순서
# 1. (randint(0, 255)for _ in range(4))
# - 랜덤 정수(0 ~ 255 사이의 값) 4개를 generator(iterator를 생성하는 함수)로 생성시킨다.
# - 결과 : 1 2 3 4 
# 1.2 [randint(1, 254)for _ in range(4)]
# - 랜덤 정수(1 ~ 254 사이의 값) 4개를 리스트컴프리핸션으로 생성시킨다.
# - 결과 : [1,2,3,4] 
# 2. map(str, (randint(0, 255)for _ in range(4)))
# - 생성된 정수(0 ~ 255 사이의 값)을 str 함수가 실행해서 문자열로 변환해서 map 객체로 리턴한다.
# - '1' '2' '3' '4'
# 2-2. map(str, [randint(1, 254)for _ in range(4)])
# - 생성된 정수(1 ~ 254 사이의 값)을 str 함수가 실행해서 문자열로 변환해서 map 객체로 리턴한다.
#
# 3. ".".join(map(str, (randint(0, 255)for _ in range(4))))
# - 각각의 문자열을 . 붙여서 하나의 문자열로 돌려준다.
# - '1.2.3.4'
# 3-2. ".".join(map(str, [randint(0, 255)for _ in range(4)]))
# - 각각의 문자열을 . 붙여서 하나의 문자열로 돌려준다.
# - '1.2.3.4'
#
# a = ['1','2','3','4']
# b = ".".join(a)
# print(b, type(b))

from random import randint
ip = ".".join(map(str, (randint(0, 255)for _ in range(4))))
print(ip, type(ip))  # 최종적으로 랜덤으로 생성된 IP주소가 나온다.

print('프로그램 종료')         
-- testIPv4.py --


>>> type([i for i in range(4)])
<class 'list'>
>>> type((i for i in range(4)))
<class 'generator'>
>>> map(str, (randint(0, 255)for _ in range(4)))
<map object at 0x00000152021FDF30>
>>> from random import randint
>>> for i in map(str, (randint(0, 255)for _ in range(4))):
...    i
...
'143'
'58'
'94'
'93'

실제 0, 255는 가용IP주소가 아니므로 randint(1, 254)로 적는게 맞는 것이다.
>>> ".".join(map(str, (randint(0, 255)for _ in range(4))))
'92.35.227.0'

>>> ".".join(map(str, [randint(0, 255)for _ in range(4)]))
'82.42.242.109'

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

scapy  (0) 2022.01.13
Python : 모듈  (0) 2022.01.13
Python : 함수  (0) 2022.01.13
[기초] 6-2. 전달값과 반환값  (0) 2021.11.09
[기초] 6-1. 함수  (0) 2021.11.09