🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.python
11 messages
11 total messages Started by szatkus Sat, 26 Mar 2011 09:32
Konstruktor funkcji
#27967
Author: szatkus
Date: Sat, 26 Mar 2011 09:32
5 lines
919 bytes
Czy w pythonie da się tworzyć funkcje w locie tak jak w JavaScript?
Np. zmienna = function(arg) {cośtam, cośtam;}
-- 
szatkus <szatkus@gmail.com>
Re: Konstruktor funkcji
#27968
Author: Roman Dobosz
Date: Sat, 26 Mar 2011 09:58
17 lines
1487 bytes
On Sat, 26 Mar 2011 10:32:54 +0100
szatkus <szatkus@gmail.com> wrote:

> Czy w pythonie da się tworzyć funkcje w locie tak jak w JavaScript?
> Np. zmienna = function(arg) {cośtam, cośtam;}

lambda? np:

In [1]: foo = lambda arg1, arg2: arg1 * arg2

In [2]: foo(5, 2)
Out[2]: 7

-- 
      -^-  _        coś tam w tle sobie gra, np:
   _ /O)_\//        Wumpscut - Soylent Green
  (_(|__(_(_) grf.  
Re: Konstruktor funkcji
#27969
Author: Wojciech Muła
Date: Sat, 26 Mar 2011 10:30
18 lines
1299 bytes
Roman Dobosz wrote:
> On Sat, 26 Mar 2011 10:32:54 +0100
> szatkus <szatkus@gmail.com> wrote:
>
>> Czy w pythonie da się tworzyć funkcje w locie tak jak w JavaScript?
>> Np. zmienna = function(arg) {cośtam, cośtam;}
>
> lambda? np:
>
> In [1]: foo = lambda arg1, arg2: arg1 * arg2
>
> In [2]: foo(5, 2)
> Out[2]: 7

Lambda pozwala uzywac tylko wyrazen. Ale mozna definiowac
funkcje (i klasy) w dowolnym miejscu kodu.

w.
Re: Konstruktor funkcji
#27970
Author: Adam Byrtek
Date: Sat, 26 Mar 2011 13:56
32 lines
1811 bytes
On 03/26/2011 11:30 AM, Wojciech Muła wrote:
>>> Czy w pythonie da się tworzyć funkcje w locie tak jak w JavaScript?
>>> Np. zmienna = function(arg) {cośtam, cośtam;}
>>
>> lambda? np:
>>
>> In [1]: foo = lambda arg1, arg2: arg1 * arg2
>>
>> In [2]: foo(5, 2)
>> Out[2]: 7
>
> Lambda pozwala uzywac tylko wyrazen. Ale mozna definiowac
> funkcje (i klasy) w dowolnym miejscu kodu.

Czyli innymi słowy zamiast wspomnianego

   zmienna = function(arg) {cośtam, cośtam;}

piszemy

   def zmienna(arg):
     cośtam, cośtam

co jest równoważne przypisaniu zmiennej 'zmienna' obiektu 
reprezentującego funkcję.

Niestety nie istnieje składnia dla "wieloliniowych lambd" (jak bloki w 
Ruby). Sam Guido przyznaje, że to spory problem, a żadne z 
zaproponowanych dotychczas rozwiązań nie jest dostatecznie czytelne.

Pozdrawiam,
Adam
Re: Konstruktor funkcji
#27971
Author: Wojciech Muła
Date: Mon, 28 Mar 2011 16:16
11 lines
1398 bytes
On Sat, 26 Mar 2011 14:56:31 +0100 Adam Byrtek <adambyrtek@gmail.com>
wrote:

> Niestety nie istnieje składnia dla "wieloliniowych lambd" (jak bloki
> w Ruby). Sam Guido przyznaje, że to spory problem, a żadne z 
> zaproponowanych dotychczas rozwiązań nie jest dostatecznie czytelne.

Szczerze mówiąc to nie widzę jakiś szczególnych niedogodności z tym
związanych. (I nie pamiętam kiedy ostatni raz korzystałem z lambd).

w.
Re: Konstruktor funkcji
#27972
Author: Adam Byrtek
Date: Wed, 30 Mar 2011 20:26
9 lines
1351 bytes
On 03/28/2011 06:16 PM, Wojciech Muła wrote:
> Szczerze mówiąc to nie widzę jakiś szczególnych niedogodności z tym
> związanych. (I nie pamiętam kiedy ostatni raz korzystałem z lambd).

Kwestia przyzwyczajenia do stylu i ograniczeń danego języka. Wielu 
programistów Javy też nie widzi niedogodności tego języka.

Pozdrawiam,
Adam
Re: Konstruktor funkcji
#27973
Author: Wojciech Muła
Date: Thu, 31 Mar 2011 17:57
13 lines
1559 bytes
Adam Byrtek wrote:
> On 03/28/2011 06:16 PM, Wojciech Muła wrote:
>> Szczerze mówiąc to nie widzę jakiś szczególnych niedogodności z tym
>> związanych. (I nie pamiętam kiedy ostatni raz korzystałem z lambd).
>
> Kwestia przyzwyczajenia do stylu i ograniczeń danego języka. Wielu 
> programistów Javy też nie widzi niedogodności tego języka.

A mógłbyś podać jakiś przykład zastosownia wieloliniowych lambd
w jakimś języku imperatywnym? (Javascript?) Ale taki przykład,
gdzie będzie widać, że ta lambda coś naprawdę daje.

w.
Re: Konstruktor funkcji
#27974
Author: Stachu 'Dozzie' K.
Date: Thu, 31 Mar 2011 18:05
45 lines
2623 bytes
On 2011-03-31, Wojciech Muła <wojciech_mula@poczta.null.onet.pl.invalid> wrote:
> Adam Byrtek wrote:
>> On 03/28/2011 06:16 PM, Wojciech Muła wrote:
>>> Szczerze mówiąc to nie widzę jakiś szczególnych niedogodności z tym
>>> związanych. (I nie pamiętam kiedy ostatni raz korzystałem z lambd).
>>
>> Kwestia przyzwyczajenia do stylu i ograniczeń danego języka. Wielu 
>> programistów Javy też nie widzi niedogodności tego języka.
>
> A mógłbyś podać jakiś przykład zastosownia wieloliniowych lambd
> w jakimś języku imperatywnym? (Javascript?) Ale taki przykład,
> gdzie będzie widać, że ta lambda coś naprawdę daje.

#v+
#!/usr/bin/perl

use Getopt::Long;

my %opts = (
  help      => 0,
  checkout  => 1,
  clean     => 1,
  inform    => 0,
);

my $result = GetOptions(
  "help|h"    => \$opts{help},
  "checkout!" => \$opts{checkout},
  "commit!"   => \$opts{commit},
  "clean!"    => \$opts{clean},
  "debug"     => sub {
    $opts{commit} = 0;
    $opts{clean}  = 0;
    $opts{inform} = 1;
  },
);

# ...
#v-

Objaśniać kod czy widać co się dzieje?

-- 
Secunia non olet.
Stanislaw Klekot
Re: Konstruktor funkcji
#27975
Author: Adam Byrtek
Date: Thu, 31 Mar 2011 20:37
29 lines
2222 bytes
On 03/31/2011 07:57 PM, Wojciech Muła wrote:
> A mógłbyś podać jakiś przykład zastosownia wieloliniowych lambd
> w jakimś języku imperatywnym? (Javascript?) Ale taki przykład,
> gdzie będzie widać, że ta lambda coś naprawdę daje.

Poczytaj o Rubym, tak "wielolioniowe lambdy", czyli w ich terminologii 
bloki, są podstawowym i niezwykle potężnym elementem języka.

Jeśli chcesz przykładu z pythonowego podwórka, bardzo proszę. Weźmy 
przykładowy dekorator

 >>> def addspam(fn):
...     def inner(*args):
...         print "spam, spam, spam"
...         return fn(*args)
...     return inner

Dlaczego funkcji inner musimy nadawać jakąkolwiek nazwę, skoro nie jest 
nam ona do niczego potrzebna? Mając odpowiednią składnię, moglibyśmy po 
prostu zwrócić anonimową funkcję.

Jednak najbardziej zastanawia to, że jako argumentu użyłeś właśnie 
JavaScriptu. Przecież w nowoczesnym JS w zasadzie wszystko jest 
anonimową funkcją. Jeśli nie wierzysz, poszukaj ciągu 'function(...)' 
chociażby tutaj
http://docs.jquery.com/Tutorials:Getting_Started_with_jQuery

Pozdrawiam,
Adam
Re: Konstruktor funkcji
#27976
Author: szatkus
Date: Tue, 05 Apr 2011 16:49
24 lines
1469 bytes
On Sat, 26 Mar 2011 10:32:54 +0100
szatkus <szatkus@gmail.com> wrote:

> 
> Czy w pythonie da się tworzyć funkcje w locie tak jak w JavaScript?
> Np. zmienna = function(arg) {cośtam, cośtam;}
> -- 
> szatkus <szatkus@gmail.com>

To może pokażę, co chcę osiągnąć, może ktoś mi poleci lepsze rozwiązanie.

Otóż mam:

def male_mod(self, mod):
    mod.tbonus *= 1.2
male.mod = male_mod

A chciałbym to nieco skrócić o tą ostatnią linijkę, czyli powołując się na przyzwyczajenia z JS chciałbym, żeby działało coś w stylu:

male.mod = def(self, mod):
    mod.tbonus *= 1.2

-- 
szatkus <szatkus@gmail.com>
Re: Konstruktor funkcji
#27977
Author: Rob Wolfe
Date: Tue, 05 Apr 2011 19:12
38 lines
2008 bytes
szatkus <szatkus@gmail.com> writes:

> On Sat, 26 Mar 2011 10:32:54 +0100
> szatkus <szatkus@gmail.com> wrote:
>
>> 
>> Czy w pythonie da się tworzyć funkcje w locie tak jak w JavaScript?
>> Np. zmienna = function(arg) {cośtam, cośtam;}
>> -- 
>> szatkus <szatkus@gmail.com>
>
> To może pokażę, co chcę osiągnąć, może ktoś mi poleci lepsze rozwiązanie.
>
> Otóż mam:
>
> def male_mod(self, mod):
>     mod.tbonus *= 1.2
> male.mod = male_mod
>
> A chciałbym to nieco skrócić o tą ostatnią linijkę, czyli powołując się na przyzwyczajenia z JS chciałbym, żeby działało coś w stylu:
>
> male.mod = def(self, mod):
>     mod.tbonus *= 1.2

Jak już zostało powiedziane jedyną formą funkcji anonimowej w Pythonie
jest lambda, która pozwala na użycie tylko jednego wyrażenia:

>>> f = lambda x: x * 1.2
>>> f(2)
2.4

Powiedzmy, że ta drobna niedogodność Pythona została złożona na ołtarzu
bezmiaru korzyści jakie wynikają ze znaczących wcięć. ;)

Co do przyzwyczajeń, to w żaden sposób nie mogę się przystosować
do obiektowości w JS. ;)

RW
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