99偷拍视频精品区一区二,口述久久久久久久久久久久,国产精品夫妇激情啪发布,成人永久免费网站在线观看,国产精品高清免费在线,青青草在线观看视频观看,久久久久久国产一区,天天婷婷久久18禁,日韩动漫av在线播放直播

python垃圾函數(shù)詳解 菜鳥教程python函數(shù)

python函數(shù)解析

lambda是個匿名函數(shù)而已, 這里就是產(chǎn)生了字典{True:f1, False f2},字典的兩個值就是2個函數(shù),f1 就是shutil.copy(...),f2就是copytree了,你可以理解成兩個函數(shù)指針。

專注于為中小企業(yè)提供網(wǎng)站設(shè)計、網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)南開免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了成百上千企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

bresult是個true或者false的值,后面[bresult]():就表示,根據(jù)bresult的結(jié)果調(diào)用前面字典里面對應(yīng)的兩個函數(shù)。bresult在這里是字典的key。函數(shù)在這里是字典的value.

python函數(shù)深入淺出 13.os.listdir()函數(shù)詳解

這是os模塊下操作目錄和文件相關(guān)的函數(shù)

listdir() 只返回文件夾下所有文件名的列表(list)

math 模塊則會把參數(shù)轉(zhuǎn)換為 float。

listdir()方法語法格式如下:

參數(shù)

path -- 需要列出的目錄路徑,默認(rèn)為當(dāng)前路徑

其他相關(guān)的操作文件(文件夾)函數(shù)如下:

當(dāng)我們需要遍歷某個文件夾下文件/目錄通常有兩種操作

當(dāng)獲取文件后如何獲取其后綴名,判斷是否指定格式的文檔、圖片比如txt,doc,bmp,png,gif,jpg等:

熟練操作文件和目錄,可以幫組我們寫批量腳本時更高效,也是重要的python基礎(chǔ)之一。

對基礎(chǔ)運(yùn)行環(huán)境有疑問的,推薦參考: python函數(shù)深入淺出 0.基礎(chǔ)篇

Python中冷門但非常好用的內(nèi)置函數(shù)

Python中有許多內(nèi)置函數(shù),不像print、len那么廣為人知,但它們的功能卻異常強(qiáng)大,用好了可以大大提高代碼效率,同時提升代碼的簡潔度,增強(qiáng)可閱讀性

Counter

collections在python官方文檔中的解釋是High-performance container datatypes,直接的中文翻譯解釋高性能容量數(shù)據(jù)類型。這個模塊實現(xiàn)了特定目標(biāo)的容器,以提供Python標(biāo)準(zhǔn)內(nèi)建容器 dict , list , set , 和 tuple 的替代選擇。在python3.10.1中它總共包含以下幾種數(shù)據(jù)類型:

容器名簡介

namedtuple() 創(chuàng)建命名元組子類的工廠函數(shù)

deque 類似列表(list)的容器,實現(xiàn)了在兩端快速添加(append)和彈出(pop)

ChainMap 類似字典(dict)的容器類,將多個映射集合到一個視圖里面

Counter 字典的子類,提供了可哈希對象的計數(shù)功能

OrderedDict 字典的子類,保存了他們被添加的順序

defaultdict 字典的子類,提供了一個工廠函數(shù),為字典查詢提供一個默認(rèn)值

UserDict 封裝了字典對象,簡化了字典子類化

UserList 封裝了列表對象,簡化了列表子類化

UserString 封裝了字符串對象,簡化了字符串子類化

其中Counter中文意思是計數(shù)器,也就是我們常用于統(tǒng)計的一種數(shù)據(jù)類型,在使用Counter之后可以讓我們的代碼更加簡單易讀。Counter類繼承dict類,所以它能使用dict類里面的方法

舉例

#統(tǒng)計詞頻

fruits = ['apple', 'peach', 'apple', 'lemon', 'peach', 'peach']

result = {}

for fruit in fruits:

if not result.get(fruit):

result[fruit] = 1

else:

result[fruit] += 1

print(result)

