lambda表达式
啊lambda表达式其实就是便携版函数
原型如下,
栗子1(加法),
add=lambda x, y : x + y
print(add(3,5))
#Output:8
栗子2(lambda结合sort),
a = [(1,2),(4,1),(9,10),(13,-3)]
a.sort(key=lambda x : x[1])
print(a)
#Output:[(13,-3),(4,1),(1,2),(9,10)]
栗子3(lambda结合filter),
foo = [2, 18, 9, 22, 17, 24, 8, 12, 27]
print(filter(lambda x : x % 3 == 0, foo))
#Output:[18, 9, 24, 12, 27]
栗子4(lambda结合列表映射函数map),
foo = [2, 18, 9, 22, 17, 24, 8, 12, 27]
print(map(lambda x : x * 2 + 10, foo))
#Output:[14, 46, 28, 54, 44, 58, 26, 34, 64]
栗子5(lambda结合迭代函数reduce),
foo = range(1, 6)
print(reduce(lambda x, y : x * y, foo))
#Output:120
*lambda的有点是代码简洁但并不会提高运行效率,缺点是易读性差
*能用for...in..if完成的就不要用lambda,比如栗子3可以用 [x for x in foo if x % 3== 0]替代
*如果用lambda要包含循环等复杂逻辑,宁愿def func来完成
*总的来说,lambda 是为了减少单行函数的定义而存在的
赋值与深浅拷贝
在高级语言中,变量是对内存及地址的抽象。python中的一切变量都是对象,变量的存储采用了引用语义的方式,变量存储的只是一个变量的值所在的内存地址而不是变量的值本身
python和c语言的变量存储区别见下图,
我们可以将python中的变量数据类型大致的分为简单数据类型和复杂的数据结构,如下图,
由于python中的变量都是采用的引用语义,导致了python中的数据的存储情况如下图,
所以当我们重复的初始化变量的时候,情况如下,
str1 = "hello world"
print(id(str1))
#Output:48672272
str1 = "new hello world"
print(id(str1))
#Output:48672224
当我们改变复杂的数据类型的值的时候,情况如下,
lst1 = [1,2,3,4,5,6]
print(id(lst1))
#Output:48574728
lst1.append('new item')
print(lst1)
#Output:[1,2,3,4,5,6,'new item']
print(id(lst1))
#Output:48574728
lst1.pop()
print(lst1)
#Output:[1,2,3,4,5,6]
print(id(lst1))
#Output:48574728
lst1[0] = 'change test'
print(lst1)
#Output:['change test',2,3,4,5,6]
print(id(lst1))
#Output:48574728
lst1=[1,2,3,4,5]
print(id(lst1))
#Output:48221192
有了以上先验知识,我们可以正式来讨论python的赋值操作了
简单的数据类型赋值的栗子,
str1 = 'hello world'
print(id(str1))
#Output:41863664
str2 = str1
print(id(str2))
#Output:41863664
str1 = 'new hello world'
print(str1)
#Output:new hello world
print(str2)
#Output:hello world
print(id(str1))
#Output:45133920
print(id(str2))
#Output:41863664
*赋值指向同地址,初始化/新增元素指向新地址。赋值不改变值,改变地址。
复杂的数据结构的赋值操作的栗子,
lst1 = [1,2,3,4,5,6]
lst2 = lst1
print(id(lst1))
#Output:48226504
print(id(lst2))
#Output:48226504
lst1.append('new item')
print(lst1)
#Output:[1,2,3,4,5,6,'new item']
print(lst2)
#Output:[1,2,3,4,5,6,'new item']
print(id(lst1))
#Output:48226504
print(id(lst2))
#Output:48226504
*指向同一地址的多个变量:共享资源、值变俱变
然鹅,我们常常有一种需求:将一份数据的原始内容保留一份,再去处理新数据,这时单单赋值的操作就不够明智了,所以copy和deepcopy出场
copy叫作浅拷贝,即不管多么复杂的数据结构,浅拷贝都只会copy第一层地址块,如下,
import copy
lst = ['str1','str2','str3','str4','str5']
sourcelist = ['str1','str2','str3','str4','str5', lst]
copylist = copy.copy(sourcelist)
print('===>sourcelist:', sourcelist)
#Output:===>sourcelist:['str1','str2','str3','str4','str5', ['str1','str2','str3','str4','str5']]
print('===>copylist:', copylist)
#Output:===>copylist:['str1','str2','str3','str4','str5', ['str1','str2','str3','str4','str5']]
sourcelist.append('sourcestr')
copylist.append('copystr')
print('===>sourcelist:', sourcelist)
#Output:===>sourcelist:['str1','str2','str3','str4','str5', ['str1','str2','str3','str4','str5'],'sourcestr']
print('===>copylist:', copylist)
#Output:===>copylist:['str1','str2','str3','str4','str5', ['str1','str2','str3','str4','str5'],'copystr']
sourcelist[0] = 'changeSource'
print('===>sourcelist:', sourcelist)
#Output:===>sourcelist:['changeSourcde','str2','str3','str4','str5', ['str1','str2','str3','str4','str5'],'sourcestr']
print('===>copylist:', copylist)
#Output:===>copylist:['str1','str2','str3','str4','str5', ['str1','str2','str3','str4','str5'],'copystr']
lst.append('testAppend')
print('===>sourcelist:', sourcelist)
#Output:===>sourcelist:['changeSourcde','str2','str3','str4','str5', ['str1','str2','str3','str4','str5','testAppend'],'sourcestr']
print('===>copylist:', copylist)
#Output:===>copylist:['str1','str2','str3','str4','str5', ['str1','str2','str3','str4','str5','testAppend'],'copystr']
*copy只独立第一层(分开存储第一层地址),第二层依然等于赋值
想要两个变量完全的独立,就上deepcopy啰,如下,
import copy
lst = ['str1','str2','str3','str4','str5']
sourcelist = ['str1','str2','str3','str4','str5', lst]
deepcopylist = copy.deepcopy(sourcelist)
------------------------------------------参考------------------------------------------lambda表达式 · Python进阶eastlakeside.gitbooks.ioPython lambda介绍 - Goodpy - 博客园www.cnblogs.compython--赋值与深浅拷贝 - Eva_J - 博客园www.cnblogs.com