2015-09-19 13 views
5

Tôi là người mới bắt đầu trong python và tôi đang chơi với các hàm lambda. Tôi đã viết một chương trình sử dụng hàm lambda để in các ký tự +1 giá trị ascii của các ký tự đầu vào. Mã của tôi làIn chức năng lambda Python <function <lambda> tại 0x7fcbbc740668> thay vì giá trị

#!/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) 

Tôi có hàm convert_ascii thực hiện tương tự như lambda. Tuy nhiên, đầu ra của tôi là

/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> 

Mục đích của tập lệnh này là học lambda, mặc dù có nhiều cách khác để thực hiện chương trình này. Vui lòng cho tôi biết tôi đang làm gì sai. Quá trình hoàn tất với mã thoát 0

Trả lời

6

Bạn không gọi hàm này. Nó giống như khi bạn viết print convert_ascii thay vì print convert_ascii(i).

Hãy thử

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

Lưu ý rằng tôi đã thay đổi ord(i) để ord(x) trong thân hàm.

+1

Mặc dù fo lưu ý rằng trong trường hợp này Lambda là vô dụng. Mã trong câu trả lời này tương đương với 'print (chr (ord (x) + 1))' – Atsch

+2

Mục đích của OP là để tìm hiểu cách các biểu thức lambda hoạt động như thế nào. Ở đâu * thích hợp * để sử dụng chúng là không có chủ đề cho câu hỏi cụ thể này. – chepner

+0

Mặc dù tôi đã sử dụng i thay vì x trong hàm lambda, kết quả cũng giống nhau. Trong lambda, tôi chấp nhận var là x, nhưng được lặp lại như i, và nó vẫn hoạt động. Bất kỳ ý tưởng tại sao? – pkill

3

Hiện tại, bạn đang in một đối tượng hàm. Bạn phải gọi hàm.

Nhận hàm trong một biến và gọi hàm đó bằng thông số.

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

Chính xác. Nhưng việc lưu lambda vào một biến có vẻ như tạo ra một hàm được đặt tên ngược lại với ý tưởng lambda. Ví dụ, dịch vụ QuantifiedCode.com coi nó như là một mô hình chống nâng cao cảnh báo. –

+3

Bạn không cần gán hàm cho một biến; 'print (lambda x: chr (ord (x) + 1)) (i)' hoạt động giống nhau. – chepner

+1

Một lambda là một hàm chữ. Nó không phải là vô danh.Người ta cũng có thể nói rằng việc đặt tên cho một chuỗi ký tự bằng chữ hoặc một số theo nghĩa đen là một "mẫu chống". – saulspatz

1

Bạn đang cố in chính hàm đó. Thay vào đó, gán hàm trong một biến và chuyển tham số cho biến, hoặc sử dụng cùng một biến trong chính bản in.

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

hoặc

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

hoặc để tìm hiểu bản đồ, bạn có thể sử dụng bản đồ để có được kết quả tương tự

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

Không bao giờ biết điều đó. Cảm ơn – pkill

+0

Việc hiểu danh sách hiệu quả hơn việc lập bản đồ hàm do người dùng định nghĩa trong danh sách: '[chr (ord (x) + 1) cho x trong từ]'. – chepner

+0

Cảm ơn chepner. Tôi copy-paste, và do đó tôi không chú ý. Đã thay đổi. – nohup

2

Các Lambda từ khóa trả về một chức năng ẩn danh:

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

ở trên là (không tính ing-the-scenes ma thuật) tương đương với:

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

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

để gọi chức năng, lambda hay không, bạn vẫn phải gọi nó là:

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

Điều đó nói rằng, Lambdas không phải là rất tốt phù hợp với tình huống này và được sử dụng tốt hơn nếu một hàm hoặc cấu trúc đòi hỏi một hàm ngắn.

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

@chepner, vâng, chỉ cần bắt gặp điều đó. Sẽ thay đổi thành ví dụ của OP. Có, danh sách hiểu sẽ tốt hơn. – Atsch

Các vấn đề liên quan