python基础——函数

赋值、深浅拷贝

赋值是将一个对象的地址赋值给一个变量,让变量指向该地址。

不可变元素:数字、字符串和元组,赋值、浅拷贝和深拷贝都指向同一地址。

可变元素:列表、字典。浅拷贝和深拷贝指向不同地址。

浅拷贝仅仅复制了容器中元素的地址。

浅拷贝是在另一块地址中创建一个新的变量或容器,但是容器内元素的地址均是源对象元素的地址拷贝。也就是说新的容器中指向了旧的元素( 新瓶装旧酒 )。

深拷贝,完全拷贝了一个副本,容器内部元素地址都不一样。

深拷贝是在另一块地址中创建一个新的变量或容器,同时容器内元素的地址也是新开辟的,仅仅是值相同而已,是完全的副本。

python中有一个模块copy,deepcopy函数用于深拷贝,copy函数用于浅拷贝。

所谓浅拷贝就是对引用的拷贝,所谓深拷贝就是对对象资源的拷贝。

import copy

n1 = 23   # 数字
n2 = "abc"   # 字符串
n3 = ("we", "he", "she")  # 元组
print(id(n1), id(n2), id(n3))

n4 = n1
n5 = n2
n6 = n3
print(id(n4), id(n5), id(n6))

n7 = copy.copy(n1)
n8 = copy.deepcopy(n2)
n9 = copy.deepcopy(n3)
print(id(n7), id(n8), id(n9))

"""
1501832560 6521888 12307768
1501832560 6521888 12307768
1501832560 6521888 12307768

"""
View Code

 数字 、字符串 和 元组,赋值、浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址。

 

浅拷贝

import copy

n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]}
n2 = ("we", "he", "she")
n3 = [22,33,44]
print(id(n1),id(n2),id(n3))

n7 = copy.copy(n1)
n8 = copy.copy(n2)
n9 = copy.copy(n3)
print(id(n7),id(n8),id(n9))

"""
(41310656, 8044176, 41293624)
(41311808, 8044176, 41315424)
"""
View Code

深拷贝

import copy

n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]}
n2 = ("we", "he", "she")
n3 = [22,33,44]
print(id(n1),id(n2),id(n3))

m7 = copy.deepcopy(n1)
m8 = copy.deepcopy(n2)
m9 = copy.deepcopy(n3)
print(id(m7),id(m8),id(m9))

"""
(40131008, 7061136, 40113976)
(40132304, 7061136, 40133416)
"""
View Code

       

 函数

函数形参是指针,指向实际参数的。
修改或删除形参的值 ,实际参数值也变化。

def func(args):
    print(type(args))
    args.append(123)
    print(args)

li = [1, 2]
func(li)
print(li)

"""
<type 'list'>
[1, 2, 123]
[1, 2, 123]
"""
View Code

def func(args):
   del args[2:]

li = [1,2,3,4]
a = func(li)
print(li)  #[1, 2]
View Code

形式参数 赋值 另开辟内存

def func(args):
  args=123

li = [1,2,3,4]
a = func(li)
print(li)  #[1, 2, 3, 4]
View Code

lambda 匿名函数

def f1(ar1, ar2):
    return ar1 + ar2

ret = f1(3, 4)
print(ret)


f2 = lambda ar3, ar4: ar3 + ar4
ret = f2(3, 4)
print(ret)
"""
7
7
"""
View Code

filter,map,reduce

 filter(function, iterable)

在function不为None的情况下,
  filter(function, iterable)  
    等同于
    [item for item in iterable if function(item)];
    否则等同于
    [item foritem in iterable if item](function为None)。
def f1(x):
    if x > 22:
        return True
    else:
        return False

ret = filter(f1, [11, 22, 33, 44, 55, 66])
# 默认处理结果返回是一个类,需要迭代打印,因为浪费内存。 可以用next迭代取值。 或者for循环 循环依次取出
print(next(ret))
print(next(ret))
print(list(ret))

"""
33
44
[55, 66]
"""
View Code

      

filter中 lambda 函数替换 函数f1

ret1 = filter(lambda x:x>22,[11,22,33,44])
print(list(ret1))



      


原文地址:https://www.cnblogs.com/ttrrpp/p/6694169.html