日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python对象模型映射_看例子,学 Python(三)

發布時間:2024/8/5 python 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python对象模型映射_看例子,学 Python(三) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

看例子,學 Python(三)

創建一個目錄 myutil,把 mymath.py 挪到里面,再添加一個空文件 __init__.py:

myutil/

__init__.py

mymath.py

myutil 便是一個包(package)。

import

最直接的用法:

>>> import myutil.mymath

>>> myutil.mymath.fac(4)

24

缺點是調用 fac 時太長,包和模塊作為前綴都要寫全。但是寫成 import myutil.mymath.fac 也是不對的。

通過 import 的語法(syntax):

import ..

可以看出:

最后一項(item)可以是包也可以是模塊,前面的必須是包;

最后一項不可以是類、函數或變量的定義。

根據語法來看,可以 import 一個包:

>>> import myutil

>>> help(myutil)

...

但是這樣并沒有什么實際用處,因為無法就此調用具體的函數(類、變量):

>>> myutil.mymath.fac(4)

Traceback (most recent call last):

File "", line 1, in

AttributeError: module 'myutil' has no attribute 'mymath'

from...import

如果要避免調用時帶著一串前綴,可以用 from...import:

>>> from myutil.mymath import fac

>>> fac(4) # 不再需要前綴

24

一次 import 多個時以逗號分割:

>>> from myutil.mymath import fib, fac

一次 import 所有:

>>> from myutil.mymath import *

from...import... 避免了前綴,但是也污染了名字,使用時需權衡。

高階函數

高階函數(higher-order)就是操作或返回其它函數的函數。

下面是幾個經典的高階函數,其它稍微函數式一點的語言里一般也有。

reduce(規約)

用 reduce 重寫階乘:

import operator, functools

def fac(n):

return functools.reduce(operator.mul, range(1, n+1))

用 reduce 求和:

def sum(n):

return functools.reduce(operator.add, range(1, n+1))

Python 的 reduce 就相當于 C++ 的 accumulate(C++17 已經新增 reduce)。

std::vector v{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

int sum = std::accumulate(v.begin(), v.end(), 0); // 求和

int product = std::accumulate(v.begin(), v.end(), 1, std::multiplies()); // 求積

map(映射)

>>> list(map(bool, [None, 0, "", u"", list(), tuple(), dict(), set(), frozenset()]))

[False, False, False, False, False, False, False, False, False]

None、0、空字符串、以及沒有元素的容器對象都可視為 False,反之為 True。

filter(過濾)

>>> list(filter(bool, [None, 0, "", 1]))

[1]

數據模型

== vs. is

== 判斷值是否相等,is 判斷兩個變量是否為同一個對象。

這就好像 Java 里的 == 和 equals 一樣。

下面是一些例子:

>>> a, b = 1, 1

>>> a == b

True

>>> a is b

True

a == b 比較好理解,a is b 是因為 Python 對整數做了優化,a 和 b 都指向同一個預先分配的對象(其值為 1)。

可以理解為 is 比較的是對象的內存地址。

內建函數 id() 返回對象的唯一標識,可以理解為內存地址。

>>> id(a), id(b)

(35169392, 35169392)

甚至可以拿到一個對象的引用計數(reference count):

>>> import sys

>>> sys.getrefcount(a)

99

>>> sys.getrefcount(b)

99

引用計數為 99 有點意外,其實是因為很多裝載的內建模塊都用到了整數 1。

不妨看看其它整數如何:

>>> sys.getrefcount(0)

169

>>> sys.getrefcount(255)

4

對 Python 來說,變量只是名字,它的類型和值取決于它所綁定的對象。我們可以把 a b 綁定到其它對象:

>>> a, b = "hello", "hello"

>>> a is b

True

同樣,a is b 是因為 Python 對字符串做了優化。

值得一提的是,這種優化(也即引用計數)可能只針對 CPython,對于 Python 的其它實現可能就不是這樣了。你的程序不該依賴于這些特定于解釋器的實現。

整數和字符串有一個共同點,即它們都是不可變的(immutable),現在來看看可變對象,比如列表:

>>> c, d = [a, b], [a, b]

>>> c == d

True

>>> c is d

False

可見雖然 c 和 d 具有相等的值,但對象是不同的兩個。

這些就是 Python 的數據模型(Data Model),雖然不是全部。

對象

Python 的每一個對象(object)都有以下三個部分:

身份(identity)

類型(type)

值(value)

身份:

不可改變(unchangeable)(一旦對象創建了就不會改變)

對應于內存地址

通過操作符 is 進行比較: a is b

函數 id() 返回對象唯一的整形標識(內存地址)

類型:

不可改變(unchangeable)

函數 type() 返回對象類型

值:

可變的(mutable):字典,列表

不可變的(immutable):數字,字符串,元組

最后,對象不會被顯式地銷毀(explicitly destroyed)。

對 CPython 來說,對象由引用計數管理,計數為 0 時對象會自動銷毀。

練習

最后留一道練習。

給定:

>>> c = []

>>> d = []

>>> c is d

False

請問:

>>> e = f = []

>>> e is f

???

總結

以上是生活随笔為你收集整理的python对象模型映射_看例子,学 Python(三)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。