eGospodarka.pl

eGospodarka.plGrupypl.comp.programming › Lambda w Pythonie
Ilość wypowiedzi w tym wątku: 4

  • 1. Data: 2021-02-17 15:13:31
    Temat: Lambda w Pythonie
    Od: Roman Tyczka <r...@h...you.spammer>


    Być może źle do tego podchodzę... ale potrzebuję funkcji X(), która
    zwraca jakieś dane, tę funkcję muszę przekazać dalej i gdzieś tam w
    trzewiach biblioteki zostanie wywołana i pobrana z niej wartość.
    Problem polega na tym, że funkcja ma zwracać różne dane w zależności od
    pewnego parametru, ale samego parametru jej przekazać nie mam jak, więc
    pomyślałem, że zrobię sztuczkę z lambdą/anonymousem, czyli utworzę
    funkcję, która dostanie ten istotny parametr i zwróci lambdę już
    "spreparowaną" pod wymagania wynikające z tego parametru.
    No ale nie umiem :-(

    Zrobiłem tak:

    #funkcja generująca tablicę bajtów o określonej długości
    def getCTR(bits: int):
    k = bits // 8
    b = bytes([6])
    return b * k

    #typ lambdy, który korzysta z powyższej funkcji
    getCTRn = lambda x : getCTR(x)

    #funkcja główna, mająca zwrócić lambdę
    #spreparowaną na zwrócenie określonej wartości
    def getCTRx(bites):
    g: getCTRn = getCTRn(8 * bites)
    return g

    i kod właściwy, który tego wszystkiego powyżej używa:

    ctr = getCTRx(algModule.key_size)
    ciph = algModule.new(key, algMode, IV=iv, counter=ctr)

    Niestety, zmienna ctr zamiast lambdy otrzymuje od razu tablicę bajtów
    :-( Co robię źle?

    --
    pzdr
    Roman


  • 2. Data: 2021-02-17 16:06:58
    Temat: Re: Lambda w Pythonie
    Od: Piotr Chamera <p...@p...onet.pl>

    W dniu 2021-02-17 o 15:13, Roman Tyczka pisze:
    >
    > Być może źle do tego podchodzę... ale potrzebuję funkcji X(), która
    > zwraca jakieś dane, tę funkcję muszę przekazać dalej i gdzieś tam w
    > trzewiach biblioteki zostanie wywołana i pobrana z niej wartość.
    > Problem polega na tym, że funkcja ma zwracać różne dane w zależności od
    > pewnego parametru, ale samego parametru jej przekazać nie mam jak, więc
    > pomyślałem, że zrobię sztuczkę z lambdą/anonymousem, czyli utworzę
    > funkcję, która dostanie ten istotny parametr i zwróci lambdę już
    > "spreparowaną" pod wymagania wynikające z tego parametru.
    > No ale nie umiem :-(
    >
    > Zrobiłem tak:
    >
    > #funkcja generująca tablicę bajtów o określonej długości
    > def getCTR(bits: int):
    >     k = bits // 8
    >     b = bytes([6])
    >     return b * k

    Może chodziło Ci o coś takiego:

    def getCTR(bits: int):
    k = bits // 8
    b = bytes([6])
    return lambda : b * k


    >>> getCTR(8)
    <function getCTR.<locals>.<lambda> at 0x02C68660>
    >>> f = getCTR(8)
    >>> f()
    b'\x06'
    >>> f = getCTR(32)
    >>> f()
    b'\x06\x06\x06\x06'


    getCTRn i getCTRx są niepotrzebne

    > #typ lambdy, który korzysta z powyższej funkcji
    > getCTRn = lambda x : getCTR(x)
    >
    > #funkcja główna, mająca zwrócić lambdę
    > #spreparowaną na zwrócenie określonej wartości
    > def getCTRx(bites):
    >     g: getCTRn = getCTRn(8 * bites)
    >     return g
    >
    > i kod właściwy, który tego wszystkiego powyżej używa:
    >
    >   ctr = getCTRx(algModule.key_size)
    >   ciph = algModule.new(key, algMode, IV=iv, counter=ctr)

    a wywołanie wyglądałoby tak:

    ctr = getCTR(algModule.key_size)
    ciph = algModule.new(key, algMode, IV=iv, counter=ctr)


  • 3. Data: 2021-02-17 16:44:41
    Temat: Re: Lambda w Pythonie
    Od: Piotr Chamera <p...@p...onet.pl>

    W dniu 2021-02-17 o 16:06, Piotr Chamera pisze:
    > W dniu 2021-02-17 o 15:13, Roman Tyczka pisze:
    >>
    >> Być może źle do tego podchodzę... ale potrzebuję funkcji X(), która
    >> zwraca jakieś dane, tę funkcję muszę przekazać dalej i gdzieś tam w
    >> trzewiach biblioteki zostanie wywołana i pobrana z niej wartość.
    >> Problem polega na tym, że funkcja ma zwracać różne dane w zależności
    >> od pewnego parametru, ale samego parametru jej przekazać nie mam jak,
    >> więc pomyślałem, że zrobię sztuczkę z lambdą/anonymousem, czyli
    >> utworzę funkcję, która dostanie ten istotny parametr i zwróci lambdę
    >> już "spreparowaną" pod wymagania wynikające z tego parametru.
    >> No ale nie umiem :-(
    >>
    >> Zrobiłem tak:
    >>
    >> #funkcja generująca tablicę bajtów o określonej długości
    >> def getCTR(bits: int):
    >>      k = bits // 8
    >>      b = bytes([6])
    >>      return b * k
    >
    > Może chodziło Ci o coś takiego:
    >
    > def getCTR(bits: int):
    >     k = bits // 8
    >     b = bytes([6])
    >     return lambda : b * k
    >
    >
    > >>> getCTR(8)
    > <function getCTR.<locals>.<lambda> at 0x02C68660>
    > >>> f = getCTR(8)
    > >>> f()
    > b'\x06'
    > >>> f = getCTR(32)
    > >>> f()
    > b'\x06\x06\x06\x06'
    >
    >
    > getCTRn i getCTRx są niepotrzebne
    >
    >> #typ lambdy, który korzysta z powyższej funkcji
    >> getCTRn = lambda x : getCTR(x)
    >>
    >> #funkcja główna, mająca zwrócić lambdę
    >> #spreparowaną na zwrócenie określonej wartości
    >> def getCTRx(bites):
    >>      g: getCTRn = getCTRn(8 * bites)
    >>      return g
    >>
    >> i kod właściwy, który tego wszystkiego powyżej używa:
    >>
    >>    ctr = getCTRx(algModule.key_size)
    >>    ciph = algModule.new(key, algMode, IV=iv, counter=ctr)
    >
    > a wywołanie wyglądałoby tak:
    >
    > ctr = getCTR(algModule.key_size)
    > ciph = algModule.new(key, algMode, IV=iv, counter=ctr)

    A może getCTRx powinno zwrócić lambdę

    def getCTRx(bites):
    g: getCTRn = getCTRn(8 * bites)
    return lambda : g

    wtedy cały Twój przykład działa tak jak poprzednio, tzn zwraca taką samą
    tablicę, tylko przez funkcję a nie bezpośrednio...


  • 4. Data: 2021-02-17 20:12:09
    Temat: Re: Lambda w Pythonie
    Od: Roman Tyczka <r...@h...you.spammer>

    W dniu 17.02.2021 o 16:44, Piotr Chamera pisze:
    >> Może chodziło Ci o coś takiego:
    >>
    >> def getCTR(bits: int):
    >>      k = bits // 8
    >>      b = bytes([6])
    >>      return lambda : b * k
    [...]
    >>
    > A może getCTRx powinno zwrócić lambdę
    >
    > def getCTRx(bites):
    >     g: getCTRn = getCTRn(8 * bites)
    >     return lambda : g
    >
    > wtedy cały Twój przykład działa tak jak poprzednio, tzn zwraca taką samą
    > tablicę, tylko przez funkcję a nie bezpośrednio...

    Dzięki, już pierwsza odpowiedź rozwiązała mój problem. Trochę to
    zakręcone, ale się przyzwyczajam.... i ciągle coś odkrywam ;-)

    W przykładach jakie trafiałem nie było lambdy bezparametrowej, a ta
    Twoja taka jest. Człowiek całe życie nabiera pokory, by spokojnie umrzeć
    w głupocie ;-)

    --
    pzdr
    Roman

strony : [ 1 ]



Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: