파이썬 반복

조회수 3012회

안녕하세요, 저는 현재 대학교에서 기말 프로젝트를 진행중입니다. 제가 만든 프로그램은 화학식량 계산기입니다. 다름이 아니라 프로그램 자체는 잘 돌아가는데, 한 번 돌아가면 종료가 되서 '다른 화학식량을 계산하려면 1번, 종료하려면 2번을 입력해주세요.' 이런 식으로 추가하고 싶습니다. 근데 제가 짠 코드는 함수를 define한게 아니라서 도움을 받고자 합니다. 함수로 바꿔서 한다면 어떻게 해야 되는지, 아니면 함수를 define하지 않고도 더 반복할 수 있는지 알려주시면 감사하겠습니다.

element_mass = {'H': 1.00794, 'He': 4.002602, 'Li': 6.941, 'Be': 9.012182, 'B': 10.811, 'C': 12.0107, 'N': 14.0067, 'O': 15.9994, 'F': 18.9984032, 'Ne': 20.1797, 'Na': 22.98976928,
'Mg': 24.305, 'Al': 26.9815386, 'Si': 28.0855, 'P': 30.973762, 'S': 32.065, 'Cl': 35.453, 'Ar': 39.948, 'K': 39.0983, 'Ca': 40.078, 'Sc': 44.955912, 'Ti': 47.867, 'V': 50.9415, 'Cr': 51.9961, 
'Mn': 54.938045, 'Fe': 55.845, 'Co': 58.933195, 'Ni': 58.6934, 'Cu': 63.546, 'Zn': 65.409, 'Ga': 69.723, 'Ge': 72.64, 'As': 74.9216, 'Se': 78.96, 'Br': 79.904, 'Kr': 83.798, 
'Rb': 85.4678, 'Sr': 87.62, 'Y': 88.90585, 'Zr': 91.224, 'Nb': 92.90638, 'Mo': 95.94, 'Tc': 98.9063, 'Ru': 101.07, 'Rh': 102.9055, 'Pd': 106.42, 'Ag': 107.8682, 'Cd': 112.411,
 'In': 114.818, 'Sn': 118.71, 'Sb': 121.760, 'Te': 127.6, 'I': 126.90447, 'Xe': 131.293, 'Cs': 132.9054519, 'Ba': 137.327, 'La': 138.90547, 'Ce': 140.116, 'Pr': 140.90465, 
'Nd': 144.242, 'Pm': 146.9151, 'Sm': 150.36, 'Eu': 151.964, 'Gd': 157.25, 'Tb': 158.92535, 'Dy': 162.5, 'Ho': 164.93032, 'Er': 167.259, 'Tm': 168.93421, 'Yb': 173.04, 
'Lu': 174.967, 'Hf': 178.49, 'Ta': 180.9479, 'W': 183.84, 'Re': 186.207, 'Os': 190.23, 'Ir': 192.217, 'Pt': 195.084, 'Au': 196.966569, 'Hg': 200.59, 'Tl': 204.3833, 'Pb': 207.2,
 'Bi': 208.9804, 'Po': 208.9824, 'At': 209.9871, 'Rn': 222.0176, 'Fr': 223.0197, 'Ra': 226.0254, 'Ac': 227.0278, 'Th': 232.03806, 'Pa': 231.03588, 'U': 238.02891, 
'Np': 237.0482, 'Pu': 244.0642, 'Am': 243.0614, 'Cm': 247.0703, 'Bk': 247.0703, 'Cf': 251.0796, 'Es': 252.0829, 'Fm': 257.0951, 'Md': 258.0951, 'No': 259.1009, 
'Lr': 262, 'Rf': 267, 'Db': 268, 'Sg': 271, 'Bh': 270, 'Hs': 269, 'Mt': 278, 'Ds': 281, 'Rg': 281, 'Cn': 285, 'Nh': 284, 'Fl': 289, 'Mc': 289, 'Lv': 292, 'Ts': 294, 'Og': 294}

import re
totalmass=0
print('화학식량 계산기입니다. 화학식은 알파벳 대소문자를 구분하고, 숫자는 알파벳 뒤에 바로 작성해주세요. 예)CO2, CH4, CuSO4')
formula=input("화학식을 입력해주세요:")

while formula.isalnum() is False:
    print('알파벳과 숫자로만 이루어진 화학식을 입력해주세요. 화학식은 대소문자를 구분합니다.')
    formula=input("화학식을 입력해주세요:")
else: 
    x=re.findall('([A-Z][a-z]?)([0-9]*)', formula)
    for element,count in x:
        if count=='':
            count=1

        totalmass+=int(count)*element_mass[element]

print('화학식량은',' ',totalmass,'입니다.')

만약 CO2를 입력하면,

화학식량 계산기입니다. 화학식은 알파벳 대소문자를 구분하고, 숫자는 알파벳 뒤에 바로 작성해주세요. 예)CO2, CH4, CuSO4
화학식을 입력해주세요:CO2
화학식량은   44.0095 입니다.

