๐Ÿ’ป [Python] ๊ณ„์‚ฐ๊ธฐ ๋งŒ๋“ค๊ธฐ - 2

haejun-kimยท2020๋…„ 6์›” 19์ผ
0
post-thumbnail

Python์œผ๋กœ ๊ณ„์‚ฐ๊ธฐ ๋งŒ๋“ค๊ธฐ(CLI) - Part.2

์ €๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” ํŒŒ์ด์ฌ์˜ built-in ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์„ ๋ฐ›์•„ ์‚ฌ์น™์—ฐ์‚ฐ์˜ ์ˆœ์„œ์— ๋งž์ถฐ ๊ฐ’์„ ์ถœ๋ ฅํ•ด์ฃผ๋Š” ๋‚ด์šฉ์„ ์ž‘์„ฑํ–ˆ๋‹ค.
์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„  ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๊ฐ’์˜ ์ˆœ์„œ๋Œ€๋กœ ๊ณ„์‚ฐ์„ ํ•ด์ฃผ๋Š” ๊ณ„์‚ฐ๊ธฐ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

์–ด๋–ค ๋กœ์ง์œผ๋กœ ๊ตฌํ˜„ ํ•  ๊ฒƒ์ธ๊ฐ€?

  1. user์˜ input๊ฐ’์„ ์ˆซ์ž, ๊ณต๋ฐฑ, ์—ฐ์‚ฐ๊ธฐํ˜ธ๋กœ ๊ฐ๊ฐ ๋ถ„๋ฆฌ์‹œํ‚จ ํ›„ list์— ์ง‘์–ด ๋„ฃ๋Š”๋‹ค.
  2. list์˜ index๋“ค์„ ์•ž์—์„œ๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ ๊ณ„์‚ฐํ•œ๋‹ค.

์ˆซ์ž์™€ ์—ฐ์‚ฐ๊ธฐํ˜ธ๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ๋ฆฌ์ŠคํŠธ์— ์ง‘์–ด๋„ฃ๊ธฐ

์˜ˆ๋ฅผ๋“ค์–ด input๊ฐ’์ด 500 + 5 ๏นก 10 ์ด ๋“ค์–ด์™”๋‹ค๋ฉด 500,+,5,๏นก,10 ์˜ ํ˜•ํƒœ๋กœ list์— ๋„ฃ์„ ์ƒ๊ฐ์ด๋‹ค.

์—ฐ์‚ฐ ๊ธฐํ˜ธ๋กœ ๊ตฌ๋ถ„์ง“๊ธฐ

operator = ["+", "-", "*", "/", "="]
string_list = []
lop = 0

for i, s in enumerate(user_input): 
    if s in operator:
        if user_input[lop:i].strip() != "":
            string_list.append(user_input[lop:i])
            string_list.append(s)
            lop = i + 1

์—ฐ์‚ฐ ๊ธฐํ˜ธ๋ฅผ ๋‹ด์•„๋‘˜ list์™€ ์ˆซ์ž ๋ฐ ์—ฐ์‚ฐ๊ธฐํ˜ธ๋ฅผ ๋‹ด์•„๋‘˜ list ๋‘๊ฐœ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

์—ฐ์‚ฐ์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„์ง€์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ์ง€๋ง‰ ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ๋Š” index๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•œ ๋ณ€์ˆ˜(lop)๋ฅผ ์ƒ์„ฑํ•œ ํ›„ ์ดˆ๊ธฐํ™” ์‹œ์ผœ์ค€๋‹ค.

๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ„๋ฆฌ์‹œ์ผœ ๋ฆฌ์ŠคํŠธ์— ๋„ฃ์–ด๋ณด์ž.

user_input๊ฐ’์„ ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ๋ถ„๋ฆฌ์‹œํ‚ฌ๊ฑด๋ฐ, ์กฐ๊ธˆ ์–ด๋ ต๋‹ค.

๐Ÿ˜‹ ์ฝ”๋“œ์˜ ์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•ด ์ž„์˜๋กœ user_input = 500 + 5 * 10 ์œผ๋กœ ๊ฐ€์ •ํ•˜๊ฒ ๋‹ค.

  1. s ๋Š” ํ˜„์žฌ ๋ฌธ์ž๋ฅผ ์˜๋ฏธํ•จ. s ๊ฐ€ ์—ฐ์‚ฐ์ž๊ฐ€ ์•„๋‹ˆ๋ฉด for ๋ฐ˜๋ณต, s๊ฐ€ ์—ฐ์‚ฐ์ž๋ฉด ๋‹ค์Œ if ๋กœ ๋™์ž‘.

  2. ์ฒ˜์Œ์— user_input ์ด 500์ด๊ธฐ ๋•Œ๋ฌธ์— 500์˜ ์ฒซ๋ฒˆ์งธ,๋‘๋ฒˆ์งธ,์„ธ๋ฒˆ์งธ ๊นŒ์ง€๋Š” operator ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— for loop ๋ฐ˜๋ณต๋˜๋‹ค๊ฐ€ ์—ฐ์‚ฐ์ž + ๊ฐ€ ๋‚˜์˜ค๋ฉด์„œ if์— ๊ฑธ๋ฆฌ๊ฒŒ ๋จ.
    ์ด๋•Œ, + ์˜ i ์˜ index ๊ฐ’์€ 3 ( 5 -> 0 , 0 -> 1, 0 -> 2, + -> 3 )
    lop ์˜ ์ดˆ๊ธฐํ™” ๊ฐ’์€ 0 ์ด์˜€๊ธฐ ๋•Œ๋ฌธ์— 0 ์—์„œ ์„ธ๋ฒˆ์งธ ๊นŒ์ง€ ๋ผ๋Š” ์˜๋ฏธ๊ฐ€ [lop:i]๊ฐ€ ๋˜๋Š” ๊ฒƒ.

  3. ๊ณต๋ฐฑ์„ ์ œ์™ธํ•˜๊ณ  ์ˆซ์ž์™€ ์—ฐ์‚ฐ์ž๋งŒ ๊ตฌ๋ถ„ํ•˜๋ ค๊ณ  strip()์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณต๋ฐฑ์„ ์ œ์™ธ์‹œํ‚ด.

  4. user_input์˜ lop~i ๊นŒ์ง€ ์Šฌ๋ผ์ด์Šคํ•˜์—ฌ string_list์— append ์‹œํ‚ด.

  5. s ๋ฅผ append ์‹œ์ผœ์คŒ์œผ๋กœ์จ ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ์—ฐ์‚ฐ์ž๋„ list์— ํฌํ•จ์‹œ์ผœ์คŒ.

  6. ์œ„์—์„œ i ๊ฐ’์€ 3์ด์˜€๊ธฐ ๋•Œ๋ฌธ์— i + 1 ํ•˜๋ฉด์„œ lop ๊ฐ’์€ 4๊ฐ€ ๋จ. ์ด ์ƒํƒœ๋กœ ๋‹ค์‹œ for ๋ฌธ ๋™์ž‘
    ๊ทผ๋ฐ ๋™์ž‘ํ•˜๋‹ค๊ฐ€ ๋ฐ”๋กœ ๋‹ค์Œ์— ์—ฐ์‚ฐ์ž์ธ *๊ฐ€ ๋‚˜์˜ด. ๊ทธ๋ž˜์„œ ๋‹ค์‹œ s ์— operator ๊ฐ€ ๋“ค์–ด์˜ค๋ฉด์„œ if ์— ๊ฑธ๋ฆฌ๊ฒŒ ๋จ.

์‹คํ–‰๊ฒฐ๊ณผ

user_input = "500 + 5 * 10" ์ด์˜€๋˜๊ฒŒ ์œ„์˜ ๋‚ด์šฉ์ฒ˜๋Ÿผ ๋ถ„๋ฆฌ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ๋˜์—ˆ๋‹ค.

๋งˆ์ง€๋ง‰ ์ˆซ์ž๊ฐ€ ๋ฆฌ์ŠคํŠธ์— ํฌํ•จ์ด ์•ˆ๋˜๋„ค?

์œ„์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์กฐ๊ธˆ ์ด์ƒํ•˜๋‹ค. ๋ถ„๋ช… input๊ฐ’์€ 500 + 5 * 10์ธ๋ฐ ๋’ค์˜ 10์ด ์ถœ๋ ฅ์ด ์•ˆ๋๋‹ค. ์™œ์ผ๊นŒ?