#{'apple': 2, 'peach': 3, 'lemon': 1}下面我們看用Counter怎么實現(xiàn):

from collections import Counter

fruits = ['apple', 'peach', 'apple', 'lemon', 'peach', 'peach']

c = Counter(fruits)

print(dict(c))

#{'apple': 2, 'peach': 3, 'lemon': 1}顯然代碼更加簡單了,也更容易閱讀和維護(hù)了。

elements()

返回一個迭代器,其中每個元素將重復(fù)出現(xiàn)計數(shù)值所指定次。元素會按首次出現(xiàn)的順序返回。如果一個元素的計數(shù)值小于1,elements()將會忽略它。

c = Counter(a=4, b=2, c=0, d=-2)

sorted(c.elements())

['a', 'a', 'a', 'a', 'b', 'b']most_common([n])

返回一個列表,其中包含n個最常見的元素及出現(xiàn)次數(shù),按常見程度由高到低排序。如果n被省略或為None,most_common()將返回計數(shù)器中的所有元素。計數(shù)值相等的元素按首次出現(xiàn)的順序排序:

Counter('abracadabra').most_common(3)

[('a', 5), ('b', 2), ('r', 2)]這兩個方法是Counter中最常用的方法,其他方法可以參考 python3.10.1官方文檔

實戰(zhàn)

Leetcode 1002.查找共用字符

給你一個字符串?dāng)?shù)組words,請你找出所有在words的每個字符串中都出現(xiàn)的共用字符(包括重復(fù)字符),并以數(shù)組形式返回。你可以按任意順序返回答案。

輸入:words = ["bella", "label", "roller"]

輸出:["e", "l", "l"]

輸入:words = ["cool", "lock", "cook"]

輸出:["c", "o"]看到統(tǒng)計字符,典型的可以用Counter完美解決。這道題是找出字符串列表里面每個元素都包含的字符,首先可以用Counter計算出每個元素每個字符出現(xiàn)的次數(shù),依次取交集最后得出所有元素共同存在的字符,然后利用elements輸出共用字符出現(xiàn)的次數(shù)

class Solution:

def commonChars(self, words: List[str]) - List[str]:

from collections import Counter

ans = Counter(words[0])

for i in words[1:]:

ans = Counter(i)

return list(ans.elements())提交一下,發(fā)現(xiàn)83個測試用例耗時48ms,速度還是不錯的

sorted

在處理數(shù)據(jù)過程中,我們經(jīng)常會用到排序操作,比如將列表、字典、元組里面的元素正/倒排序。這時候就需要用到sorted(),它可以對任何可迭代對象進(jìn)行排序,并返回列表

對列表升序操作:

a = sorted([2, 4, 3, 7, 1, 9])

print(a)

# 輸出:[1, 2, 3, 4, 7, 9]對元組倒序操作:

sorted((4,1,9,6),reverse=True)

print(a)

# 輸出:[9, 6, 4, 1]使用參數(shù):key,根據(jù)自定義規(guī)則,按字符串長度來排序:

fruits = ['apple', 'watermelon', 'pear', 'banana']

a = sorted(fruits, key = lambda x : len(x))

print(a)

# 輸出:['pear', 'apple', 'banana', 'watermelon']all

all() 函數(shù)用于判斷給定的可迭代參數(shù)iterable中的所有元素是否都為 TRUE,如果是返回 True,否則返回 False。元素除了是 0、空、None、False外都算True。注意:空元組、空列表返回值為True。

all(['a', 'b', 'c', 'd']) # 列表list,元素都不為空或0

True

all(['a', 'b', '', 'd']) # 列表list,存在一個為空的元素

False

all([0, 1,2, 3]) # 列表list,存在一個為0的元素

False

all(('a', 'b', 'c', 'd')) # 元組tuple,元素都不為空或0

True

all(('a', 'b', '', 'd')) # 元組tuple,存在一個為空的元素

False

all((0, 1, 2, 3)) # 元組tuple,存在一個為0的元素

False

all([]) # 空列表

True

all(()) # 空元組

