生成器
语法比较独特,可以为一些前置共同条件的函数提供实现便利。如下:
def myGenerator(num):
now = 0
while now < num:
val = yield now
now = now + 1 if val is None else val
mg_ins_01 = myGenerator(5)
for i in mg_ins_01:
print (i)迭代器
有__iter__函数和__next__函数的对象都是可迭代对象。如下:
class MyIter(object):
def __init__(self,data):
self.data = data
self.now = 0
def __iter__(self):
return self
def __next__(self):
while self.now < self.data:
self.now += 1
return self.now - 1
raise StopIteration
iter_ins_01 = MyIter(5)
for i in iter_ins_01:
print(i)对象赋值、浅拷贝、深拷贝
对象赋值一般只是赋值了一个指针(类比于C),实际内容在内存中还是一份。浅拷贝会将对象中的简单值赋值一个新副本,但是设计嵌套的对象,则也是简单赋值一个指针(类比于C)。深拷贝则是全部创建副本。
# encoding = utf-8
import copy
def dumpObj(prefix,obj):
print(f"{prefix} address is {id(obj)}")
print(obj)
print(f"element address is {[id(ele) for ele in obj]}")
def asignObj(obj):
print ("asign : ============================")
obj1 = obj
dumpObj("obj:",obj)
dumpObj("obj1:",obj1)
obj1[0] = "gauss-001"
obj1[3][0] = "gauss-001"
dumpObj("obj1:",obj1)
dumpObj("obj",obj)
def copyObj(obj):
print ("copy : ============================")
obj1 = copy.copy(obj)
dumpObj("obj:",obj)
dumpObj("obj1:",obj1)
obj1[0] = "gauss-001"
obj1[3][0] = "gauss-001"
dumpObj("obj1:",obj1)
dumpObj("obj",obj)
def deepCopyObj(obj):
print ("deppcopy : ============================")
obj1 = copy.deepcopy(obj)
dumpObj("obj:",obj)
dumpObj("obj1:",obj1)
obj1[0] = "gauss-001"
obj1[3][0] = "gauss-001"
dumpObj("obj1:",obj1)
dumpObj("obj",obj)
object1 = ["gauss","c++","master",["gauss","java","master"]]
asignObj(object1)
object1 = ["gauss","c++","master",["gauss","java","master"]]
copyObj(object1)
object1 = ["gauss","c++","master",["gauss","java","master"]]
deepCopyObj(object1)