用Python 的一些用法與 JS 進(jìn)行類比,看有什么相似?

用Python 的一些用法與 JS 進(jìn)行類比捐康,看有什么相似仇矾?

Python 是一門運(yùn)用很廣泛的語言,自動(dòng)化腳本解总、爬蟲贮匕,甚至在深度學(xué)習(xí)領(lǐng)域也都有 Python 的身影。作為一名前端開發(fā)者花枫,也了解 ES6 中的很多特性借鑒自 Python (比如默認(rèn)參數(shù)刻盐、解構(gòu)賦值、Decorator等)劳翰,同時(shí)本文會(huì)對(duì) Python 的一些用法與 JS 進(jìn)行類比敦锌。不管是提升自己的知識(shí)廣度,還是更好地迎接 AI 時(shí)代佳簸,Python 都是一門值得學(xué)習(xí)的語言乙墙。

數(shù)據(jù)類型

在 Python 中,最常用的能夠直接處理的數(shù)據(jù)類型有以下幾種:

  • 數(shù)字[整數(shù)(int)生均、浮點(diǎn)型(float)伶丐、長(zhǎng)整型(long)、復(fù)數(shù)(complex)]
  • 字符串(str)
  • 布爾值(bool)
  • 空值(None)

除此之外疯特,Python 還提供了列表[list]哗魂、字典[dict] 等多種數(shù)據(jù)類型,這在下文中會(huì)介紹漓雅。

類型轉(zhuǎn)換與類型判斷

與 JS 十分類似录别,python 也能實(shí)現(xiàn)不同數(shù)據(jù)類型間的強(qiáng)制與隱式轉(zhuǎn)換,例子如下:

強(qiáng)制類型轉(zhuǎn)換:

用Python 的一些用法與 JS 進(jìn)行類比邻吞,看有什么相似组题?

隱式類型轉(zhuǎn)換:

用Python 的一些用法與 JS 進(jìn)行類比,看有什么相似抱冷?

此外寫代碼的時(shí)候經(jīng)常會(huì)需要判斷值的類型崔列,可以 使用 python 提供的 type() 函數(shù)獲取變量的類型,或者使用 isinstance(x, type) 來判斷 x 是否屬于相應(yīng)的 type 類型旺遮。

用Python 的一些用法與 JS 進(jìn)行類比赵讯,看有什么相似?

有序集合類型

集合是指包含一組元素的數(shù)據(jù)結(jié)構(gòu)耿眉,有序集合即集合里面的元素是是按照順序排列的边翼,Python 中的有序集合大概有以下幾類:list, tuple, str, unicode。

list 類型

Python 中 List 類型類似于 JS 中的 Array,

用Python 的一些用法與 JS 進(jìn)行類比鸣剪,看有什么相似组底?

tuple 類型

tuple 類型是另一種有序的列表丈积,中文翻譯為" 元組 "。tuple 和 list 非常類似债鸡,但是江滨,tuple 一旦創(chuàng)建完畢,就不能修改了厌均。

用Python 的一些用法與 JS 進(jìn)行類比牙寞,看有什么相似?

無序集合類型

dict 類型

Python 中的 dict 類型類似于 JS 中的 {} (最大的不同是它是沒有順序的), 它有如下特點(diǎn):

  • 查找速度快 (無論 dict 有 10 個(gè)元素還是 10 萬個(gè)元素莫秆,查找速度都一樣)
  • 占用內(nèi)存大 (與 list 類型相反)
  • dict 中的 key 不能重復(fù)
  • dict 中存儲(chǔ)的 key-value 序?qū)κ菦]有順序的
用Python 的一些用法與 JS 進(jìn)行類比间雀,看有什么相似?

set 類型

有的時(shí)候镊屎,我們只想要 dict 的 key惹挟,不關(guān)心 key 對(duì)應(yīng)的 value,而且要保證這個(gè)集合的元素不會(huì)重復(fù)缝驳,這時(shí)连锯,set 類型就派上用場(chǎng)了。set 類型有如下特點(diǎn):

  • set 存儲(chǔ)的元素和 dict 的 key 類似用狱,必須是不變對(duì)象
  • set 存儲(chǔ)的元素也是沒有順序的
用Python 的一些用法與 JS 進(jìn)行類比运怖,看有什么相似?

Python 中的迭代

在介紹完 Python 中的有序集合和無序集合類型后夏伊,必然存在遍歷集合的 for 循環(huán)摇展。但是和其它語言的標(biāo)準(zhǔn) for 循環(huán)不同,Python 中的所有迭代是通過 for ... in 來完成的溺忧。以下給出一些常用的迭代 demos:

索引迭代:

用Python 的一些用法與 JS 進(jìn)行類比咏连,看有什么相似?

迭代 dict 的 value:

用Python 的一些用法與 JS 進(jìn)行類比鲁森,看有什么相似祟滴?

迭代 dict 的 key 和 value:

用Python 的一些用法與 JS 進(jìn)行類比,看有什么相似歌溉?

切片操作符