๋กœ์ง์ด ์—ฐ์‚ฐ์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— * ๋’ค์— 10์€ ์•ˆ๋‚˜์˜ด. 10 ๋’ค์— ์—ฐ์‚ฐ์ž๊ฐ€ ์—†์œผ๋‹ˆ๊นŒ
์ด๋Ÿฐ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•ด์„œ user_input ์˜ ๋งˆ์ง€๋ง‰์ด ์—ฐ์‚ฐ์ž๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ์˜ ์กฐ๊ฑด์„ ์ œ์‹œํ•ด ์ค€๋‹ค.

if user_input[-1] not in operator:
        user_input += "="

์œ„์˜ ์ฝ”๋“œ๋ฅผ for๋ฌธ ์ƒ๋‹จ์— ์ถ”๊ฐ€ํ•ด์ฃผ์ž.
[-1]์€ list ์˜ ๋์„ ์˜๋ฏธ ํ•จ
์ž„์˜๋กœ = ์—ฐ์‚ฐ์ž๋ฅผ ๋ถ™์—ฌ์ฃผ๋„๋ก ํ•˜๋Š”๊ฒƒ. ์‹ค์ œ ๊ฐ’์€ ์•„๋‹Œ ์ž„์˜์˜ ๊ฐ’์ž„์— ์ฃผ์˜ํ•˜์ž.

์œ„์˜ ๊ฐ’์„ ์‹คํ–‰์‹œ์ผœ๋ณด๋ฉด =๊นŒ์ง€ ์ถœ๋ ฅ๋˜์–ด ๋ฒ„๋ฆฐ๋‹ค. ์ž„์˜์˜ ๊ฐ’์œผ๋กœ ์ถ”๊ฐ€์‹œ์ผœ์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
๋”ฐ๋ผ์„œ, ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์˜ =๋งŒ ์Šฌ๋ผ์ด์Šค ์‹œ์ผœ์„œ ์ถœ๋ ฅํ•˜๋ฉด ๋˜๊ฒ ๋‹ค.

string_list = string_list[:-1]

์‹คํ–‰๊ฒฐ๊ณผ

๊ณ„์‚ฐํ•˜๊ธฐ

์ด์ œ ์›ํ•˜๋Š”๋Œ€๋กœ ๋ถ„๋ฆฌ๋ฅผ ์‹œ์ผฐ์œผ๋‹ˆ ๊ณ„์‚ฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค. ๊ณ„์‚ฐ์€ ์–ด๋–ป๊ฒŒ ํ• ๊นŒ?
์ด ๊ณ„์‚ฐ๊ธฐ๋Š” ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’ ์ˆœ์„œ๋Œ€๋กœ ๊ณ„์‚ฐ์„ ํ•˜๋Š”๊ฒƒ์ด ๋ชฉ์ ์ด๋‹ค.
๋”ฐ๋ผ์„œ, [100, +, 200, -, 300 -] ์ด๋Ÿฐ์‹์ด๋ผ๊ณ  ํ•˜๋ฉด ์„ธ๊ฐœ์”ฉ ๊ณ„์‚ฐํ•œ ํ›„ ๋‹ค์Œ๊บผ๋ž‘ ์ด์–ด์„œ ๊ณ„์‚ฐ์„ ํ•˜๋ ค ํ•œ๋‹ค.

์ฆ‰, 100+200์„ ๊ณ„์‚ฐํ•ด์„œ 300์ด ๋‚˜์˜ค๋‹ˆ๊นŒ 100+200์„ ์—†์• ๊ณ  ์ด ์ž๋ฆฌ์— 300์„ ๋„ฃ๋Š”๋‹ค.
๊ทธ๋Ÿผ ๋‹ค์‹œ 300-300์ด ๋˜๋‹ˆ, 300-300์„ ์—†์• ๊ณ  ์ด ์ž๋ฆฌ์— 0์„ ๋„ฃ๋Š”๋‹ค.

  1. ๋จผ์ € ํฌ์ง€์…˜์„ ์•Œ๋ ค์ค„ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•œ๋‹ค
