不得不承認當前Python的火熱超過目前任何一門語言,不管從爬蟲、人工智能、大數據或者圖像學習還是文檔處理領域都有Python的一席之地。本系列將會從一個前端開發者的角度記錄學習Python的思路。
注:本文行文思路不會按照傳統的教程來寫,而會以從筆者認爲的前端開發者學習Python的對比角度來着文。官方文檔已有的資料本文不做過多贅述,這裏只是提供一個前端開發者學習Python的思路,方便更多像我一樣的前端開發者快速瞭解並學習Python這門有趣的語言。
一、數據類型
聲明變量
和Javascript不論何時何地可以一個var
解決所有這種數據類型類似,Python也是一門動態強類型語言,聲明變量的時候無需指定數據類型,並且可以在使用過程中隨意更改。不同於Javascript,Python中的聲明新變量的時候不需要使用var
、let
、const
之類的關鍵字,直接賦值即可,瞭解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中必須使用相應的or
、and
、not
,可以通過下面的例子來理解:
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
函數。