[python] Vracení dat se jménem.

Leos Pol leos na radiante-corp.com
Neděle Únor 25 23:17:08 CET 2007


Zdravim,

Jakub Vojáček napsal(a):
> Ale těch "if" by bylo spoustu a mohl bych v nich udělat chybu. Spíš by to chtělo něco funkci:
> def usu(self,uhel1,strana,uhel2):
>     #pocitani
>     #return hodnoty
>   
Ano, ve fci "pocitej" by mel byt slozeny if, ktery by rozdelil problem a 
volal by jednotlive fce pro sss, sus, a usu. Nebo mozna neco podobneho 
tomuto:

    class triangle:
        def sss(self, input):
            ...
            return input
           
        def sus(self, input):
            ...
            return input
           
        def usu(self, input):
            ...
            return input
       
        def pocitej(self, input, typ):
            if typ in ('sss', 'sus', 'usu'):
                return getattr(self, typ)(input)
            else:
                raise InvalidType('something')


> tato funkce může spočítat velikosti zbývajicích stran, ale neví, jestli je tohle strana "a", nebo "b". Proto bych potřeboval poradit jakým způsobem tohleto řešit, jestli nakonec nebudu muset psát řešení pro každou možnou variantu. Snad jsem to vysvětlil dobře .
>   
Priklad pro usu:

    from math import sin, radians

    #setup
    sides = ('a', 'b', 'c')
    angles = ('alpha', 'beta', 'gamma')
    mapping = {}
    for i in range(len(sides)):
        mapping[sides[i]] = angles[i]

    #input
    data = {'b': 5, 'beta': 15, 'gamma': 60}

    #filtering
    inpSide = filter(lambda x:x in data, sides)[0]
    inpAngles = filter(lambda x:x in data, angles)
    remSides = filter(lambda x:x not in data, sides)
    remAngle = filter(lambda x:x not in data, angles)[0]

    #calculating
    data[remAngle] = 180 - sum(map(lambda x:data[x], inpAngles))
    for side in remSides:
        inpSideSin = sin(radians(data[mapping[inpSide]]))
        sideSin = sin(radians(data[mapping[side]]))
        data[side] = round(data[inpSide]/inpSideSin * sideSin, 2)

    #printing
    print 'Input:\n\tSide: %s\n\tAngles: %s' % (repr(inpSide), inpAngles)
    print 'Calc:\n\tSides: %s\n\tAngle: %s' % (remSides, repr(remAngle))
    print 'Result:\n\t%s' % data

Myslim, ze by to chtelo pridat jeste nejake kontroly, jestli je vsechno 
zadano jak ma.
> Děkuju za každou pomoc a sory že otravuju, ale už fakt nevim:(:(
>   

Doufam, ze jsem trosku pomohl. Je mozne, ze by slo vse spojit do jedne 
fce, ale uz je moc pozde a mne se nechce premyslet ;-).
Leo

-- 
----
Leos Pol
SW Engineer
Radiante Corp.

If it can be imagined,
we can implement it



Další informace o konferenci Python