python核心程式設計
class ObjectCreator(object):
… pass
將在記憶體中建立一個物件,名字就是ObjectCreator。這個物件(類物件ObjectCreator)擁有建立物件(例項物件)的能力。但是,它的本質仍然是一個物件,於是乎你可以對它做如下的操作:
- 你可以將它賦值給一個變數
- 你可以拷貝它
- 你可以為它增加屬性
- 你可以將它作為函式引數進行
#普通列表
In [15]: L = [ x*2 for x in range(5)]
In [16]: L
Out[16]: [0, 2, 4, 6, 8]
生成器建立
In [17]: G = ( x*2 for x in range(5))
In [18]: G
Out[18]: <generator object <genexpr> at 0x7f626c132db0>
#獲取數值
In [19]: next(G)
Out[19]: 0
In [20]: next(G)
Out[20]: 2
In [21]: next(G)
Out[21]: 4
In [22]: next(G)
Out[22]: 6
In [23]: next(G)
Out[23]: 8
In [24]: next(G)
StopIteration Traceback (most recent call last)
<ipython-input-24-380e167d6934> in <module>()
—-> 1 next(G)
StopIteration:
In [25]:
In [26]: G = ( x*2 for x in range(5))
In [27]: for x in G:
….: print(x)
….:
0
2
4
6
8
generator非常強大。如果推算的演算法比較複雜,用類似列表生成式的 for 迴圈無法實現的時候,還可以用函式來實現。
比如,著名的斐波拉契數列(Fibonacci),除第一個和第二個數外,任意一個數都可由前兩個數相加得到:
1, 1, 2, 3, 5, 8, 13, 21, 34, …
In [28]: def fib(times):
....: n = 0
....: a,b = 0,1
....: while n<times:
....: print(b)
....: a,b = b,a+b
....: n+=1
....: return 'done'
....:
In [29]: fib(5)
1
1
2
3
5
Out[29]: 'done'
仔細觀察,可以看出,fib函式實際上是定義了斐波拉契數列的推算規則,可以從第一個元素開始,推算出後續任意的元素,這種邏輯其實非常類似generator。
也就是說,上面的函式和generator僅一步之遙。要把fib函式變成generator,只需要把print(b)改為yield b就可以了:
In [30]: def fib(times):
….: n = 0
….: a,b = 0,1
….: while n<times:
….: yield b
….: a,b = b,a+b
….: n+=1
….: return ‘done’
….:
In [31]: F = fib(5)
In [32]: next(F)
Out[32]: 1
In [33]: next(F)
Out[33]: 1
In [34]: next(F)
Out[34]: 2
In [35]: next(F)
Out[35]: 3
In [36]: next(F)
Out[36]: 5
In [37]: next(F)
StopIteration Traceback (most recent call last)
<ipython-input-37-8c2b02b4361a> in <module>()
—-> 1 next(F)
StopIteration: done
In [38]: for n in fib(5):
....: print(n)
....:
1
1
2
3
5
1. 可迭代物件
以直接作用於 for 迴圈的資料型別有以下幾種:
一類是集合資料型別,如 list 、 tuple 、 dict 、 set 、 str 等;
一類是 generator ,包括生成器和帶 yield 的generator function。
這些可以直接作用於 for 迴圈的物件統稱為可迭代物件: Iterable 。
閉包:
在函式內部再定義一個函式,並且這個函式用到了外邊函式的變數,那麼將這個函式以及用到的一些變數稱之為閉包
#定義一個函式
def test(number):#在函式內部再定義一個函式,並且這個函式用到了外邊函式的變數,那麼將這個函式以及用到的一些變數稱之為閉包 def test_in(number_in): print("in test_in 函式, number_in is %d"%number_in) return number+number_in #其實這裡返回的就是閉包的結果 return test_in
給test函式賦值,這個20就是給引數number
ret = test(20)
注意這裡的100其實給引數number_in
print(ret(100))
注意這裡的200其實給引數number_in
print(ret(200))
#建立直線方程y = kx+b的例子
def line_conf(a,b):
def line(x):
nonlocal a
nonlocal b
return a*x+b
return line
line1 = line_conf(1,1)
line2 = line_conf(2,3)
print (line1(2))
print(line2(2))
#### 第一波 ####
def foo():
print(‘foo’)
foo #表示是函式
foo() #表示執行foo函式
第二波
def foo():
print(‘foo’)
foo = lambda x: x + 1
foo() # 執行下面的lambda表示式,而不再是原來的foo函式,因為foo這個名字被重新指向了另外一個匿名函式
############### 基礎平臺提供的功能如下 ###############
def f1():
print(‘f1’)
def f2():
print(‘f2’)
def f3():
print(‘f3’)
def f4():
print(‘f4’)
######### 業務部門A 呼叫基礎平臺提供的功能
f1()
f2()
f3()
f4()
######### 業務部門B 呼叫基礎平臺提供的功能
f1()
f2()
f3()
f4()
寫程式碼要遵循開放封閉
原則,雖然在這個原則是用的物件導向開發,但是也適用於函數語言程式設計,簡單來說,它規定已經實現的功能程式碼不允許被修改,但可以被擴充套件,即:
- 封閉:已實現的功能程式碼塊
- 開放:對擴充套件開發
def w1(func):
def inner():
# 驗證1
# 驗證2
# 驗證3
func()
return inner
@w1
def f1():
print('f1')
@w1
def f2():
print('f2')
@w1
def f3():
print('f3')
@w1
def f4():
print('f4')
python直譯器就會從上到下解釋程式碼,步驟如下:
- def w1(func): ==>將w1函式載入到記憶體
- @w1
上例@w1內部會執行以下操作:
@w1
def w1(func):
def inner():
# 驗證1
# 驗證2
# 驗證3
func()
return inner
語法糖
執行過程
def w1(f1):
# 驗證1
# 驗證2
# 驗證3
f1()
return inner
# -- coding: utf-8 --
“””
Created on Thu Aug 10 18:01:24 2017
@author: liaoxianfu
“”“
定義函式,實現包裹資料
def Bold(func):
def wrapped():
return “<b>”+func()+”</b>”
return wrapped
def Itailc(func):
def wrapped():
return “i”+func()+”</i>”
return wrapped
@Bold
def test1():
return “hello world 1”
@Itailc
def test2():
return “Heloord world 2”
@Bold
@Itailc
def test3():
return “Hello world 3”
print(test1())
print(test2())
print(test3())
runfile(‘C:/Users/liaoxianfu/demo1.py’, wdir=’C:/Users/liaoxianfu’)
<b>hello world 1</b>
iHeloord world 2</i>
runfile(‘C:/Users/liaoxianfu/demo1.py’, wdir=’C:/Users/liaoxianfu’)
<b>hello world 1</b>
iHeloord world 2</i>
<b>iHello world 3</i></b>
- 引入日誌
- 函式執行時間統計
- 執行函式前預備處理
- 執行函式後清理功能
- 許可權校驗等場景
- 快取
#無引數的函式
日誌
from time import ctime,sleep
def timefun(func):
def wrappedfunc():
print(“%s runned at %s”%(func.name,ctime()))
func()
return wrappedfunc
@timefun
def foo():
print (“runing “)
foo()
sleep(2)
foo()
#被裝飾的函式有引數
日誌
from time import ctime,sleep
def timefun(func):
def wrappedfunc(a,b):
print(“%s runned at %s”%(func.name,ctime()))
print(a,b)
func(a,b)
return wrappedfunc
@timefun
def foo(a,b):
print (“runing “+str(a+b))
foo(3,5)
sleep(2)
foo(1,2)
foo runned at Thu Aug 10 18:59:37 2017
3 5
runing 8
foo runned at Thu Aug 10 18:59:39 2017
1 2
runing 3
from time import ctime,sleep
def timefun(func):
def wrappedfunc(*args,**kwargs):
print(“%s runned at %s”%(func.name,ctime()))
func(*args,**kwargs)
return wrappedfunc
@timefun
def foo(a,b):
print (“runing “+str(a+b))
@timefun
def foo1(a,b,c):
print (“runing “+str(a+b+c))
foo(3,5)
sleep(2)
foo1(1,2,3)
#被裝飾的函式有引數
日誌
from time import ctime,sleep
def timeargs(pre=”helo”):
def time(func):
def wapperd():
print(“func name is %s runing times is %s”%(func.name,ctime()))
#print(func())
return func()
return wapperd
return time
@timeargs(‘123’)
def foo():
return “Helo World”
print(foo())
sleep(2)
print(foo())
- is 是比較兩個引用是否指向了同一個物件(引用比較)。
- == 是比較兩個物件是否相等。
a = [11,22]
b = copy.deepcopy(a)
b is a
Out[24]: False
b == a
Out[25]: True
深拷貝、淺拷貝
1. 淺拷貝
- 淺拷貝是對於一個物件的頂層拷貝
通俗的理解是:拷貝了引用,並沒有拷貝內容
2. 深拷貝
- 深拷貝是對於一個物件所有層次的拷貝(遞迴)
3. 拷貝的其他方式
淺拷貝對不可變型別和可變型別的copy不同
相關文章
- Python核心程式設計——Chapter16Python程式設計APT
- windows核心程式設計--程式Windows程式設計
- python核心程式設計:入門Python程式設計的8個實踐性建議Python程式設計
- windows核心程式設計--核心物件Windows程式設計物件
- windows核心程式設計--精華Windows程式設計
- 核心動畫程式設計(一)動畫程式設計
- 核心動畫程式設計(二)動畫程式設計
- Windows核心程式設計_HookWindows程式設計Hook
- C++核心程式設計C++程式設計
- windows核心程式設計--纖程Windows程式設計
- windows核心程式設計--DLL基本Windows程式設計
- Windows核心程式設計_磁碟加密Windows程式設計加密
- 讀《Linux核心程式設計》Linux程式設計
- 【Python核心程式設計筆記】一、Python中一切皆物件Python程式設計筆記物件
- [PYTHON] 核心程式設計筆記(14.Python執行環境)薦Python程式設計筆記
- 分享Python核心程式設計第三版PDF進一步提升程式設計水平Python程式設計
- Linux核心程式設計(阻塞程式)(轉)Linux程式設計
- Python核心程式設計筆記第二章----快速入門Python程式設計筆記
- Python核心程式設計v2.0 第11章習題答案Python程式設計
- Python 核心程式設計 第二版 中文版(PDF格式)Python程式設計
- windows核心程式設計--字符集Windows程式設計
- windows核心程式設計--DLL高階Windows程式設計
- 《Windows核心程式設計》筆記(一)Windows程式設計筆記
- MR核心程式設計思想總結程式設計
- C++核心程式設計筆記C++程式設計筆記
- 核心程式設計培訓目錄程式設計
- windows核心程式設計--windows程式的執行Windows程式設計
- Linux核心模組程式設計--阻塞程式(轉)Linux程式設計
- python程式設計Python程式設計
- Python 程式設計Python程式設計
- Python多程式程式設計Python程式設計
- [python] 多程式程式設計Python程式設計
- windows核心程式設計--執行緒池Windows程式設計執行緒
- Windows核心程式設計(一)-環境搭建Windows程式設計
- 驅動篇——核心程式設計基礎程式設計
- 程式設計的一些抽象核心程式設計抽象
- Java 併發程式設計:核心理論Java程式設計
- 《Windows核心程式設計》---又是記憶體Windows程式設計記憶體