Python 提供的切片操作符類似于 JS 提供的原生函數(shù) slice()垄懂。有了切片操作符,大大簡(jiǎn)化了一些原來得用循環(huán)的操作痛垛。

用Python 的一些用法與 JS 進(jìn)行類比草慧,看有什么相似?

列表生成器

如果要生成 [1x1, 2x2, 3x3, ..., 10x10] 怎么做榜晦?方法一是循環(huán):

用Python 的一些用法與 JS 進(jìn)行類比冠蒋,看有什么相似?

但是循環(huán)太繁瑣乾胶,而列表生成式則可以用一行語句代替循環(huán)生成上面的 list:

用Python 的一些用法與 JS 進(jìn)行類比抖剿,看有什么相似?

列表生成式的 for 循環(huán)后面還可以加上 if 判斷(類似于 JS 中的 filter() 函數(shù))识窿,示例如下:

用Python 的一些用法與 JS 進(jìn)行類比斩郎,看有什么相似?

for 循環(huán)可以嵌套喻频,因此缩宜,在列表生成式中,也可以用多層 for 循環(huán)來生成列表甥温。

用Python 的一些用法與 JS 進(jìn)行類比锻煌,看有什么相似?

Python 函數(shù)

默認(rèn)參數(shù)

JS 中 ES6 的 默認(rèn)參數(shù)正是借鑒于 Python姻蚓,用法如下:

用Python 的一些用法與 JS 進(jìn)行類比宋梧,看有什么相似?

可變參數(shù)

類似于 JS 函數(shù)中自動(dòng)識(shí)別傳入?yún)?shù)的個(gè)數(shù)狰挡,Python 也提供了定義可變參數(shù)捂龄,即在可變參數(shù)的名字前面帶上個(gè) * 號(hào)。

用Python 的一些用法與 JS 進(jìn)行類比加叁,看有什么相似?

Python 解釋器會(huì)把傳入的一組參數(shù)組裝成一個(gè) tuple 傳遞給可變參數(shù),因此兰英,在函數(shù)內(nèi)部寞射,直接把變量 args 看成一個(gè) tuple 就好了。

常用高階函數(shù)

Python 中常用的函數(shù) (map豫柬、reduce愈污、filter) 的作用和 JS 中一致,只是用法稍微不同轮傍。

map 函數(shù): 接收一個(gè)函數(shù) f 和一個(gè) list暂雹,并通過把函數(shù) f 依次作用在 list 的每個(gè)元素上,得到一個(gè)新的 list 并返回创夜。

用Python 的一些用法與 JS 進(jìn)行類比杭跪,看有什么相似?

reduce 函數(shù): 接收一個(gè)函數(shù) f 和一個(gè) list(可以接受第三個(gè)值作為初始值)驰吓,reduce() 對(duì) list 的每個(gè)元素反復(fù)調(diào)用函數(shù) f涧尿,并返回最終結(jié)果值。

用Python 的一些用法與 JS 進(jìn)行類比檬贰,看有什么相似姑廉?

filter 函數(shù): 接收一個(gè)函數(shù) f 和一個(gè)list,這個(gè)函數(shù) f 的作用是對(duì)每個(gè)元素進(jìn)行判斷翁涤,返回 True或 False桥言,filter() 根據(jù)判斷結(jié)果自動(dòng)過濾掉不符合條件的元素萌踱,返回由符合條件元素組成的新 list。

用Python 的一些用法與 JS 進(jìn)行類比号阿,看有什么相似并鸵?

匿名函數(shù)

和 JS 的匿名函數(shù)不同的地方是,Python 的匿名函數(shù)中只能有一個(gè)表達(dá)式扔涧,且不能寫 return园担。拿 map() 函數(shù)為例:

map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]) # [1, 4, 9, 16, 25, 36, 49, 64, 81]

關(guān)鍵詞 lambda 表示匿名函數(shù),冒號(hào)前面的 x 表示函數(shù)參數(shù)枯夜,可以看出匿名函數(shù) lambda x: x* x實(shí)際上就是:

def f(x):
 return x * x

閉包

之前寫過一些關(guān)于 JS 閉包的文章弯汰,比如 深入淺出JavaScript之閉包(Closure)、以及 讀書筆記-你不知道的 JavaScript (上)湖雹,Python 中閉包的定義和 JS 中的是一致的即:內(nèi)層函數(shù)引用了外層函數(shù)的變量咏闪,然后返回內(nèi)層函數(shù)。下面來看下 Py 中閉包之 for 循環(huán)經(jīng)典問題:

用Python 的一些用法與 JS 進(jìn)行類比劝枣,看有什么相似汤踏?

老問題了,f1(), f2(), f3() 結(jié)果不應(yīng)該是 1, 4, 9 嗎舔腾,實(shí)際結(jié)果為什么都是 9 呢溪胶?

原因就是當(dāng) count() 函數(shù)返回了 3 個(gè)函數(shù)時(shí),這 3 個(gè)函數(shù)所引用的變量 i 的值已經(jīng)變成了 3稳诚。由于 f1哗脖、f2、f3 并沒有被調(diào)用扳还,所以才避,此時(shí)他們并未計(jì)算 i*i,當(dāng) f1 被調(diào)用時(shí)氨距,i 已經(jīng)變?yōu)?3 了桑逝。