pos = 0
  1. string_list์˜ ๊ธธ์ด์™€ pos์˜ ์œ„์น˜๋ฅผ ๋น„๊ตํ•œ๋‹ค.
    pos๊ฐ€ list์˜ ๊ธธ์ด๊ฐ€ ๋” ๊ธธ๋ฉด ๋”์ด์ƒ ๊ณ„์‚ฐ ์‹์ด ์—†๋Š”๊ฒƒ์ด๋ฏ€๋กœ break
if pos + 1 > len(string_list):
    break
  1. ๊ณ„์‚ฐํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ์„ ๋“ฏ ์‹ถ๋‹ค.
    list์˜ ๊ธธ์ด๊ฐ€ ๋” ๊ธธ ๊ฒฝ์šฐ์™€ list์˜ index ํฌ์ง€์…˜์ด ์—ฐ์‚ฐ์ž์ผ ๊ฒฝ์šฐ์ด๋‹ค.
    ์ด์ œ ๊ณ„์‚ฐ์„ ํ•ด๋ณด์ž.

๋จผ์ €, 0,1,2์˜ ์œ„์น˜๋ฅผ ์—ฐ์‚ฐ์„ ํ•˜๊ณ 

if len(string_list) > pos + 1 and string_list[pos] in operator:
        temp = string_list[pos - 1] + string_list[pos] + string_list[pos + 1]

์—ฐ์‚ฐ์„ ํ•œ ์ž๋ฆฌ์— ์žˆ๋Š”๊ฑธ ์‚ญ์ œ๋ฅผ ํ•œ๋‹ค.

del string_list[0:3]

list์˜ ์‚ญ์ œ์‹œํ‚จ ์ž๋ฆฌ์— insert์‹œํ‚จ๋‹ค.
์ฃผ์˜ํ•  ์ ์€, append๋ฅผ ํ•˜๋ฉด list์˜ ๊ฐ€์žฅ ๋’ท๋ถ€๋ถ„์— ์ถ”๊ฐ€๋˜๋ฏ€๋กœ ํ•˜์ง€ ๋ง ๊ฒƒ.
๊ทธ๋ฆฌ๊ณ  ๋‚จ์€ ๋’ท๋ถ€๋ถ„์˜ ์—ฐ์‚ฐ์„ ์ด์–ด์„œ ์ง„ํ–‰ํ•ด์–‘ ํ•˜๋ฏ€๋กœ pos๋ฅผ ์ดˆ๊ธฐํ™” ์‹œ์ผœ์ค€๋‹ค.

string_list.insert(0, str(eval(temp)))

์ด์ œ ์ด ๋™์ž‘๋“ค์„ +1 ์”ฉ ํ•ด๊ฐ€๋ฉฐ ์œ„์— ํ–ˆ๋˜ ๋™์ž‘๋“ค์„ ๋ฐ˜๋ณตํ•ด์„œ ์ˆ˜ํ–‰ํ•œ๋‹ค.

pos += 1

๊ฒฐ๊ณผ๊ฐ’์ด ๋‹ด๊ธด list์˜ ๊ธธ์ด๋Š” ๊ฒฐ๊ตญ 0๋ฒˆ์งธ ์ธ๋ฑ์Šค๋งŒ ๋‚จ์œผ๋ฏ€๋กœ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅํ•ด์ฃผ์ž.

if len(string_list) > 0:
    result = float(string_list[0])
print("๊ฒฐ๊ณผ: {}".format(result))

์œ„์˜ ์ƒํƒœ๋กœ๋Š” ์ถœ๋ ฅ๊ฐ’์ด ๋‚˜์˜ค๊ณ  ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜๋ฏ€๋กœ ํ•„์š”์— ๋”ฐ๋ผ ๋ฐ˜๋ณต๋ฌธ์„ ์ถ”๊ฐ€ํ•ด์ฃผ๊ณ , ์‚ฌ์šฉ์ž์˜ input์„ ๋ฐ›๋„๋ก ํ•„์š”์— ๋งž๊ฒŒ ์ ์ ˆํžˆ ์ˆ˜์ •ํ•ด์ฃผ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

๐Ÿ˜‹ ๋‹ค์Œ์€

์ด ๋‹ค์Œ ํฌ์ŠคํŠธ์—์„œ๋Š” PyQt5๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GUI ํ™˜๊ฒฝ์—์„œ ๊ณ„์‚ฐ๊ธฐ๋ฅผ ๊ตฌ์„ฑํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€