기본 콘텐츠로 건너뛰기

라벨이 programing인 게시물 표시

파이썬(python) 의 System Random

 보통 사용하는 random 함수는 완전한 랜덤 함수가 아닌 공식에 의해서 만들어지는 유사 랜덤값 입니다. 따라서 seed 가 동일하면 난수의 값도 동일하게 출력 됩니다. 오늘 kotlin 에 대해서 보다 보니 secure random 이라는게 있더군요. os 의 내부 값을 이용해서 랜덤 값을 얻기 때문에 더욱 완전한 랜덤값을 얻게 됩니다.  그래서 파이썬에도 방법이 있지 않을까 검색해 보니 바로 있더군요.(이걸 왜 못봤지...?? ㅜ.ㅜ) 그래서 아주 간단히 테스트 해 봤습니다.  >>> import random >>> random.Random(1).random() 0.13436424411240122 >>> random.Random(1).random() 0.13436424411240122 >>> random.SystemRandom(1).random() 0.6490113165803764 >>> random.SystemRandom(1).random() 0.1295135574954781 >>> random.SystemRandom(1).random() 0.7727918191932017 문서의 내용을 간단히 말하자면...SystemRandom 에 넣어주는 seed 값은 아무 의미가 없다고 합니다. OS 에서 random값을 얻기 때문입니다. 리눅스의 경우는 /dev/random, /dev/urandom 등에서 얻는 모양인데 자세한건 잘 모르겠습니다. ^^; 위의 테스트 한 내용을 보면 그냥 Random(1) 으로 같은 시드값을 준 경우엔 random 값이 동일한걸 알 수 있습니다. SystemRandom 에서도 seed 를 '1' 로 동일하게 넣어 주었으나 시드값을 무시하고 각기 다른 랜덤값이 출력되는 걸 볼 수 있습니다. >>> i=[i for i in range(1,20)] >>> i [1, 2, 3, 4, 5,...

[pygame] Cannon 게임프로젝트 7 - 사운드

 게임에서 사운드는 배경음악과 효과음 2가지가 있습니다. 이를 위해 pygame 에선 mixer 라이브러리를 제공합니다. > 사운드 기능을 사용하기 전에 해야 할 일은 초기화 입니다.  pygame.mixer.init 라는 함수가 있어 설정값을 주고 초기화 할 수있지만, 보통은 pygame.init() 를 사용하여 한번에 여러 라이브러리를 초기화 하는게 간단하고 편하기 때문에 보통 초기화는 다음과 같은 방법을 씁니다. pygame.mixer.pre_init(44100,-16,2,512)   pygame.init()    pygame.init() 전에 pre_init 로 초기화시 사용할 초기값을 미리 설정해 주는 것 입니다. 맨 마지막 인수가 buffer 값인데 예전에는 512 로 해 주지 않으면 효과음에 지연이 생겨서 넣어 줬던 것인데 최근 pygame 문서를 보면 기본값이 512 로 바뀌었더군요. 따라서 pre_init 를 해주지 않아도 될지도 모르겠지만 pygame 버전에 따른 차이가 생길 수 있으니 저는 그냥 명시적으로 넣어줍니다.    1. 배경음악 pygame.mixer.music 의 사용법은 간단합니다. pygame.mixer.music.load('bg.ogg') pygame.mixer.music.play() 하면 됩니다. load 함수에 리턴값 없이 그냥 저렇게 쓰면 됩니다. play 함수는 play(3) 처럼 반복 재생회수를 넣어줄 수 있으며 -1 이면 계속 반복 재생합니다. https://www.pygame.org/docs/ref/music.html  그 외에 다른 함수들은 위의 링크를 보면 됩니다. 영어 단어만 봐도 대충 무슨 함수인지 알 수 있습니다. rewind, stop, pause 같은 함수들입니다. 다만 몇가지만 설명해 드리자면....  > pygame.mixer.queue('xxx.ogg')  위의 queue 함수는 지금 재생...

python3 변수를 복사하기

>>> for j in range(10): ...     random.seed() ...     for i in range(6): ...         num.append(random.randint(0,9)) ...     num_col.append(num) ...     num.clear() ... >>> num_col [[], [], [], [], [], [], [], [], [], []] 위의 소스는 랜덤값 6개를 만들어 리스트를 만들고 그 값을 num_col 리스트에 추가 합니다. 하지만 결과는 아무값도 들어가지 않습니다. 왜냐 하면 그 아래 num.clear() 때문입니다.  프로그램을 배우신 분이라면 당연히 아시겠지만....num_col 에는 num 의 값이 들어가는게 아니라 주소값이 들어 가기 때문입니다. > 원하는 결과를 얻는 방법은 2가지가 있습니다.  for j in range(10):     random.seed()     for i in range(6):         num.append(random.randint(0,9))     num_col.append(num)     num=[] 위와 같이 num.clear() 대신 num=[] 같이 새로운 값을 할당해 버리면 됩니다. 그러면 새로운 객체가 생성되고 num 의 주소값이 바뀌기 때문에 저 위와 같은 문제가 없습니다.  > 또 한가지 방법이 copy 명령을 써서 변수를 복사 하는 겁니다.  import random import cop...

blogger 에서 highlight js 사용시 python 의 주석부분 에서의 문제

 제 블로그에 게시하는 소스 코드를 보기 좋게 할 목적으로 highlight js 를 설치 했습니다. 그런데 문제가 있더군요.    보시면 아시겠지만 뭔가 이상합니다. 주석문인 # 이후로 하이라이트 기능이 제대로 동작하지 않고 있습니다. 검색을 해 본 결과 html 태그의 br 때문이라고 합니다. 블로그에 소스를 복사해 넣을때 html 모드에서가 아닌 일반모드에서 복사해 넣으면 줄바꿈인 br 태그가 붙는데 그것 때문에 생기는 문제입니다. 해결 방법은 2가지 인데 .... 1. 소스코드를 붙여 넣을때 html 모드로 전환해서 붙여넣는 방법 2. highlight js 의 설정을 바꾸는 방법 일반 에디트 모드에서 소스코드를 붙여 넣는 방식을 사용하려면 2번째 방법을 써야 합니다. 저는 2번째 방식을 쓰기로 했습니다. 이 경우는 블로그 스킨의 html 소스 수정기능을 이용해서 다음 문장을 추가 해 넣어야 합니다. <script>hljs.configure({useBR: true});</script> 대충 내용은 줄바꿈 태그인 br 을 사용하겠다는 겁니다.  제 경우는 아무래도 일반 에디터 상태에서 편집을 하는게 더 쉬울거 같아서 이 방법을 쓰기로 했습니다.  추가 하는 곳은 highlight js 를 로드하기 전에 넣어주면 됩니다.  <script>hljs.initHighlightingOnLoad();</script> 블로그 스킨 html 소스에서 위의 문장 앞에 복사해 넣으시면 됩니다. 결과는 다음과 같습니다. 하이라이트 기능이 잘 작동되고 있습니다. > 참고로.... 위와 같이 br 태그를 사용하게 설정하면 1번과 같이 html 상태에서 복사해 넣은 소스는 줄바꿈 없이 1줄로 나오기 때문에 두 방법은 공존해서 사용할 수가 없습니다. 한가지를 선택해야 합니다. 

pygame 에서 이미지 회전하는 방법

 pygame 에서 transform.rotate 를 사용해서 이미지를 회전시켜 보면 생각과는 달리 요상하게 회전합니다.    따라서 이를 해결해 보고자 검색해 보다 다음 링크를 찾았습니다. https://stackoverflow.com/questions/4183208/how-do-i-rotate-an-image-around-its-center-using-pygame/54714144 위 링크를 보면 파이게임의 이미지 회전이 왜 그렇게 이상한지 알 수 있고 답변하신 분이 blitRotate 라는 함수를 만들어 놓아서 이용할 수 있습니다.  제 소스에 가져와서 테스트를 해 봤는데 제 생각대로 회전 하더군요.  def blitRotate(image, pos, originPos, angle):       #calcaulate the axis aligned bounding box of the rotated image     w, h       = image.get_size()     box        = [pygame.math.Vector2(p) for p in [(0, 0), (w, 0), (w, -h), (0, -h)]]     box_rotate = [p.rotate(angle) for p in box]     min_box    = (min(box_rotate, key=lambda p: p[0])[0], min(box_rotate, key=lambda p: p[1])[1])     max_box    = (max(box_rotate, key=lambda p: p[0])[0], max...

파이썬에서 자료형을 파일로 저장하기

리스트,  튜플, 딕셔너리 같은 자료형을 파일로 저장하는 방법을 적어 보겠습니다. 예전에는 pickle 이라는 것도 썼었지만 지금은 다른 방법을 권하더군요. 그중 json 을 사용하는 방법을 적어 볼까 합니다. 간단히 대화형 인터프리터를 이용해서 사용해 보겠습니다. >>> i = [2,4,6,8,10] >>> i [2, 4, 6, 8, 10] >>> import json >>> with open('list.json','w') as f: ...     json.dump(i,f) >>> i=[] >>> i [] >>> with open('list.json','r') as f: ...     i=json.load(f) ... >>> i [2, 4, 6, 8, 10]  간단히 리스트 i 에 값을 넣고 json 을 이용해 list.json 파일로 기록한 다음 변수를 초기화 하고 저장된 파일을 읽어들이는 예제 입니다.  자료형을 매우 간단히 파일로 저장할 수 있습니다. 실제 파일을 텍스트 에디터로 읽어보면  [2, 4, 6, 8, 10] 위와 같이 기록되어 있습니다. > 딕셔너리도 위와 똑같이 사용가능합니다.  >>> i={'ip':'192.168.100.50','port':'6790'} >>> i {'ip': '192.168.100.50', 'port': '6790'} >>> import json >>> with open('dict.json','w') as f: ...     json.dump(i,f) >>> i=[] >>> i [] >...

파이썬에서 랜덤값 사용방법

random은  파이썬에서 랜덤한 숫자를 얻기 위해 사용하는 모듈입니다. 간단히 사용법을 정리해 봤습니다. 1. random.seed() 컴퓨터에서 생성하는 랜덤값은 엄밀히 말하면 완전 랜덤은 아닙니다. 계산식에 의해서 만드는 유사 랜덤 값입니다. 따라서 seed 에 들어가는 숫자가 동일하면 나오는 랜덤 값도 동일합니다.  별도로 파이썬에선 위 명령을 주지 않아도 import 될때 현재 시간이 seed 가 되어서 적용되지만 원한다면 명시적으로 seed 를 호출할 수 있습니다. seed 에 원하는 숫자를 인자로 사용할 수 있으며 만일 위처럼 인자를 넣지 않을 경우 seed 는 현재시간을 사용합니다. 2. random.random()       0.0 <= x < 1.0 사이의 값을 출력합니다. 3. random.uniform(a.4, b.7)      a.4 <= x < b.7  사이의 값을 출력합니다. 4. random.randrange(b)      0 <= x < b 사이의 정수를 출력합니다. 5. random.randrange(a,b)      a <= x < b  사이의 정수를 출력합니다. 6. random.randint(a,b)      a <= x <= b  사이의 정수를 출력합니다. >>> import random >>> random.random() 0.3594656143224264 >>> random.uniform(3.5,4.2) 3.6876359136188914 >>> random.randrange(8,10) 8 >>> random.randint(5,10) 6   위와 같이 사...

파이썬에서 print 문 사용형식 정리

 파이썬에서 문자 출력 방법에 대해 정리해 보겠습니다. 다른 언어 쓰다가 쓰려면 매번 헷갈려서... 가장 최근에 새로 생긴 문법부터 소개 하겠습니다. 대화형 인터프리터 환경에서 간단히 확인 가능합니다. > >>> x=1 >>> y=5 >>> print(f"x+y={x+y}") x+y=6 >>>print(f"x={x}") x=1  문자열 앞에 f 를 넣고 프린트 할 변수를 {} 안에 넣으면 되는 무척 간단한 문법입니다 > >>> print("x = %d, y = %d" % (x,y)) x = 1, y = 5   예전 C 언어등에서 사용했던 방식과 비슷한 방식 입니다.  > >>> print("x={0}, y={1}".format(x,y)) x=1, y=5 >>> print("x={}, y={}".format(x,y)) x=1, y=5 format 문을 이용하는 방법입니다. 괄호({}) 안에 숫자로 format 문의 첫번째 인자, 두번째 인자등을 선택합니다. 숫자없이 괄호만 쓸 경우 차례대로 대입됩니다. >  >>> print("a","b","c","d") a b c d >>> print("a","b","c","d",sep=',') a,b,c,d print 문에서 ',' 로 여러문자를 print 하면 빈칸으로 구분되는데 이를 다른 문자로 바꾸는 방법입니다. 여기서는 보이는것 처럼 ',' 로 바꿔봤습니다. > print(x,end=',') print(y) 파이썬에서 print 문은 인쇄하고 줄바꿈을 합니다. 만일...

tkinter 콤보박스 간단사용예

 tkinter 의 간단한 콤보박스 사용예입니다.  콤보박스에서 컬러를 선택하면 그 아래 Label 의 배경색이 변합니다.  그 아래 Progressbar 는 그냥 심심해서(?) 넣어 본것 입니다. indeterminate 모드로 넣은 것인데 indeterminate 모드는 정확한 진행정도를 나타내는게 아니라 그냥 진행중이라는걸 표시하는 것입니다. 진행바가 그냥 좌우로 움직이기만 합니다.  from tkinter import * from tkinter.ttk import * from tkinter.messagebox import *   class Application(Frame):     def __init__(self, master=None):         super().__init__(master)         self.master = master         self.pack(side="top")         self.create_widgets()       def create_widgets(self):         self.cb = Combobox(width=10,value=['white','blue','yellow','black','red'])         self.cb.current(0)         self.cb.bind("<<ComboboxSelected>>", self.chan...

tkinter 기본 위젯 사용예

  그냥 tkinter 가 어떻게 쓰이는지 기본적인 작동을 하도록 만들어 본 것 입니다. 기본 골격은 파이썬 도큐먼트에 있는 예제 소스에서 가져왔고 거기에 살을 좀 붙였습니다. 가장 많이 쓰는 Label 과 버튼, 에디트 컨트롤의 기본적인 사용예 입니다. import tkinter as tk from tkinter import ttk from tkinter import messagebox class Application(ttk.Frame):     def __init__(self, master=None):         super().__init__(master)         self.master = master         self.pack(side="top")         self.create_widgets()     def create_widgets(self):         style = ttk.Style()        #style 설정         style.configure("BW.TLabel", foreground="black", background="white")                  self.l1 = ttk.Label(text = "Label1", style = "BW.TLabel")    ...

kotlin 람다 함수

 개인적으로 람다 함수는 영~~익숙해 지지 않는 면이 있어서 kotlin 을 좀 보는 김에 한번 정리를 해 봤습니다. //3번 fun strLength3(s:String) : Int{ return s.length } fun printStrLength(s:String,p:(String)->Int){ println("String = " + s) println("String Length = ${p(s)}" ) } fun main() { var strLength : (String) -> Int = {s -> s.length} //1번 var strLength2 = {s:String -> s.length} //2번 println("*".repeat(30)) println(strLength("Strike")) println(strLength2("Air")) println("*".repeat(30)) printStrLength("Hello, World!"){s:String -> s.length} //4번 println("*".repeat(30)) printStrLength("Water",strLength) //5번 println("*".repeat(30)) printStrLength("Bread",::strLength3) //6번 println("*".repeat(30)) } 1번이 정석대로의 선언방식이라고 합니다.   2번은 스마트 캐스팅을 이용한 선언이라던데(배우는 중이라 확실히는 모르겠습니다) 어쨌던 1번과 2번은 결과적으로 같은 내용입니다. 표현방법의 차이라고 할까요.   3번은 1번 2번과 같은데 흔히 사용...