2015-09-19 30 views
5

Jestem początkującym użytkownikiem Pythona, a ja bawiłem się z funkcjami lambda. Pisałem program wykorzystujący funkcję lambda do drukowania znaków, które są +1 wartością ascii wprowadzanych znaków. Mój kod to:Funkcja drukowania lambda <funkcja <lambda> przy 0x7fcbbc740668> zamiast wartości

#!/usr/bin/python 
import sys 
try: 
    word = sys.argv[1] 
except: 
    print "No arguments passed" 
    sys.exit(1) 

def convert_ascii(char): 
    return "".join(chr(ord(char) + 1)) 

for i in word: 
    print convert_ascii(i) 
    print lambda x: chr(ord(i) + 1) 

Mam funkcję convert_ascii, która robi to samo co lambda. Jednak moja wydajność to:

/usr/bin/python2.7 /home/user1/PycharmProjects/test/Tut1/asciipl2.py "abc def ghi" 
b 
<function <lambda> at 0x7f0310160668> 
c 
<function <lambda> at 0x7f0310160668> 
d 
<function <lambda> at 0x7f0310160668> 
! 
<function <lambda> at 0x7f0310160668> 
e 
<function <lambda> at 0x7f0310160668> 
f 
<function <lambda> at 0x7f0310160668> 
g 
<function <lambda> at 0x7f0310160668> 
! 
<function <lambda> at 0x7f0310160668> 
h 
<function <lambda> at 0x7f0310160668> 
i 
<function <lambda> at 0x7f0310160668> 
j 
<function <lambda> at 0x7f0310160668> 

Celem tego skryptu jest nauka lambda, chociaż istnieją inne sposoby na wykonanie tego programu. Daj mi znać, co robię źle. Proces zakończony kodem wyjściowym 0

Odpowiedz

6

Nie wywołujesz tej funkcji. To tak samo, jakbyś napisał print convert_ascii zamiast print convert_ascii(i).

Spróbuj

print (lambda x: chr(ord(x) + 1))(i) 

pamiętać, że zmieniły się ord(i) do ord(x) w ciele funkcji.

+1

Chociaż fo zauważ, że w tym przypadku Lambda jest bezużyteczna. Kod w tej odpowiedzi jest równoważny 'print (chr (ord (x) + 1))' – Atsch

+2

Założonym celem PO jest nauczenie się działania wyrażeń lambda. Gdzie jest * właściwe * ich użycie jest nie na temat dla tego konkretnego pytania. – chepner

+0

Chociaż użyłem i zamiast x w funkcjach lambda, wynik był taki sam. W lambda, zaakceptowałem var jako x, ale iterowałem jako i, i nadal działało. Każdy pomysł, dlaczego? – pkill

3

Aktualnie drukowany jest obiekt funkcji. Musisz zadzwonić do tej funkcji.

Odbierz funkcję w zmiennej i wywołaj ją za pomocą parametru.

for i in word: 
    print convert_ascii(i) 
    fun=lambda x: chr(ord(x) + 1) 
    print fun(some_arg) 
+2

Prawidłowe. Ale zapisanie lambda do zmiennej wygląda jak stworzenie nazwanej funkcji, która jest odwrotnie do idei lambda. Na przykład usługa QuantifiedCode.com traktuje ją jako anty-wzór ostrzegawczy. –

+3

Nie trzeba przypisywać funkcji do zmiennej; 'print (lambda x: chr (ord (x) + 1)) (i)' działa tak samo. – chepner

+1

Lambda jest dosłowną funkcją. To nie musi być anonimowe.Można równie dobrze powiedzieć, że podanie nazwy literału lub literału jest "anty-wzorem". – saulspatz

1

Próbujesz wydrukować samą funkcję. Zamiast tego przypisz funkcję do zmiennej i przekaż parametr do zmiennej lub użyj tego samego w obrębie samego wydruku.

for i in word: 
    z = lambda x: chr(ord(x) + 1) 
    print z(i) 

lub

for i in word: 
    print (lambda x: chr(ord(x) + 1))(i) 

lub nauczyć mapę, można użyć mapy, aby uzyskać taki sam efekt

for i in word: 
    print "".join(map(lambda x: chr(ord(x) + 1), i)) 
+0

Nigdy tego nie wiedziałem. Dzięki – pkill

+0

Zrozumienie listy jest bardziej wydajne niż odwzorowywanie zdefiniowanej przez użytkownika funkcji na liście: '[chr (ord (x) + 1) dla x w słowie]'. – chepner

+0

Dzięki chepner. Kopiowałem-wklejałem, a więc nie zauważyłem. Zmieniono. – nohup

2

Lambda słowo Zwraca anonimową funkcję:

>>> func = lambda x: x+1 
>>> print(func) 
<function <lambda> at 0x7f0310160668> 

powyższe jest (nie licząc beh magiczne) The-sceny ing-równoważne:

>>> def func(x): 
     return x+1 

>>> print(func) 
<function func at 0x7fa73d3e6bf8> 

do wywołania funkcji, lambda, czy nie, trzeba jeszcze to nazwać:

>>> print(func) 
<function <lambda> at 0x7f0310160668> 
>>> func(123) 
124 

Powiedział, że lambda nie są bardzo dobrze nadaje się do w tej sytuacji i są lepiej stosowane, jeśli funkcja lub konstrukcja wymaga krótkiej funkcji.

>>> word = "spam" 
>>> map(lamda x: chr(ord(x) + 1), word) 
+0

@chepner, tak, właśnie to złapałem. Zmieni się na przykład OP. Tak, spisane rozumowanie byłoby lepsze. – Atsch