Trueany函數(shù)正好和all函數(shù)相反:判斷一個tuple或者list是否全為空,0,F(xiàn)alse。如果全為空,0,F(xiàn)alse,則返回False;如果不全為空,則返回True。

F-strings

在python3.6.2版本中,PEP 498提出一種新型字符串格式化機(jī)制,被稱為 “字符串插值” 或者更常見的一種稱呼是F-strings,F(xiàn)-strings提供了一種明確且方便的方式將python表達(dá)式嵌入到字符串中來進(jìn)行格式化:

s1='Hello'

s2='World'

print(f'{s1} {s2}!')

# Hello World!在F-strings中我們也可以執(zhí)行函數(shù):

def power(x):

return x*x

x=4

print(f'{x} * {x} = {power(x)}')

# 4 * 4 = 16而且F-strings的運(yùn)行速度很快,比傳統(tǒng)的%-string和str.format()這兩種格式化方法都快得多,書寫起來也更加簡單。

本文主要講解了python幾種冷門但好用的函數(shù),更多內(nèi)容以后會陸陸續(xù)續(xù)更新~

68 個 Python 內(nèi)置函數(shù)詳解

內(nèi)置函數(shù)就是Python給你提供的,拿來直接用的函數(shù),比如print.,input等。

截止到python版本3.6.2 ,python一共提供了68個內(nèi)置函數(shù),具體如下

本文將這68個內(nèi)置函數(shù)綜合整理為12大類,正在學(xué)習(xí)Python基礎(chǔ)的讀者一定不要錯過,建議收藏學(xué)習(xí)!

(1)列表和元組

(2)相關(guān)內(nèi)置函數(shù)

(3)字符串

frozenset 創(chuàng)建一個凍結(jié)的集合,凍結(jié)的集合不能進(jìn)行添加和刪除操作。

語法:sorted(Iterable, key=函數(shù)(排序規(guī)則), reverse=False)

語法:fiter(function. Iterable)

function: 用來篩選的函數(shù). 在?lter中會自動的把iterable中的元素傳遞給function. 然后根據(jù)function返回的True或者False來判斷是否保留留此項數(shù)據(jù) , Iterable: 可迭代對象

搜索公眾號頂級架構(gòu)師后臺回復(fù)“面試”,送你一份驚喜禮包。

語法 : map(function, iterable)

可以對可迭代對象中的每一個元素進(jìn)行映射. 分別去執(zhí)行 function

hash : 獲取到對象的哈希值(int, str, bool, tuple). hash算法:(1) 目的是唯一性 (2) dict 查找效率非常高, hash表.用空間換的時間 比較耗費(fèi)內(nèi)存

面試必備 - Python 垃圾回收機(jī)制

眾所周知,Python 是一門面向?qū)ο笳Z言,在 Python 的世界一切皆對象。所以一切變量的本質(zhì)都是對象的一個指針而已。

Python 運(yùn)行過程中會不停的創(chuàng)建各種變量,而這些變量是需要存儲在內(nèi)存中的,隨著程序的不斷運(yùn)行,變量數(shù)量越來越多,所占用的空間勢必越來越大,如果對變量所占用的內(nèi)存空間管理不當(dāng)?shù)脑挘敲纯隙〞霈F(xiàn) out of memory。程序大概率會被異常終止。

因此,對于內(nèi)存空間的有效合理管理變得尤為重要,那么 Python 是怎么解決這個問題的呢。其實很簡單,對不不可能再使用到的內(nèi)存進(jìn)行回收即可,像 C 語言中需要程序員手動釋放內(nèi)存就是這個道理。但問題是如何確定哪些內(nèi)存不再會被使用到呢?這就是我們今天要說的垃圾回收了。

目前垃圾回收比較通用的解決辦法有三種,引用計數(shù),標(biāo)記清除以及分代回收。

