Thread View: pl.comp.programming
4 messages
4 total messages
Started by Roman Tyczka
Wed, 17 Feb 2021 14:13
Lambda w Pythonie
Author: Roman Tyczka
Date: Wed, 17 Feb 2021 14:13
Date: Wed, 17 Feb 2021 14:13
39 lines
2269 bytes
2269 bytes
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
Re: Lambda w Pythonie
Author: Piotr Chamera
Date: Wed, 17 Feb 2021 15:06
Date: Wed, 17 Feb 2021 15:06
58 lines
2839 bytes
2839 bytes
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)
Re: Lambda w Pythonie
Author: Piotr Chamera
Date: Wed, 17 Feb 2021 15:44
Date: Wed, 17 Feb 2021 15:44
68 lines
3316 bytes
3316 bytes
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...
Re: Lambda w Pythonie
Author: Roman Tyczka
Date: Wed, 17 Feb 2021 19:12
Date: Wed, 17 Feb 2021 19:12
28 lines
2045 bytes
2045 bytes
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
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads