lambda 表达式
来自知乎用户
“简单来说,编程中提到的 lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。”
“刻画了映射关系。却无需为其起名字。岂不妙哉。”
//可以随心所欲改变所需要的函数f中的映射关系啦
def operate(f, y):
return f(y)
print (operate(lambda x : x ** 2, 4)) # prints '16'
print (operate(lambda x : x ** 3, 4)) # prints '64'
//也可以方便快捷的定义一个变量square_plus_cube,这个变量就可以执行一个函数映射啦
square_plus_cube = lambda x,y : x ** 2 + y ** 3
print (square_plus_cube(4,4)) # prints ’80’
//当然了,最经典的用处就是在sorted, filter, reduced等需要lambda作为参数的时候使用咯
foo = [2, 18, 9, 22, 17, 24, 8, 12, 27]
print (list(filter(lambda x: x % 3 == 0, foo))) #[18, 9, 24, 12, 27]
print (list(map(lambda x: x * 2 + 10, foo))) #[14, 46, 28, 54, 44, 58, 26, 34, 64]
foo = [2, -18, 9, 22, 17, 24, 8, 12, 27]
sorted(foo, key=lambda f:abs(f))
Copy(复制) or Reference(参考引用)
arr1 = [2, 3, 5, 7]
arr2 = arr1
arr2[2] = 13
print (arr1[2]) # 13
arr3 = arr1[0:3]
arr3[0] = 17
print (arr1[0]) #2
如上所示,在第二行中,
arr2
指向了和arr1
相同的object
,所以在更改arr2
的同时,arr1
也发生了改变。但是,当我们使用
slicing operator
的时候,arr3
仅仅是arr1
的一个copy
,所以arr3
的改变并不会影响arr1
,因为它们两个分别指向不同的objects
。
def func(arr):
arr.append(2)
my_arr = [1, 2, 3]
print (len(my_arr)) # 3
func(my_arr)
print (len(my_arr)) # 4
- 在函数
func
中,通过形参将reference
传递,所以最后在函数执行完,变量my_arr
在最后添加了数值2
dict1 = {'apples': 3, 'oranges': 2}
dict2 = dict1
dict2['bananas'] = 5
if 'bananas' in dict1:
print ('bananas is there!') # bananas is there!
else:
print ('no bananas')
dictionary
也与之前是一样的,使用dict2 = dict1
操作会将两个变量指向同意object
x = 'hello'
y=x
y = 'hi'
print (x) # hello
a = 1
b = a
b = 2
print (a) # 1
f = (1, 2, 3)
g = f
g = (4, 5, 6)
print(f) # (1, 2, 3)
然而,诸如上述三种String
、Ints
和Tuples
,他们都是Immutable(不可改变的),所以,在进行赋值操作的时候,只会进行复制,而不会引用到相同的object上面。