引用計數(shù)也是一種最直觀,最簡單的垃圾收集技術(shù)。在 Python 中,大多數(shù)對象的生命周期都是通過對象的引用計數(shù)來管理的。其原理非常簡單,我們?yōu)槊總€對象維護(hù)一個 ref 的字段用來記錄對象被引用的次數(shù),每當(dāng)對象被創(chuàng)建或者被引用時將該對象的引用次數(shù)加一,當(dāng)對象的引用被銷毀時該對象的引用次數(shù)減一,當(dāng)對象的引用次數(shù)減到零時說明程序中已經(jīng)沒有任何對象持有該對象的引用,換言之就是在以后的程序運(yùn)行中不會再次使用到該對象了,那么其所占用的空間也就可以被釋放了了。

我們來看看下面的例子。

函數(shù) print_memory_info 用來獲取程序占用的內(nèi)存空間大小,在 foo 函數(shù)中創(chuàng)建一個包含一百萬個整數(shù)的列表。從打印結(jié)果我們可以看出,創(chuàng)建完列表之后程序耗用的內(nèi)存空間上升到了 55 MB。而當(dāng)函數(shù) foo 調(diào)用完畢之后內(nèi)存消耗又恢復(fù)正常。

這是因為我們在函數(shù) foo 中創(chuàng)建的 list 變量是局部變量,其作用域是當(dāng)前函數(shù)內(nèi)部,一旦函數(shù)執(zhí)行完畢,局部變量的引用會被自動銷毀,即其引用次數(shù)會變?yōu)榱悖加玫膬?nèi)存空間也會被回收。

為了驗證我們的想法,我們對函數(shù) foo 稍加改造。代碼如下:

稍加改造之后,即使 foo 函數(shù)調(diào)用結(jié)束其所消耗的內(nèi)存也未被釋放。

主要是因為我們將函數(shù) foo 內(nèi)部產(chǎn)生的列表返回并在主程序中接收之后,這樣就會導(dǎo)致該列表的引用依然存在,該對象后續(xù)仍有可能被使用到,垃圾回收便不會回收該對象。

那么,什么時候?qū)ο蟮囊么螖?shù)才會增加呢。下面四種情況都會導(dǎo)致對象引用次數(shù)加一。

同理,對象引用次數(shù)減一的情況也有四種。

引用計數(shù)看起來非常簡單,實現(xiàn)起來也不復(fù)雜,只需要維護(hù)一個字段保存對象被引用的次數(shù)即可,那么是不是就代表這種算法沒有缺點了呢。實則不然,我們知道引用次數(shù)為零的對象所占用的內(nèi)存空間肯定是需要被回收的。那引用次數(shù)不為零的對象呢,是不是就一定不能回收呢?

我們來看看下面的例子,只是對函數(shù) foo 進(jìn)行了改造,其余未做更改。

我們看到,在函數(shù) foo 內(nèi)部生成了兩個列表 list_a 和 list_b,然后將兩個列表分別添加到另外一個中。由結(jié)果可以看出,即使 foo 函數(shù)結(jié)束之后其所占用的內(nèi)存空間依然未被釋放。這是因為對于 list_a 和 list_b 來說雖然沒有被任何外部對象引用,但因為二者之間交叉引用,以至于每個對象的引用計數(shù)都不為零,這也就造成了其所占用的空間永遠(yuǎn)不會被回收的尷尬局面。這個缺點是致命的。

為了解決交叉引用的問題,Python 引入了標(biāo)記清除算法和分代回收算法。

顯然,可以包含其他對象引用的容器對象都有可能產(chǎn)生交叉引用問題,而標(biāo)記清除算法就是為了解決交叉引用的問題的。

標(biāo)記清除算法是一種基于對象可達(dá)性分析的回收算法,該算法分為兩個步驟,分別是標(biāo)記和清除。標(biāo)記階段,將所有活動對象進(jìn)行標(biāo)記,清除階段將所有未進(jìn)行標(biāo)記的對象進(jìn)行回收即可。那么現(xiàn)在的為問題變?yōu)榱?GC 是如何判定哪些是活動對象的?

