作者 | 梁唐
大家好,我是梁唐。
很多读者私信我说公众号迁移了之后文章的分类没有了,看起来不方便。梁唐也注意到了这个问题,最近正在对之前的文章做一些整理和勘误。
目前打算先从Python这个专题开始,毕竟我不是专业做Python开发的,所以文章主要是新手入门向。帮助大家打下一个比较坚实的基础,之后有能力往各个方向发展。
为什么要学Python
想学Python的人很多,现在Python讲课的广告也非常多,朋友圈里都有不少。这些广告用的噱头有很多,常见的有这么几种:
- Python是万金油语言,什么都能做,不像C 现在基本没工作岗位,Java只能做后端。学了Python就可以做人工智能,做爬虫,也可以做后端,还可以做图像、文本等等。
- Python语法简单,小学生就能学会,不像Java、C 这些语法很难,入门不太容易。Python几个月就可以入门。
- 人工智能黑科技,眼馋不?得学Python才能玩。
- 贩卖焦虑,现在不仅小学生都会Python了,你身边的同事也都会了,只有你还不会,还不赶紧学!
很多人都是出于这几点就被忽悠了买了课程或者是买了书准备来入门了,但是没有从自身实际的角度想过,究竟为什么要学Python?学习了之后能够达到什么目的,对自己未来的发展有什么帮助。
我个人是非常建议大家都来学一下Python这门语言的,无论你是什么方向,从事什么领域。并不用很深入,只需要有基本的概念,会基础的语法,做到会用就行。
原因没有那么复杂,主要只有一点就是Python非常方便,甚至是我见过的最方便的语言之一。可以很敏捷地实现你的idea或者是写一个脚本或工具。只要有Python环境,没有IDE也没关系,vim、记事本这些文本编辑器就可以写代码。可以非常方便地读取文件、发起请求、处理图片、调用系统函数等众多操作。
如果是其他语言的话,需要建工程、装包配环境,再编译运行、调试,整个流程的效率要低不少。而且读取文件、发送请求、处理数据等这一系列操作的确不如Python方便,代码也更加复杂。
所以哪怕不是从事算法的,学一下Python也是百利而无一害。
前期准备
Python的安装非常简单,这块网上的教程很多,我就不赘述了,大家自行百度即可。安装的时候要注意一下,Python2官方已经停止维护和更新了,一定要安装Python3,最好选择Python3.6的版本。
怎么样确定Python装好了呢?很简单,在命令行里输入Python,如果能够进入Python的运行程序,就说明装好了。
这里的第一行会输出Python的版本,这里注意一下版本。有的时候电脑当中会有多个Python的版本,Python2和Python3并存,这个时候配置一下环境变量,将Python命令映射到Python3即可。
Python装好了之后,还需要一个包管理工具pip。通过pip可以很方便地下载已经安装各种Python第三方库,实现各种我们想要的功能。pip的安装也有很多种方法,大家自行百度即可。装好了之后,输入pip -V,如果看到pip的版本就算是装好了。
如果想从事机器学习、人工智能等领域研究的,也可以装下anaconda。它同样也是一个包管理工具,只不过比pip更加重量级一些,也有UI界面,操作更加简易。这个根据大家需要自行选择,可装可不装。
最后来说说IDE,基本上只有两个选择,一个是jet-brains家的Pycharm,另外一个是微软家的vscode。少数人喜欢用其他的文本编辑器,像是什么atom、sublime之类的,这个就看大家的喜好了。我个人的建议是如果要开发大型工程,那么选择Pycharm,如果只是写写脚本和一些简单的工具,那么vscode就足够了。
当然如果你不觉得难受的话,也可以在命令行的黑框框里面写。只是缩进什么的很麻烦,一般人不这么干。
聊聊原理
Python环境配好了之后,先别着急编码,先来了解一下关于Python的一些基础原理,可以在之后的开发过程当中避免很多问题。
解释型语言
很多教材当中都会说Python是一门解释型的语言,我们先不说这个结论对不对的问题,先来解决一个问题,什么是解释型的语言呢?
这个问题说来话就长了,简单来说,我们现在主流的编程语言都是高级语言。所谓高级语言也就是说计算机不能直接识别我们编写的代码,需要中间有一个衔接。反之像是汇编语言就不是高级语言,因为计算机的CPU可以直接执行汇编语言的代码。
而中间衔接的方式一般有两种,第一种是编译,也就是把代码翻译成计算机可以直接执行的机器语言。比如C、C 。第二种是解释,也就是有一个解释器逐行对代码进行解释,然后再进行运行。
那Python属于哪种呢?其实都不是,Python和Java这两门语言有些特殊,是编译 解释型的语言。会先编译成虚拟机能够识别的字节码,然后再交由虚拟机解释执行。我们都知道Java代码编译之后会生成.class文件,Python运行之后其实同样会生成pyc文件。只不过这些pyc文件不太显眼,很多人没有发现。
但Python和Java不同的是,Java是全局编译,而Python是按照顺序的。所以在Python当中这样的写法是错误的:
代码语言:javascript复制test()
def test():
print('yyyyy')
因为解释器执行到test这个函数的时候还没有读到它的定义,找不到这个函数,自然就会报错。
弱类型语言
其次要说的是Python是一个弱类型语言,并不是说Python语言里没有类型,而是说类型是隐藏的,一般情况下不显示。而与之相对的是强类型语言。
弱类型语言最大的好处就是编写方便,函数调用灵活。
先来说说编写灵活,因为类型隐藏,使得变量完全脱离了类型的束缚,想怎么赋值就怎么赋值。我举个例子,大家可以看下下面这段代码:
代码语言:javascript复制a = 3
b = "hello"
a = b
print(a)
我们直接a = 3,b="hello"就申明了a和b这两个变量,Python会自动根据赋值的结果标记a和b的类型。并且呢,虽然a是int型,b是string类型,但把b赋值给a也是完全可以的。如果在其他语言,这样的操作是绝对不行的,只有类型相同的变量才可以互相赋值。
不但如此,我们还可以用变量接收任何值,比如函数,甚至是类。比如下面这段代码:
代码语言:javascript复制def test():
print('hello')
a = test
a()
class Test:
def __init__(self):
self.text = "hello"
a = Test
print(a().text)
我们先是让a接收了test这个函数,接着又让它接收了一个类。同样没有任何问题,可以直接运行。变量完全脱离了类型的束缚之后带来了巨大的灵活度,可以任意传递、接收。
接着再来说说函数调用,因为没有了类型的限制,使得我们在函数调用的时候可以任意传递。比如我们有这么一个函数:
代码语言:javascript复制def test(a):
print(a)
它接收一个参数a,由于这里的a没有限制,外界可以传递任何内容进来。
代码语言:javascript复制test(3)
test('str')
test(Test())
test([3, 4, 5])
我们可以传递一个数字一个字符串一个类实例,也可以传入一个数字,一个函数……在学过函数参数相关知识之后,甚至可以做到传递任意数量的任意参数。
这样的灵活性也是前所未有的,大大方便了开发者。
但凡是有利有弊,这样巨大的灵活性除了简化了编码以及解除了限制之外,也带来了许多问题。比如说参数校验变得麻烦了,因为我们不知道调用方究竟会传递什么样的值给我,可能类型根本就不是我想要的。所以还需要额外做参数的校验,并且debug也变得复杂了,由于弱类型,一个变量刚才还是A类型,转眼间一赋值就成了B类型了,想要追踪排查也就非常不便。
上面说的只是Python特性以及原理的一部分,这些内容看起来无关紧要,不知道也不影响编码。但是了解它们可以帮助我们规避、锁定许多问题,也是一个工程师素养和能力的体现。所以大家千万不要忽视对于原理的理解和学习,不能只停留在用法上。
好了,关于Python的背景只是先说到这里,从下期开始给大家分享Python具体的语法和用法。
最后,祝大家周末愉快。