不得不承认当前Python的火热超过目前任何一门语言,不管从爬虫、人工智能、大数据或者图像学习还是文档处理领域都有Python的一席之地。本系列将会从一个前端开发者的角度记录学习Python的思路。

注:本文行文思路不会按照传统的教程来写,而会以从笔者认为的前端开发者学习Python的对比角度来着文。官方文档已有的资料本文不做过多赘述,这里只是提供一个前端开发者学习Python的思路,方便更多像我一样的前端开发者快速了解并学习Python这门有趣的语言。


文章目录

  • 一、数据类型
  • 声明变量
  • 序列 = 数组 ?
  • 字典 = 对象 ?
  • 元组
  • 集合
  • 二、控制结构
  • 缩进即是 `{}`
  • 循环体中的 `else`
  • 逻辑关系
  • 三、函数特性
  • 函数声明
  • 匿名函数



一、数据类型

声明变量

和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函数。