说下对python深浅拷贝的理解。并有代码简单实现
浅拷贝是对于一个对象的顶层拷贝,通俗的理解是:拷贝了引用,并没有拷贝内容
copy.copy
内层地址一样
外层地址:
1、如果是可变,地址不同
2、如果是不可变,地址相同
深拷贝是对于一个对象所有层次的拷贝(递归)
只有一层深浅拷贝没区别:都是
1、如果是可变,地址不同
2、如果是不可变,地址相同
copy.deepcopy
1、如果所有层都是不可变的,所有层地址相同
2、如果有一个可变的,外层一定不同
3、如果内层中这一层是可变的,地址不同。否则,地址相同
二者地址一样,指向同一个
a = [1,2,3]
b = a
a.append(4)
a = [1,2,3,4]b = [1,2,3,4]
id相同
a = [1,2,3]
b = coop.deepcooy(a)
a.append(4)
a = [1,2,3,4]b = [1,2,3]
id不同
2.简答
说下对生成器的理解,有几种创建方式,并用代码简单实现。
如果数据量比较大,想办法以某种算法,进行推算出数据。将推算的算法保存起来,以后通过算法计算出下一个数据,这样就避免了一次性占用过多内存
在Python中,这种一边循环一边计算的机制,称为生成器:generator
可以通过next()函数获得生成器的下一个返回值
要创建一个生成器,有三种方法。
1把一个列表生成式的[ ]改成( ),列表生程式
ge1=(i for i in range(0,100,5))
print(next(ge1))
for i in ge1:
print(i)
2、在方法中使用yield形式保存算法
def fib(num):
a,b = 0,1
while num>1:
print('1....')
yield b #返回值前面加yield
print('2.....')
a,b = b,a+b
num-=1
print('3....')
ge = fib(300)
print(ge) #第一次调用函数时,发现yield,不执行,返回一个对象地址
print(next(ge)) #通过next获取生成器中保存算法的每一个值
print(next(ge))
print(next(ge))
print(next(ge))
print(next(ge))
print(next(ge))
3.简答
说下对迭代器的理解,并用代码简单实现。
迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
可以使用isinstance()判断一个对象是否是Iterator对象.
from collections import Iterable,Iterator
def f():
yield 'hello'
print(isinstance(f(),Iterable))
print(isinstance(f(),Iterator))
print(isinstance('abc',Iterable))
print(isinstance('abc',Iterator))
name = 'abc'
myIter = iter(name)
print(type(myIter))
print(isinstance(myIter,Iterator))
try:
print(next(myIter))
print(next(myIter))
print(next(myIter))
print(next(myIter))
print(next(myIter))
print(next(myIter))
except StopIteration as ex:
print('迭代完了,%s'%ex)
4.简答
说下对装饰器的理解,并用代码简单实现。
写代码要遵循开放封闭原则,虽然在这个原则是用的面向对象开发,但是也适用于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展,即:
封闭:已实现的功能代码块
开放:对扩展开发
@函数名 是python的一种语法糖。
def outer(func):
print('outer...')
def inner():
ret = input('洗手了吗?')
if ret == 'yes':
func()
else:
print('洗手去')
return inner #加小括号是调用函数,执行程序
@outer #原函数
def myFunc1(): #myFunc1这个名字指向
print('吃饭....')
@outer
def myFunc2():
print('睡觉....')
myFunc1()
# decorate = outer(myFunc)
# print(decorate) #decorate指向返回值outer里的innner
# print('**********************')
# decorate()