没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
001、Python 中的可变对象与不可变对象
对象分为 可变对象 和 不可变对象。 可通过函数 id() 查看对象的内存地址是否改变
• 不可变对象:改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复
制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。 如:String、
Tuple、Number。他们本身的值是不可以被改变,修改的时候,会复制一个新的对象
,并开辟一份新的内存空间,变量再去指向新的值。
a = 1
print(id(a)) # 4543532032
a = 1 + 2
print(id(a)) # 4543532096
#
证明字符串是可变对象
• 可变对象:意味着修改该数据对象,不会在内存中新创建另一个内存空间来存放新数
据对象,如:List、Dict、Set。对其进行修改时,并不会像可变对象那样重新复制一
份。而是在原有的基础上进行修改。
a = [1, 2]
print(id(a)) # 4362993544
a.append(3)
print(id(a)) # 4362993544
a[1] = 5
print(id(a)) # 4362993544
#
列表是不可变对象
002、类的定义和装饰器@classmethod 与@staticmethod
参考此文:https://mp.weixin.qq.com/s/t1T_K5wbovOAIdzgKjIwhg
003、删除列表中的重复元素
1、通过 set 方法
a = [1, 2, 3, 1, 1, 1, 7, 9, 5]
print(list(set(a)))
2、通过 fromkeys 方法
a = [1, 2, 3, 1, 1, 1, 7, 9, 5]
b = {}
# fromnkeys
创建一个新的字典,已
a
中的元素作为字典的键
b = b.fromkeys(a)
print(b) # {1: None, 2: None, 3: None, 7: None, 9: None, 5: None}
c = list(b.keys())
print(c) # [1, 2, 3, 7, 9, 5]
3、逻辑判断
a = [1, 2, 3, 1, 1, 1, 7, 9, 5]
b = []
for i in a:
if i not in b:
b.append(i)
print(b) # [1, 2, 3, 7, 9, 5]
004、Python 中的 lambda 表达式
lambda 又称为匿名函数,可以不再去定义函数,使代码更加简洁。
def m(x):
return x ** 2
print(m(2))
#
等同于函数
m()
m1 = lambda x: x ** 2
print(m1(2))
更多用法,请参考此文:https://mp.weixin.qq.com/s/CsBpTh0cDyyOT0BZ5cUHwg
005、Python 中的可变参数
可变参数的形式有
• args :
元组类型参数
```python def fun_arr(name, args): print(name) print(args)
if name == 'main': fun_arr('tom') # 输出 tom 、() # tom # (20, 'man', '篮球', 'pythoner',
'17766666666') fun_arr('tom', 20, 'man', '篮球', 'pythoner', '17766666666') ```
• kwargs :字典类型参数 ```python def fun_dict(kwargs): for k, v in kwargs.items():
print(k, v) # 也可通过 get 的方式取参数的值 # my name is tom i'am 18 years old, my
phone number is 17766666666 print("my name is %s i'am %s years old, my phone
number is %s" % (kwargs.get('name'), kwargs.get('age'), kwargs.get('mobile')))
if name == 'main': fun_dict(name='tom', age=18, mobile='17766666666') ```
可变参数允许多个任意参数,也允许不传参数。
两个可变参数同时存在是,一定要将 *参数 放在 **参数 之前!!!否则编译错误。
通常情况下,都是将可变参数写在最后面。
如果写在前面则会将后面的参数也会收集到列表中。如果将可变参数写在前面,则需要指定后面的参数名
006、Python 中的 super()用法
super()是 Python 中内置的一个函数,用于调用父类的方法。
class A():
def eat(self):
print('i eat food')
class B(A):
def run(self):
print('i can run')
b = B()
#
调用父类的
eat
b.eat() # i eat food
如果一个子类继承了两个父类,并且父类中的方法名相同。那究竟会调用哪个类呢?
这个问题可以通过类的内置属性 mro 去查看调用顺序。这个方法主要是在多继承时判断
方法、属性的调用路径。 ```python class A: num = 1 def method(self): print('A ..method')
class B: num = 2 def method(self): print('B .. method')
class C(A, B): num = 3 pass
if name == 'main': c = C() print(C.mro) # (, , , ) print(c.num) # 3 c.method() # A ..method ```
如上,C.mro 打印结果可以执行顺序为 C -> A - >B
因此 print(c.num)。因为 c 中有 num 属性,所以会打印 3.
执行 c.method 时 。因为 c 中没有 method 属性,会去 A 中查找,则输出 A..method。
007、Python 中的深浅拷贝
拷贝就是对变量的复制, > 浅拷贝:
拷贝对象并给其分配新的内存。但是只会拷贝父对象
#
定义一个变量
a
a = ['a', 1, 'd', ['z', 'x', 'c']]
# b
浅拷贝了
a
b = a.copy()
print(a) # ['a', 1, 'd', ['z', 'x', 'c']]
print(b) # ['a', 1, 'd', ['z', 'x', 'c']]
#
打印各自的内存地址,发现各不相同。证明了浅拷贝会分配一个新的内存地址
print(id(a)) # 2767408
print(id(b)) # 121575744
但是如果修改 a 中的元素,会怎么样呢?
#
修改
a
中的第一个元素为
'A'
a[0] = 'A'
print(a) # ['A', 1, 'd', ['z', 'x', 'c']]
print(b) # ['a', 1, 'd', ['z', 'x', 'c']]
发现
b
并没有受影响
#
修改第四个元素中的第一个元素,将
z
修改成
Q
a[3][1] = 'Q'
print(a) # ['A', 1, 'd', ['z', 'Q', 'c']]
print(b) # ['A', 1, 'd', ['z', 'Q', 'c']]
发现
b
也被修改了。
why
?
print(id(a[3])) # 2766208
print(id(b[3])) # 2766208
如上修改 a 中的第一个元素。b 不会被修改。但是修改 第四个元素中的第一个元素。b 却
被影响了。这就是前面说的浅拷贝只会拷贝第一层数据。
第二层['z', 'Q', 'c']并没有拷贝成功。
这个时候 b 中的['z', 'Q', 'c'] 的内存地址和 a 中的['z', 'Q', 'c']内存地址是一样的。 (浅拷贝
只是把这个第二层的引用拷贝过来了。)。所以 a 中第二层的数据发生变化,b 中的数据
也会跟着变化。
深拷贝:
对对象的完全拷贝,不管你有多少层,数据都不会共享。 深拷贝需要引入 copy 模块。
import copy
还是拿上面的数据我们进行演示。
import copy
a = ['a', 1, 'd', ['z', 'x', 'c']]
b = copy.deepcopy(a)
print(a) # ['a', 1, 'd', ['z', 'x', 'c']]
print(a) # ['a', 1, 'd', ['z', 'x', 'c']]
#
变量的内存空间地址
print(id(a)) # 120265424
print(id(b)) # 15809072
print(a[-1])
#
最后一个元素
(['z', 'x', 'c'])
的内存地址
print(id(a[-1])) # 16171936
print(id(b[-1])) # 120265344
#
修改
a[0] = 'A'
a[3][0] ='Q'
print(a) # ['A', 1, 'd', ['Q', 'x', 'c']]
剩余15页未读,继续阅读
资源评论
上趣工作室
- 粉丝: 127
- 资源: 65
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功