이런 식으로 출력됩니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 최대한 단순하게 작성했습니다.

    element_mass = {'H': 1.00794, 'He': 4.002602, 'Li': 6.941, 'Be': 9.012182, 'B': 10.811, 'C': 12.0107, 'N': 14.0067, 'O': 15.9994, 'F': 18.9984032, 'Ne': 20.1797, 'Na': 22.98976928,
    'Mg': 24.305, 'Al': 26.9815386, 'Si': 28.0855, 'P': 30.973762, 'S': 32.065, 'Cl': 35.453, 'Ar': 39.948, 'K': 39.0983, 'Ca': 40.078, 'Sc': 44.955912, 'Ti': 47.867, 'V': 50.9415, 'Cr': 51.9961, 
    'Mn': 54.938045, 'Fe': 55.845, 'Co': 58.933195, 'Ni': 58.6934, 'Cu': 63.546, 'Zn': 65.409, 'Ga': 69.723, 'Ge': 72.64, 'As': 74.9216, 'Se': 78.96, 'Br': 79.904, 'Kr': 83.798, 
    'Rb': 85.4678, 'Sr': 87.62, 'Y': 88.90585, 'Zr': 91.224, 'Nb': 92.90638, 'Mo': 95.94, 'Tc': 98.9063, 'Ru': 101.07, 'Rh': 102.9055, 'Pd': 106.42, 'Ag': 107.8682, 'Cd': 112.411,
     'In': 114.818, 'Sn': 118.71, 'Sb': 121.760, 'Te': 127.6, 'I': 126.90447, 'Xe': 131.293, 'Cs': 132.9054519, 'Ba': 137.327, 'La': 138.90547, 'Ce': 140.116, 'Pr': 140.90465, 
    'Nd': 144.242, 'Pm': 146.9151, 'Sm': 150.36, 'Eu': 151.964, 'Gd': 157.25, 'Tb': 158.92535, 'Dy': 162.5, 'Ho': 164.93032, 'Er': 167.259, 'Tm': 168.93421, 'Yb': 173.04, 
    'Lu': 174.967, 'Hf': 178.49, 'Ta': 180.9479, 'W': 183.84, 'Re': 186.207, 'Os': 190.23, 'Ir': 192.217, 'Pt': 195.084, 'Au': 196.966569, 'Hg': 200.59, 'Tl': 204.3833, 'Pb': 207.2,
     'Bi': 208.9804, 'Po': 208.9824, 'At': 209.9871, 'Rn': 222.0176, 'Fr': 223.0197, 'Ra': 226.0254, 'Ac': 227.0278, 'Th': 232.03806, 'Pa': 231.03588, 'U': 238.02891, 
    'Np': 237.0482, 'Pu': 244.0642, 'Am': 243.0614, 'Cm': 247.0703, 'Bk': 247.0703, 'Cf': 251.0796, 'Es': 252.0829, 'Fm': 257.0951, 'Md': 258.0951, 'No': 259.1009, 
    'Lr': 262, 'Rf': 267, 'Db': 268, 'Sg': 271, 'Bh': 270, 'Hs': 269, 'Mt': 278, 'Ds': 281, 'Rg': 281, 'Cn': 285, 'Nh': 284, 'Fl': 289, 'Mc': 289, 'Lv': 292, 'Ts': 294, 'Og': 294}
    
    import re
    def calculate():
        totalmass=0
        formula=input("화학식을 입력해주세요(종료:2):")
    
        if formula == '2': return "Quit"
        elif formula.isalnum() is False:
            print('알파벳과 숫자로만 이루어진 화학식을 입력해주세요. 화학식은 대소문자를 구분합니다.')
            return "Retry"
        else: 
            x=re.findall('([A-Z][a-z]?)([0-9]*)', formula)
            for element,count in x:
                if count=='':
                    count=1
    
                totalmass+=int(count)*element_mass[element]
    
        print('화학식량은',' ',totalmass,'입니다.')
        return "Continue"
    
    while True:
        print('화학식량 계산기입니다. 화학식은 알파벳 대소문자를 구분하고, 숫자는 알파벳 뒤에 바로 작성해주세요. 예)CO2, CH4, CuSO4')
        result = calculate()
        if result == 'Quit': break
    
    • 감사합니다! 도움이 많이 됐어요. 그런데 return "Quit", return "Retry"와 return "Continue"에 대한 내용은 자세히 몰라서 찾아봤는데 잘 안나오더라고요. 혹시 어떤 기능을 하고 작성해주신 프로그램에서 어떤 역할을 하는지 알려주실 수 있나요? 알 수 없는 사용자 2019.12.9 22:25
    • 종료, 재시도, 계속 상태를 리턴해준거에요. status 인데 보통 정수형태의 코드로 리턴하지 저렇게 문자열로 리턴하지는 않습니다 단지 학습차원에서 보기 좋으라고 문자열로 리턴한겁니다. 정영훈 2019.12.9 22:53
    • 넵넵 감사합니다 알 수 없는 사용자 2019.12.9 23:27

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)