事實上 GC 會從根結(jié)點出發(fā),與根結(jié)點直接相連或者間接相連的對象我們將其標(biāo)記為活動對象(該對象可達(dá)),之后進(jìn)行回收階段,將未標(biāo)記的對象(不可達(dá)對象)進(jìn)行清除。前面所說的根結(jié)點可以是全局變量,也可以是調(diào)用棧。

標(biāo)記清除算法主要用來處理一些容器對象,雖說該方法完全可以做到不誤殺不遺漏,但 GC 時必須掃描整個堆內(nèi)存,即使只有少量的非可達(dá)對象需要回收也需要掃描全部對象。這是一種巨大的性能浪費(fèi)。

由于標(biāo)記清除算法需要掃描整個堆的所有對象導(dǎo)致其性能有所損耗,而且當(dāng)可以回收的對象越少時性能損耗越高。因此 Python 引入了分代回收算法,將系統(tǒng)中存活時間不同的對象劃分到不同的內(nèi)存區(qū)域,共三代,分別是 0 代,1 代 和 2 代。新生成的對象是 0 代,經(jīng)過一次垃圾回收之后,還存活的對象將會升級到 1 代,以此類推,2 代中的對象是存活最久的對象。

那么什么時候觸發(fā)進(jìn)行垃圾回收算法呢。事實上隨著程序的運(yùn)行會不斷的創(chuàng)建新的對象,同時也會因為引用計數(shù)為零而銷毀大部分對象,Python 會保持對這些對象的跟蹤,由于交叉引用的存在,以及程序中使用了長時間存活的對象,這就造成了新生成的對象的數(shù)量會大于被回收的對象數(shù)量,一旦二者之間的差值達(dá)到某個閾值就會啟動垃圾回收機(jī)制,使用標(biāo)記清除算法將死亡對象進(jìn)行清除,同時將存活對象移動到 1 代。 以此類推,當(dāng)二者的差值再次達(dá)到閾值時又觸發(fā)垃圾回收機(jī)制,將存活對象移動到 2 代。

這樣通過對不同代的閾值做不同的設(shè)置,就可以做到在不同代使用不同的時間間隔進(jìn)行垃圾回收,以追求性能最大。

事實上,所有的程序都有一個相識的現(xiàn)象,那就是大部分的對象生存周期都是相當(dāng)短的,只有少量對象生命周期比較長,甚至?xí)qv內(nèi)存,從程序開始運(yùn)行持續(xù)到程序結(jié)束。而通過分代回收算法,做到了針對不同的區(qū)域采取不同的回收頻率,節(jié)約了大量的計算從而提高 Python 的性能。

除了上面所說的差值達(dá)到一定閾值會觸發(fā)垃圾回收之外,我們還可以顯示的調(diào)用 gc.collect() 來觸發(fā)垃圾回收,最后當(dāng)程序退出時也會進(jìn)行垃圾回收。

本文介紹了 Python 的垃圾回收機(jī)制,垃圾回收是 Python 自帶的功能,并不需要程序員去手動管理內(nèi)存。

其中引用計數(shù)法是最簡單直接的,但是需要維護(hù)一個字段且針對交叉引用無能為力。

標(biāo)記清除算法主要是為了解決引用計數(shù)的交叉引用問題,該算法的缺點就是需要掃描整個堆的所有對象,有點浪費(fèi)性能。

而分代回收算法的引入則完美解決了標(biāo)記清除算法需要掃描整個堆對象的性能浪費(fèi)問題。該算法也是建立在標(biāo)記清除基礎(chǔ)之上的。

最后我們可以通過 gc.collect() 手動觸發(fā) GC 的操作。

題外話,如果你看過 JVM 的垃圾回收算法之后會發(fā)現(xiàn) Python 的垃圾回收算法與其是如出一轍的,事實再次證明,程序語言設(shè)計時是會相互參考的。

名稱欄目:python垃圾函數(shù)詳解 菜鳥教程python函數(shù)
URL標(biāo)題:http://www.yijiale78.com/article34/docjcse.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT標(biāo)簽優(yōu)化響應(yīng)式網(wǎng)站網(wǎng)站排名商城網(wǎng)站網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名