從前端開發者角度學習Python(持續更新)

不得不承認當前Python的火熱超過目前任何一門語言,不管從爬蟲、人工智能、大數據或者圖像學習還是文檔處理領域都有Python的一席之地。本系列將會從一個前端開發者的角度記錄學習Python的思路。

注:本文行文思路不會按照傳統的教程來寫,而會以從筆者認爲的前端開發者學習Python的對比角度來着文。官方文檔已有的資料本文不做過多贅述,這裏只是提供一個前端開發者學習Python的思路,方便更多像我一樣的前端開發者快速瞭解並學習Python這門有趣的語言。


一、數據類型

聲明變量

和Javascript不論何時何地可以一個var解決所有這種數據類型類似,Python也是一門動態強類型語言,聲明變量的時候無需指定數據類型,並且可以在使用過程中隨意更改。不同於Javascript,Python中的聲明新變量的時候不需要使用varletconst之類的關鍵字,直接賦值即可,瞭解PHP語言的會覺得這樣的模式很熟悉。

name = '法外狂徒張三'
age = 18
age = '壽終正寢'
hobby = ['stolen', 'murder', 'ghs']
# 這裏同時給身高體重賦值,這個操作類似Javascript中的結構賦值[height,weight] = [180,'70kg']
height, weight = 180, '70kg' 
# 這裏不同於注意布爾值必須用大寫開頭
isABoy = False

需要注意的是,布爾值,Python中必須使用大寫字母開頭賦值

序列 = 數組 ?

Python中沒有數組的說法,與之概念想類似的一種數據類型叫做序列(有時候也叫成列表),這裏經常需要用到一個list()的方法,可以把這個方法理解成Array.from()

字典 = 對象 ?

Python中和對象這種數據類型很像的結構叫做字典,這裏也和Javascript中的對象一樣也是key-value模式,可以存儲不同的數據類型。但是讀取單個值時只可以用a[x]的方式不支持a.x的方式,除此之外,有一個細節,在Javascript中對象的key是字符串的時候可以不用添加引號,但是Python必須用引號。


aaa = 123
aa = 123
a = {
    'a': 1,
    'b': lambda x: x + 1,
    'c': '123',
    'd': aaa,
    'e': [1, 2, 3, 4],
    333: 12333,
    aa: 0

}
for key, value in a.items():	# items()方法可以返回字典中的(key,value)的元組集合
    print(key, value)
    
>a 1
>b <function <lambda> at 0x7fb5556c0160>
>c 123
>d 123
>e [1, 2, 3, 4]
>333 12333
>123 0

print(a['b'](999))
>1000

筆者實測字典的value值的數據類型可以不一樣,key的值也可以使用變量。

元組

集合

Python的和Javascript一樣都有集合類型,可以使用花括號或 set()函數來創建集合。注意:要創建一個空集合你只能用 set() 而不能用 {},因爲後者是創建一個空字典

a = set('abracadabra')
b = set('alacazam')
print(a)                                 # 將
>{'a', 'r', 'b', 'c', 'd'}
print(a - b)                             # 取a中b沒有的值
>{'r', 'd', 'b'}
print(a | b)                             # a、b的並集
>{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
print(a & b)                             # a、b的交集
>{'a', 'c'}
print(a ^ b)                             # 只有a有或者只有b有,可以理解成(a - b)| (b - a)
>{'r', 'd', 'b', 'm', 'z', 'l'}

筆者測試發現,set()也可以將序列(測試發現只能一維序列)、字符串轉爲集合。

a = set([1, 1, '3', 3, '1', lambda x: x + 1, ])
b = set({'a', 'b', 'c', 'c', 1})
c = set('aabcd')
d = set([(1, 2), (1, 2), (2, 3)])
e = set({1: 'a', 2: 'b', 3: 'c',})

print(a)
>{1, 3, '1', <function <lambda> at 0x7fe099ec1160>, '3'}
print(b)
>{'b', 'c', 1, 'a'}
print(c)
>{'d', 'b', 'c', 'a'}
print(d)
>{(2, 3), (1, 2)}
print(e)
>{1, 2, 3}

二、控制結構

縮進即是 {}

Python的代碼風格特色就是不使用{}來控制結構域,完全是使用代碼縮進來表明結構作用範圍。

# 循環體
for item in [1,2,3,]:
	print(item)
# if else 結構
if x > 0:
	print('進到if分支')
	print('這裏還是')
elif x < 0:
	print("注意我不是else if,而是elif")
	if x < -5:
		print('結構嵌套時繼續縮進')
else:
	print("進到else")
print("觀察縮進,這裏已經跳出if結構了")

觀察可以發現,不論是循環體還是if else結構其對應的循環條件或者進入條件都沒有使用(),而是直接在關鍵字空一格直接寫表達式,並在表達式最後添加:,然後再寫內部表達式,:後面可以換行不影響結構

循環體中的 else

Python的for循環體最後可以單獨添加一個eles,它會在循環耗盡了可迭代對象 (使用 for) 或循環條件變爲假值 (使用 while) 時被執行,但不會在循環被break 語句終止時被執行,這裏引用官方文檔的一個查找十以內的質數的例子來說明:

在Python中range()可以返回一個類似於數組(不是數組,後文會在做詳細說明)的結構,例如range(1,5) 可以得到[1,2,3,4]

for n in range(2, 10):
     for x in range(2, n):
         if n % x == 0:
             print(n, '=', x, '*', n//x) # 'n//x'表示js中的Math.floor(n/x)
             break
     else:	# 注意這裏的eles縮進對應的for循環不是if。
         print(n, '是質數')
         
> 2 是質數
> 3 是質數
> 4 = 2 * 2
> 5 是質數
> 6 = 2 * 3
> 7 是質數
> 8 = 2 * 4
> 9 = 3 * 3

邏輯關係

Javascript中 ||&&!運算在Python中必須使用相應的orandnot,可以通過下面的例子來理解:

a, b = True, False
if a and b :
	print("都是true")
elif a or b  :
	print("至少一個true")
else :
	a = not a
	b = not b
	print("全是false不過都改爲true了")

三、函數特性

函數聲明

def

匿名函數

我們知道Javascript裏支持匿名函數,在Pyhone中也有這種結構,在Python中我們需要使用到lambda關鍵字:

lambda x, y : x + y

lambda x, y :\ # 注意這裏有一個‘\’符號
	x + y

lambda後接入參列表,然後使用:接表達式,表達式不需要也不支持return,函數會自動返回獲得的結果,這麼看着是不是特別Javascript裏頭的剪頭函數,上面的代碼在Javascript中相當於

(x, y) => x + y

(x, y) => {
	return x + y
}

但其實Python裏的匿名函數特別坑,函數體只能寫一行(雖然有一些“野路子”可以實現,但有那功夫爲啥不直接def一個新函數呢?所以這裏不細談)。到目前爲止也還有很多文章在討論抵制使用lambda函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章