难难难,道德玄,不对知音不可谈,对了知音谈几句,不对知音枉费舌尖

  还是老规矩先是这么几句定场诗。最近呢其实也不是特别忙,但是还是会一写起代码就闷头很久,再加上最近天气真的是好烦啊。不过现在下班了,吃完饭我通常也就赶紧往床上一窝。不过也算是有了点闲工夫,那就抽空把基础篇写一点吧。

  前文书我们讲了破冰篇,怎么个破冰篇呢。大概讲了一下怎么安装Python,怎么用命令行,怎么用pip包管理工具,以及怎么创建和使用虚拟环境。但是呢你认真一看,破冰篇那一片好几千字又有那么多插图在一起图文并茂的,其实根本也没有说什么。都是一些废话。尤其有些废话写得,总让人觉得我这个人指定是有点毛病。但是我不骄傲!毕竟咱闲话比正文有意思啊,网上的教程虽然都唠干的,但是他们的教程多无聊啊。都是一些死知识,然后把代码复制一遍,运行一下。这有什么意思嘛。过几天就忘了。你看看我,废话这么多,你就着急想看正文里面到底写了些什么玩意儿,你越急着想看,我就越多废话。等你看完正文之后,过了几天,诶,你就只记得我这些废话了。

  行了行了,天儿可不早了,咱干点正事儿吧。闲言少叙,咱书归正传。这废话就不少了。

为啥要学Python

  是不是没想到我会问这个问题?没错,接下来我有要有一顿废话啦,红红火火恍恍惚惚。好了好了,不瞎闹了。其实我也不记得是什么时候开始Python突然就火起来了,那时候大街小巷都在说什么大数据,什么云计算,又是人工智能,曾经Python在语言热度排行榜上一度把Java都给干趴下了。

  但是呢我作为一个小5年工作经验的Python开发还是劝大家不要盲目跟风,不要盲目地把Python这门语言给神话了。当然了Python是有很多优点,但是任何事物都是有两面性的,不代表Python就一点缺点都没有。不过虽然优缺点,也掩盖不了Python在某些方面确实好用的事实。

  但是呢,也不要被网上的乱七八糟的营销号骗了哦,经常会有这种智障广告。

  “唉,一天天的加班到凌晨什么时候是个头啊,诶?你为什么每天到下班时间就走了啊?”

  “因为我会Python啊。”

  “Python吗?我也要学Python!”

  这种广告每次看我都觉得,难(shén)以(me)欣(wán)赏(yì er)……但是呢如果真的学会了Python在日常工作或生活中确实是会有一些帮助的,比如处理大量的Excel这种工作就可以交给Python来做。再比如从网上批量下载文件,鼠标一个一个去点太烦人了,这种就完全可以用Python做一个爬虫小工具来做。

IDE篇

  既然前文也说了学Python是有好处的,那么接下来我们就开始从入门开始吧。不过呢,老话说得好:工欲善其事,必先利其器。在我们安装好了Python并且创建了虚拟环境之后,接下来我们就需要写代码了。但是我们用什么写呢。你看我们有Word可以来写文档,Excel可以用来做表格,当然写Python也是有专属的软件的。这种软件我们都称之为IDE,中文的意思是集成开发环境。至于什么是集成开发环境?不重要,不需要知道,甚至不需要知道有这么个词的存在,只需要记得IDE是拿来写代码的,而IDE的种类很多,而拿来写Python代码的软件只是IDE的其中一种就够了。

  通常来说我们写Python代码都喜欢用一个叫做PyCharm的软件。那么现在我们就要先下载安装这个软件,先到PyCharm官网来下载软件安装包。

mark

  进入到PyCharm官网之后,这个下载的按钮也是非常醒目了,直接点击下载跳转到下载页面,我们就可以看见右面有两个版本,一个Professional,另一个是Community。这两个呢,其实在使用上没有是没区别,只是Professional里面集成了一些好用的不过可能一年也用不上一次的插件和功能,但是就凭这个Professional是要收费的,一年好几千呢吧好像。虽然说往上有很多可以盗版和破解的方法,但是我们依然选择Community,因为既免费还和Professional差不多好用。而且我们要支持正版,怎么可以用盗版呢。

mark

  下载好了之后就可以双击打开准备安装了,安装就没有什么可说的了,反正就改一下安装路径,然后其他的都是我同意,下一步,其他的什么都不用管,就等安装完成就可以了,也就一分钟左右。

mark

  安装完成之后,我们直接打开这个软件。你瞧,又是这种虚伪的画面,直接勾选,然后Continue

mark

  我们点完Continue之后就可以看见这个花里胡哨的启动界面了。这个启动界面设计的是真的丑。跟旧版本的启动版本相比太花里胡哨了。

mark

  等启动界面出现之后等几秒钟就可以进入主界面了。

mark

  既然我们要写代码就要点击New Project按钮来新建一个项目,第一呢我们可以在1的那个框选中更改我们项目存放在哪里,第二呢,我们要记得选择2那个框选中的选项。但是我们可以看见左下角告诉我们没有找到Python解释器环境。什么意思呢,就是IDE没有找到我们的Python环境在哪里。好比你告诉朋友要在家开个party,但是朋友告诉你他不知道你住在哪。不过不慌,我们手动告诉IDE我们的Python环境在哪里。

mark

  首先我们先点击最右边的这个省略号按钮。

mark

  不得不说哦,这一块的交互真的做的好烦人啊,你看我点击了省略号按钮之后又弹出这么个窗口,然后我们又要再点击这个省略号按钮。

mark

  现在还记得我们之前创建的那个虚拟环境吗?点击了省略号按钮之后就可以在这个界面里面选择我们之前建的虚拟环境了,我之前把虚拟环境创建在了D盘,所以我就在这个界面里面选择了D:\pyenv\Scripts\python.exe这个路径,然后点击OK按钮就可以了。

mark

  现在我们再回到这里,就会发现左下角那个提示没有了,但是你看那个我说没必要的地方,其实是可以选择上也可以不选的。但是通常我们选择了之后最后都会删除掉重新新建文件,所以就没有必要勾选了。最后点击create按钮就可以完成新项目的创建啦。

mark

  当项目创建完之后我们会进入工作界面,工作界面左侧是文件区,当我们进入工作界面之后需要等待一会儿,你看我框选的地方,那里是一个进度条,得等那进度条完成之后自动消失我们才开始进行下一步操作。因为那个进度条实在初始化工作环境。就好比做好了菜,先不吃,一定要先拍照发朋友圈一样,发完了朋友圈,然后洗手吃饭。

mark

  其实呀,到了这里IDE篇算是已经讲完了已经。但是呢我们看见现在的项目还都是空空的。那就顺便提一句我们怎么创建我们的代码文件吧。像下图一样,在项目文件夹new_pro上面右键选择New然后再选择Python File就OK啦。

mark

  点击之后就会弹出一个小窗口让你输入文件名称,比如我们输入hello然后回车,这样一个代码文件就创建好了,接下来就可以写代码了。而且记住,Python 的代码文件最后的扩展名都是 .py,所以我们如果看见一个文件是文件名.py这样的文件的话,这就说明这是个写了 Python 代码的文件我们可以拿来执行。

mark

  至于怎么执行 Python 程序呢?有两种方法,一种是进到命令行里,然后执行 cd/d 要执行文件的文件夹路径 命令,进入要执行的文件所在目录(按照开发的规范,我们通常把文件夹称之为目录,以后文中都改称目录)然后执行命令 python 文件名.py。这个方法其实我们并不常用,毕竟我们有 IDE 呢嘛,在 IDE 里面呢,也有多种方法可以执行程序,比如下图这种有 if __name__ == '__main__': 这一行的,直接点击左边这个小三角形然后选择第一行的 run 就可以了。

  再比如说像下图,直接右键然后选择 run 也可以完成运行,你再看下图 run 那一行,标明了运行程序的快捷键,所以说直接按快捷键也可以完成程序的运行。

Hello World

  标题上我说了且从Hello World说起。但是前面叨叨了这么半天都在说IDE的事儿,不过不重要,反正都是要学的是不是。毕竟做教程就要从0开始。然后帮初学者完成从01的转变。Emmmm……我怎么觉得有点怪怪的?不重要,这只不过是一个主观能动性的话题……拉倒拉倒,越描越黑了感觉。我们是说Python

  好了至于说Hello World,为什么要说这玩意儿呢。在IT行业,我们的传统就是不管什么编程语言,第一个程序都是输出Hello world。最初起源要追溯到1972年,贝尔实验室著名研究员Brian Kernighan在撰写《Tutorial Introduction to the Language B》的时候使用了Hello World。之后,在1978年,他在他和Dennis Ritchie合作撰写的C语言圣经《The C Programming Language》中,延用了再次用Hello world作为开篇第一个程序。所以后来这个传统就被大家继承下来了。所以后来业内有句话,不管什么编程语言,Hello World一下就算会了。

  既然这样的话,那么我们当然还是要从Hello World开始说起的。其实呢Python输出Hello world也是Python爆火的其中一个原因,因为真的太简单了。只要一行代码就可以完成。

print("Hello World")

mark

  是不是很简单?完成这一步,恭喜你,你已经学会Python啦,红红火火恍恍惚惚。当然了我不会就只简单说这个。我们都知道学习刚开始要把书读厚,然后再把书读薄。虽然说这一行代码就可以完成Hello World,但是这不是目的。我们来吧代码扩展一下:

if __name__ == "__main__":
    print("Hello World")

mark

  这回是两行代码其实也很简单。而且执行出来的结果也是我们所预想的那样,但是为什么要多这一行呢?这一行if __name__ == "__main__":叫做程序入口。这里呢标志着从这里开始执行程序。就好比有一座山,这座山呢我们过去了首先肯定环顾四周,这座山边上是什么呀,山多高啊,哪里有方便爬山的山路啊。然后我们看见了那边有个大门,边上立着牌子,从这个门进去有山路方便爬山,其他地方没有山路,爬山太危险啦。那我们看见了这个牌子肯定就直接往大门那边走了。这一行if __name__ == "__main__":就是这个功能。

  但是你再看if __name__ == "__main__":这一行结束了为什么下面这一行代码要有缩进啊?这就是Python语法的一个规定。Python需要根据缩进来划分作用域。什么叫作用域呢,就好比是划地盘的样子。比如这有一个小区,这个小区就相当于是一个作用域,这个小区的居民就不需要向隔壁小区交物业费。

  而且Python和其他编程语言一样,都是有一种叫做链式作用域的东西,什么是链式作用域呢。比如说还是刚才的小区,你住在其中一栋楼,那么就会出现这样一个链式属从关系,你的房子属于这栋楼,这栋楼属于这个小区。你在填快递地址的时候就要写这个小区的几号楼的几号房。这种层层递进的就是链式作用域。

  Python中呢以4个空格来表示一个缩进,每一个缩进呢就代表了一层作用域。比如你家的这个完整地址,在Python中就可以这么表示:

XX省:
    XX市:
        XX区:
            XX街道:
                XX小区:
                    X号楼:
                        X单元:
                            XXX室

  像上面这种就是链式作用域,当然作用域的概念后面还会再提到,这里先只做个初步的了解。或许到这里你觉得Hello World是不是讲完了,该讲点其他的东西了?其实不然。我们把代码再次扩展一下:

def main(arg):
    print(arg)


if __name__ == "__main__":
    a = "Hello World"
    main(a)

  仿佛是有点那个大病,或许初学者看到这一段会有些不明白,这都是什么呀。其实呢上面这一段代码已经进入了大部分 Python 开发的范畴了,其实大家学习 Python 如果并不是为了成为一个专职的 Python 开发的话,到了这个层面已经完全足够了,上面这一段代码包含了函数声明函数调用变量声明变量使用这几个概念。平常只是拿 Python 来作一个普通小工具的话到达这个层面使用函数式编程已经完全够用了。

  但是上面这一段到底是什么意思呢?首先我们看见了 if __name__ == "__name__": 这一行前面说过了这是程序入口,运行这个程序的大门。Python 的执行其实是很简单的,第一步会先扫描一遍整个文件,把程序初始化一遍,然后寻找程序入口,然后从入口处执行程序。

  或许我上面讲得大家觉得有点抽象,没关系,咱们承应承应。当我要执行 Python 的程序的时候,我们当然不是自己来执行,我是告诉计算机,我要执行什么什么程序了。就好比你告诉你对象:“我饿了我要吃饭!” 你对象说:“行,我去给你做饭。” 那么 ta 首先要去把你要吃的所有食材准备好,洗好,该备用的备用,该初加工的初加工。这一步呢就差不多就是所谓的初始化。然后呢 ta 做饭得找到厨房在哪啊,不能说好吧我来做饭然后在你床边上嘁哩喀喳架个锅啊,所以 ta 要找到并进入厨房,这一步就是所谓的找到程序程序入口。进到厨房里了,食材也准备好了,那就是开始点火炒菜给你做饭了啊。这一步呢就是所谓的从入口处执行程序。当然了你有可能跟我一样没有对象,没有就没有呗,那还能不做饭了不成?我自己做的饭一样很香,每当闻到我自己做的菜都被香得流出两行独立的泪水。

  既然懂了 Python 执行程序的流程机制那就好办了。上面那段代码执行的时候就先进行初始化,在第一行我们看见用 def 这个关键字来开头,这个代表声明并定义一个函数。这段代码就表示了在初始化的过程中声明并定义了一个函数,然后找到了程序入口,然后声明了一个变量,然后调用了之前声明的那个函数。

  但是呢,我刚刚说的函数还有变量又是什么玩意儿呢?这些东西呢,咱在后面会进行详细介绍,这里先不剧透了,咱放在后面慢慢啃。

  好了,到了这一步 Hello World 该结束了吧,你还能有什么花样?诶,格局小了不是?那你看我再扩展一下:

class Hello(object):
    def __init__(self, arg):
        self.__arg = arg

    def main(self):
        print(self.__arg)


if __name__ == "__main__":
    a = "Hello World"
    obj = Hello(a)
    obj.main()

  惊不惊喜,意不意外?一行代码能搞定的事儿我就要写成十几行,诶,就是玩。现在有出来一个在前面从来没见过的东西。这个 class 又是个什么鬼呢?而且这个 class 里面为啥还有函数呢?

  诶,别着急,这个 class 呢,我们称之为类。类在 Python 中是一个非常重要的重点,也是非常重要的也非常难的难点,但是不学也行。我做 Python 开发的第一年根本就不会用类啊,但是我还不是照样专职干了一年专业 Python 开发。

  或许大家有 Python 开发朋友的都听过一句话,“万物皆对象”,又或者有 Java 开发朋友有这么一句话是,“没有对象?new 一个就是了。” 这两句是啥意思呢,因为 PythonJava 这两个编程语言都是面向对象编程的语言。所以说在 Python 中任何一个可以操作的元素都被认为是一个对象。至于什么是对象,那个跟你告白了你答应了或者那个答应了你的告白的人就是你对象!啥?没人给你告白?也没人答应你的告白?哦,我不是故意的,那我重说,什么是对象呢?诶,别人有但是你没有的那个玩意儿就叫对象!别人有,你没有,我也没有的那个玩意儿就叫对象,后面我们会详细介绍,现在就不多说了。

  但是我为什么突然出来这么一段呢,不是在讲 class 嘛,咋串到对象了呢?因为在 Python 中的面向对象编程主要就靠 class 来实现和完成的。我们可以通过实例化一个 class 来获得一个对象。诶,没错,不用告白就可以获得对象的好事,只有在编程中才能遇到。但是还有一点,这个 class 里面的函数是啥呢?

  我们看到了在这个 class 的作用域下有两个用 def 关键字开头的两个代码块,前文我们也说了这个意思是声明并定义了一个函数。但是呢,在 class 中声明并定义的函数我们不叫函数,只要是在 class 中声明并定义的函数都叫方法。就想你对象,ta 不管在外面叫什么,回到宿舍,ta 室友都喊 ta 儿子!当然这一块在介绍到类的时候会详细介绍。咱们今天的任务是从 hello world 开始把 Python 中我们常用的一些概念都有那些先过一遍,让大家知道学 Python 的基础语法大概是个什么轮廓,心里有个数。

  经过了咱们再回头看这段代码。还是按照正常的流程来,先初始化这个程序,声明并定义了一个类;寻找程序入口;声明了一个变量;用声明的变量实例化声明好的类,从而获得了一个对象;然后通过对象来调用这个类定义的方法。

  看到这是不是觉得 hello world 终于讲完了?该讲基础语法了?还是太年轻。我要是就只能知道这么一点点我还做什么教程嘛。我们还有一个 Python 中及其重要也及其常用的东西还没有讲怎么能就这么完了呢?

# hello.py 文件
class Hello(object):
    def __init__(self, arg):
        self.__arg = arg

    def main(self):
        print(self.__arg)

# ********************************************
# main.py 文件
from hello import Hello


class HelloWorld(object):
    def __init__(self,arg):
        self.__obj = Hello(arg)

    def main(self):
        self.__obj.main()


if __name__ == "__main__":
    a = "Hello World"
    obj = HelloWorld(a)
    obj.main()

  大家有发现什么没有?是不是又多了一个在前文从来没见过的操作?from hello import Hello,这个是什么意思呢?你想想我们做开发不可能所有的代码都写在同一个文件中啊,如果我们把代码写在不同的文件里面,然后我在这个文件想用另一个文件里面的代码可怎么办呢?没错,import 关键字就是用来干这个的。我们可以通过 import 关键字把其他文件中我想要用到的 class 或者函数,甚至是变量都导入到当前文件中。

  这就好比你买了好多零食,一个房间放不下。然后你这个房间放一点那个房间放一点。但是现在只有你现在呆的房间开了空调,其他房间都太热了。你不想去拿,但是你又想吃其他房间的东西。拿你就喊你对象帮你从其他房间拿东西过来。啥?你没有对象?嘿,说的好像我就有一样,没有对象你 new 一个啊。

  那我们再回头瞧一下刚才那段代码是个什么意思。首先呢我们创建了 hello.py 文件并且在 hello.py 文件里面呢声明并定义了一个 class 又叫做类。但是仅仅只是定义了类没有做其他的任何操作。其次,我们又创建了 main.py 文件,并且在 main.py 文件里把 hello.py 文件中的类导入到 main.py 文件,紧接着又声明并定义了一个新的类。当我们运行 main.py 文件的时候,首先初始化整个文件,在初始化的过程中从 hello.py 文件中导入 Hello 类,在导入之前,先初始化 hello.py 文件,在初始化 hello.py 文件的过程中定义了 Hello 类,当 hello.py 文件初始化完毕,然后将 Hello 类导入到 main.py 文件中,导入完毕之后,定义 main.py 文件中的 HelloWorld 类,至此这一整套的程序初始化算是完成了,然后寻找到程序入口并从入口处执行程序,先是声明变量,并用该变量将 HelloWorld 类实例化为对象,然后调用该对象的 main 方法。

  当然前面这一大串或许大家看着有点懵,什么玩意儿初始化过程中导入,导入前又初始化啊。通俗一点来说呢,就是你不是想吃其他房间的零食嘛,但是也不能老吃零食,比如午饭时间了,你想吃筒泡面,但是泡面不在你的房间,你又不想去拿。然后从你发现到午饭时间了准备想吃泡面的那一刻,就是初始化的开始。这个时候你喊你对象去拿泡面。你对象到了其他房间得先看这个房间有没有泡面啊,这就是所谓的在导入前对 hello.py 文件的初始化。当你对象发现诶,这里有泡面,然后拿好了泡面到你房间了。你一看,诶泡面拿来了,那你看看电水壶在不在,里面有没有水,水够不够,泡面碗吧,然后你发现这些东西都齐了,好了可以烧水然后泡面了。但是还没有开始烧水。只是检查了当前的条件够不够泡一筒泡面。到这个步骤结束,代表着这一整套程序的初始化完成了。然后你打开电水壶的开关,拿好了碗撕开泡面的包装,这一步找到了程序的入口,并从入口执行程序了。然后水烧开,面往碗里一放,倒上水,拿盖子一焖,这面就算是泡上了。这也就代表程序也执行完了。现在大概明白这一段代码代表啥了吧。行了,我知道你没对象,你不是说过了嘛。我也没有啊,但我愿意自己出房间做饭。你不愿意那就饿着呗。

  其实呢到这里 hello world 终于可以告一段落了。其实要想继续说远不止这么点。但是目前来说到这里就可以了,太深的东西我们放后面再说,后面我会专门出一篇再谈 hello world。诶,怎么样?是不是听着就解气?

小结

  经过前面的介绍,我相信大家可能也是没明白我都说了些啥,因为什么语法的东西都没看着,就看我说我 IDE 之后拿着 hello world 讲了半天,咱们到底啥时候才能正式学写代码啊?诶,着什么急嘛。你恋爱还知道先认识这个人然后再慢慢了解对方的性格呢。我这不是先带你来认识人了嘛。

  通过前面的介绍我们大概知道了 Python 包含有作用域、函数、 class 、变量、import 以及 Python 程序执行时候的大致流程。现在回想一下是不是大概的对 Python 有了些大致的轮廓?如果还是有什么不明白的就多琢磨几遍,来问我也行。下一期我们开始介绍基础语法。

Copyright statement:The articles of this site are all original if there is no special explanation, indicate the source please when you reprint.

Link of this article:https://work.lynchow.com/article/hello_world/