摘要:看例子,學(xué)三看例子,學(xué)一看例子,學(xué)二包創(chuàng)建一個目錄,把挪到里面,再添加一個空文件便是一個包。對來說,對象由引用計數(shù)管理,計數(shù)為時對象會自動銷毀。給定請問看例子,學(xué)一看例子,學(xué)二
看例子,學(xué) Python(三)
看例子,學(xué) Python(一)
看例子,學(xué) Python(二)
創(chuàng)建一個目錄 myutil,把 mymath.py 挪到里面,再添加一個空文件 __init__.py:
myutil/ __init__.py mymath.py
myutil 便是一個包(package)。
import最直接的用法:
>>> import myutil.mymath >>> myutil.mymath.fac(4) 24
缺點(diǎn)是調(diào)用 fac 時太長,包和模塊作為前綴都要寫全。但是寫成 import myutil.mymath.fac 也是不對的。
通過 import 的語法(syntax):
import <包>.<包>.<包|模塊>
可以看出:
最后一項(item)可以是包也可以是模塊,前面的必須是包;
最后一項不可以是類、函數(shù)或變量的定義。
根據(jù)語法來看,可以 import 一個包:
>>> import myutil >>> help(myutil) ...
但是這樣并沒有什么實際用處,因為無法就此調(diào)用具體的函數(shù)(類、變量):
>>> myutil.mymath.fac(4) Traceback (most recent call last): File "from...import", line 1, in AttributeError: module "myutil" has no attribute "mymath"
如果要避免調(diào)用時帶著一串前綴,可以用 from...import:
>>> from myutil.mymath import fac >>> fac(4) # 不再需要前綴 24
一次 import 多個時以逗號分割:
>>> from myutil.mymath import fib, fac
一次 import 所有:
>>> from myutil.mymath import *
from...import... 避免了前綴,但是也污染了名字,使用時需權(quán)衡。
高階函數(shù)高階函數(shù)(higher-order)就是操作或返回其它函數(shù)的函數(shù)。
下面是幾個經(jīng)典的高階函數(shù),其它稍微函數(shù)式一點(diǎn)的語言里一般也有。
用 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 就相當(dāng)于 C++ 的 accumulate(C++17 已經(jīng)新增 reduce)。
std::vectormap(映射)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 ()); // 求積
>>> 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]數(shù)據(jù)模型 == vs. is
== 判斷值是否相等,is 判斷兩個變量是否為同一個對象。
這就好像 Java 里的 == 和 equals 一樣。
下面是一些例子:
>>> a, b = 1, 1 >>> a == b True >>> a is b True
a == b 比較好理解,a is b 是因為 Python 對整數(shù)做了優(yōu)化,a 和 b 都指向同一個預(yù)先分配的對象(其值為 1)。
可以理解為 is 比較的是對象的內(nèi)存地址。
內(nèi)建函數(shù) id() 返回對象的唯一標(biāo)識,可以理解為內(nèi)存地址。
>>> id(a), id(b) (35169392, 35169392)
甚至可以拿到一個對象的引用計數(shù)(reference count):
>>> import sys >>> sys.getrefcount(a) 99 >>> sys.getrefcount(b) 99
引用計數(shù)為 99 有點(diǎn)意外,其實是因為很多裝載的內(nèi)建模塊都用到了整數(shù) 1。
不妨看看其它整數(shù)如何:
>>> sys.getrefcount(0) 169 >>> sys.getrefcount(255) 4
對 Python 來說,變量只是名字,它的類型和值取決于它所綁定的對象。我們可以把 a b 綁定到其它對象:
>>> a, b = "hello", "hello" >>> a is b True
同樣,a is b 是因為 Python 對字符串做了優(yōu)化。
值得一提的是,這種優(yōu)化(也即引用計數(shù))可能只針對 CPython,對于 Python 的其它實現(xiàn)可能就不是這樣了。你的程序不該依賴于這些特定于解釋器的實現(xiàn)。
整數(shù)和字符串有一個共同點(diǎn),即它們都是不可變的(immutable),現(xiàn)在來看看可變對象,比如列表:
>>> c, d = [a, b], [a, b] >>> c == d True >>> c is d False
可見雖然 c 和 d 具有相等的值,但對象是不同的兩個。
這些就是 Python 的數(shù)據(jù)模型(Data Model),雖然不是全部。
對象Python 的每一個對象(object)都有以下三個部分:
身份(identity)
類型(type)
值(value)
身份:
不可改變(unchangeable)(一旦對象創(chuàng)建了就不會改變)
對應(yīng)于內(nèi)存地址
通過操作符 is 進(jìn)行比較: a is b
函數(shù) id() 返回對象唯一的整形標(biāo)識(內(nèi)存地址)
類型:
不可改變(unchangeable)
函數(shù) type() 返回對象類型
值:
可變的(mutable):字典,列表
不可變的(immutable):數(shù)字,字符串,元組
最后,對象不會被顯式地銷毀(explicitly destroyed)。
對 CPython 來說,對象由引用計數(shù)管理,計數(shù)為 0 時對象會自動銷毀。
最后留一道練習(xí)。
給定:
>>> c = [] >>> d = [] >>> c is d False
請問:
>>> e = f = [] >>> e is f ???
看例子,學(xué) Python(一)
看例子,學(xué) Python(二)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/38638.html
摘要:看例子,學(xué)二看例子,學(xué)一看例子,學(xué)三模塊文件定義了函數(shù)和,就是一個模塊。這個列表里的每個元素都是一個鍵值對,由元組表示。指定的為,便以每個鍵值對元組下標(biāo)為的元素進(jìn)行排序??蓪⑵渌蛄蓄愋娃D(zhuǎn)換成元組看例子,學(xué)一看例子,學(xué)三 看例子,學(xué) Python(二) 看例子,學(xué) Python(一)看例子,學(xué) Python(三) 模塊 文件 mymath.py 定義了函數(shù) fib 和 fac,myma...
摘要:從開始,通過一系列不同實現(xiàn),簡單介紹字符串函數(shù)等概念。如果文檔字符串有多行,可以使用三重引號的字符串函數(shù)返回值只要是函數(shù),都有返回值,沒有明確指定返回值的,就返回。看例子,學(xué)二看例子,學(xué)三 看例子,學(xué) Python(一) 看例子,學(xué) Python(二)看例子,學(xué) Python(三) 很難說,這篇代碼比文字還多的文章,是否適合初學(xué)者。它源于個人筆記,涉及的多是簡單核心的概念,也許需要一些...
摘要:在流程控制中,你將同步學(xué)到關(guān)系運(yùn)算符與邏輯運(yùn)算符。關(guān)系運(yùn)算符在中關(guān)系運(yùn)算符其實就是比大小的概念,所以要學(xué)習(xí)的就是大于小于等于等內(nèi)容。邏輯運(yùn)算符邏輯運(yùn)算符在中有個,分別是。含有邏輯運(yùn)算符的式子,最終返回的結(jié)果也是布爾值。 滾雪球?qū)W Python,目標(biāo)就是讓 Python 學(xué)起來之后,越滾越大。三、無轉(zhuǎn)折不編程如果...
摘要:為啥你天天刷抖音一點(diǎn)都不煩,因為你覺得視頻好看你有興趣啊。比如我們說你玩是不是要開始搭建一個自己的網(wǎng)站,是不是可以自己寫一個小的腳本來自動發(fā)消息給你的女朋友等等,通過這樣的小例子來慢慢的培養(yǎng)自己的學(xué)習(xí)的興趣。學(xué)習(xí),切勿貪快貪多。 大家好,我是菜鳥哥! 周末啦,跟大家聊一下我們粉絲團(tuán)的情況...
閱讀 836·2021-11-22 11:59
閱讀 3253·2021-11-17 09:33
閱讀 2322·2021-09-29 09:34
閱讀 1952·2021-09-22 15:25
閱讀 1969·2019-08-30 15:55
閱讀 1331·2019-08-30 15:55
閱讀 542·2019-08-30 15:53
閱讀 3355·2019-08-29 13:55