說下對(duì)python深淺拷貝的理解。并有代碼簡單實(shí)現(xiàn)
淺拷貝是對(duì)于一個(gè)對(duì)象的頂層拷貝,通俗的理解是:拷貝了引用暑始,并沒有拷貝內(nèi)容
copy.copy
內(nèi)層地址一樣
外層地址:
1廓握、如果是可變芋忿,地址不同
2炸客、如果是不可變,地址相同
深拷貝是對(duì)于一個(gè)對(duì)象所有層次的拷貝(遞歸)
只有一層深淺拷貝沒區(qū)別:都是
1戈钢、如果是可變,地址不同
2是尔、如果是不可變殉了,地址相同
copy.deepcopy
1、如果所有層都是不可變的拟枚,所有層地址相同
2薪铜、如果有一個(gè)可變的,外層一定不同
3恩溅、如果內(nèi)層中這一層是可變的隔箍,地址不同。否則脚乡,地址相同
二者地址一樣蜒滩,指向同一個(gè)
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.簡答
說下對(duì)生成器的理解,有幾種創(chuàng)建方式奶稠,并用代碼簡單實(shí)現(xiàn)俯艰。
如果數(shù)據(jù)量比較大,想辦法以某種算法锌订,進(jìn)行推算出數(shù)據(jù)竹握。將推算的算法保存起來,以后通過算法計(jì)算出下一個(gè)數(shù)據(jù),這樣就避免了一次性占用過多內(nèi)存
在Python中辆飘,這種一邊循環(huán)一邊計(jì)算的機(jī)制啦辐,稱為生成器:generator
可以通過next()函數(shù)獲得生成器的下一個(gè)返回值
要?jiǎng)?chuàng)建一個(gè)生成器,有三種方法蜈项。
1把一個(gè)列表生成式的[?]改成(?),列表生程式
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)??#第一次調(diào)用函數(shù)時(shí),發(fā)現(xiàn)yield,不執(zhí)行,返回一個(gè)對(duì)象地址
print(next(ge))??#通過next獲取生成器中保存算法的每一個(gè)值
print(next(ge))
print(next(ge))
print(next(ge))
print(next(ge))
print(next(ge))
3.簡答
說下對(duì)迭代器的理解,并用代碼簡單實(shí)現(xiàn)战得。
迭代器是一個(gè)可以記住遍歷的位置的對(duì)象充边。迭代器對(duì)象從集合的第一個(gè)元素開始訪問,直到所有的元素被訪問完結(jié)束常侦。迭代器只能往前不會(huì)后退浇冰。可以被next()函數(shù)調(diào)用并不斷返回下一個(gè)值的對(duì)象稱為迭代器:Iterator聋亡。
可以使用isinstance()判斷一個(gè)對(duì)象是否是Iterator對(duì)象.
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.簡答
說下對(duì)裝飾器的理解肘习,并用代碼簡單實(shí)現(xiàn)。
寫代碼要遵循開放封閉原則坡倔,雖然在這個(gè)原則是用的面向?qū)ο箝_發(fā)漂佩,但是也適用于函數(shù)式編程脖含,簡單來說,它規(guī)定已經(jīng)實(shí)現(xiàn)的功能代碼不允許被修改投蝉,但可以被擴(kuò)展养葵,即:
封閉:已實(shí)現(xiàn)的功能代碼塊
開放:對(duì)擴(kuò)展開發(fā)
@函數(shù)名?是python的一種語法糖。
def?outer(func):
print('outer...')
def?inner():
ret?=?input('洗手了嗎?')
if?ret?==?'yes':
func()
else:
print('洗手去')
return?inner???#加小括號(hào)是調(diào)用函數(shù),執(zhí)行程序
@outer???#原函數(shù)
def?myFunc1():????#myFunc1這個(gè)名字指向
print('吃飯....')
@outer
def?myFunc2():
print('睡覺....')
myFunc1()
#?decorate?=?outer(myFunc)
#?print(decorate)???#decorate指向返回值outer里的innner
#?print('**********************')
#?decorate()