不得不承认当前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
函数。