要正確使用閉包,就要確保引用的局部變量在函數(shù)返回后不能變俏让。代碼修改如下:

**方法一: **可以理解為創(chuàng)建了一個(gè)封閉的作用域楞遏,i 的 值傳給 j 之后,就和 i 沒任何關(guān)系了首昔。每次循環(huán)形成的閉包都存進(jìn)了內(nèi)存中寡喝。

用Python 的一些用法與 JS 進(jìn)行類比,看有什么相似勒奇?

方法二:思路比較巧妙预鬓,用到了默認(rèn)參數(shù) j 在函數(shù)定義時(shí)可以獲取到 i 的值,雖然沒有用到閉包赊颠,但是和方法一有異曲同工之處格二。

用Python 的一些用法與 JS 進(jìn)行類比劈彪,看有什么相似?

decorator 裝飾器

ES6 的語法中的 decorator 正是借鑒了 Python 的 decorator蟋定。decorator 本質(zhì)上就是 一個(gè)高階函數(shù)粉臊,它接收一個(gè)函數(shù)作為參數(shù)草添,然后返回一個(gè)新函數(shù)驶兜。

那裝飾器的作用在哪呢?先上一段日常項(xiàng)目中用 ts 寫的網(wǎng)關(guān)代碼:

用Python 的一些用法與 JS 進(jìn)行類比远寸,看有什么相似抄淑?

可以看出使用裝飾器可以極大地簡(jiǎn)化代碼,避免每個(gè)函數(shù)(比如日志驰后、路由肆资、性能檢測(cè))編寫重復(fù)性代碼。

回到 Python 上灶芝,Python 提供的 @ 語法來使用 decorator郑原, @ 等價(jià)于 f = decorate(f)。下面來看看 @log() 在 Python 中的實(shí)現(xiàn):

用Python 的一些用法與 JS 進(jìn)行類比夜涕,看有什么相似犯犁?

class

面向?qū)ο缶幊?/p>

面向?qū)ο缶幊淌且环N程序設(shè)計(jì)范式,基本思想是:用類定義抽象類型女器,然后根據(jù)類的定義創(chuàng)建出實(shí)例酸役。在掌握其它語言的基礎(chǔ)上,還是比較容易理解這塊知識(shí)點(diǎn)的驾胆,比如從下面兩種寫法可以看出不同語言的語言特性間竟然有如此多的共性涣澡。

es6: (附:本文的主題是 python,所以只是初略展示下 js 中類的定義以及實(shí)例的創(chuàng)建丧诺,為了說明寫法的相似性)

用Python 的一些用法與 JS 進(jìn)行類比入桂,看有什么相似?

Python: (核心要點(diǎn)寫在注釋中)

用Python 的一些用法與 JS 進(jìn)行類比驳阎,看有什么相似抗愁?

繼承

child 屬于 Student 類,Student 類屬于 People 類搞隐,這就引出了繼承: 即獲得了父類的方法屬性后又能添加自己的方法屬性驹愚。

用Python 的一些用法與 JS 進(jìn)行類比,看有什么相似劣纲?

可以看到子類在父類的基礎(chǔ)上又增加了 grade 屬性逢捺。我們可以再來看看 s 的類型。

用Python 的一些用法與 JS 進(jìn)行類比癞季,看有什么相似劫瞳?

可以看出倘潜,Python 中在一條繼承鏈上,一個(gè)實(shí)例可以看成它本身的類型志于,也可以看成它父類的類型涮因。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市伺绽,隨后出現(xiàn)的幾起案子养泡,更是在濱河造成了極大的恐慌,老刑警劉巖奈应,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件澜掩,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡杖挣,警方通過查閱死者的電腦和手機(jī)肩榕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惩妇,“玉大人株汉,你說我怎么就攤上這事「柩辏” “怎么了乔妈?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)挺份。 經(jīng)常有香客問我褒翰,道長(zhǎng),這世上最難降的妖魔是什么匀泊? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任优训,我火速辦了婚禮,結(jié)果婚禮上各聘,老公的妹妹穿的比我還像新娘揣非。我一直安慰自己,他們只是感情好躲因,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布早敬。 她就那樣靜靜地躺著,像睡著了一般大脉。 火紅的嫁衣襯著肌膚如雪搞监。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天镰矿,我揣著相機(jī)與錄音琐驴,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛绝淡,可吹牛的內(nèi)容都是我干的宙刘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼牢酵,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼悬包!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起馍乙,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤布近,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后潘拨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吊输,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饶号,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年铁追,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茫船。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡琅束,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出算谈,到底是詐尸還是另有隱情涩禀,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布然眼,位于F島的核電站艾船,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏高每。R本人自食惡果不足惜屿岂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鲸匿。 院中可真熱鬧爷怀,春花似錦、人聲如沸带欢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乔煞。三九已至吁朦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間渡贾,已是汗流浹背逗宜。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人锦溪。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓不脯,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親刻诊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子防楷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容