python写代码怎么知道代码意思?

可能很多同学在阅读Python源代码时会发现经常会出现if __name__ == '__main__':这样的代码,那么这样的代码起到什么作用呢?本文将为你深入解析__name__变量的含义和应用场景。

当Python解析器读源代码文件时,会做如下两件事情:

  • 设置特殊变量,如__name__;
  • 执行源代码文件中的所有代码;

现在我们将焦点放到__name__变量上来,看看在Python程序中为什么要使用__name__变量。

让我们先使用一段代码示例来探索导入和脚本的工作方式。假设这些代码位于名为foo.py的文件中。

当Python解释器读取源文件时,它首先定义一些特殊变量。在这个案例中,我们关心的是__name__变量。如果将Python脚本文件作为主程序运行,也就是通过下面的命令运行foo.py。

另一方面,假设其他模块是主程序,并且它将导入foo.py。这意味着在主程序中会有如下的语句:

Python解释器将搜索foo.py文件(以及搜索其他一些变体),在执行该模块之前,它将从import语句中将名称“ foo”分配给__name__变量,也即是使用下面的代码为__name__变量赋值。

设置__name__变量后,Python解释器通过一次执行一条语句的方式执行模块中的所有代码。您可能想要在代码示例侧面打开另一个窗口,以便您可以按照以下说明进行操作。

现在执行前面的代码,会输出如下内容:

如果foo.py脚本不是作为主程序运行,而是被另一个程序导入,则__name__变量的值是“ foo”,而不是“ __main__”,在这种情况下,将不会调用functionA和functionB函数。不过在这种情况下,仍然会输出 "after __name__ guard" ,因为这条语句不属于if语句。

根据foo.py的运行方式,可能会有两种输出结果。

(1)作为主程序运行,会输出如下结果

(2)作为模块被导入,会输出如下结果:

可能有很多同学会有这样的疑问,为什么Python要提供这个功能呢?像C#、Java这样的编程语言并没有这样的功能啊!其实这要从Python脚本的运行机理谈起。如果Python脚本作为主程序执行,这个执行方式与Java类似。不过当导入一个Python模块就不一样了。对于Java语言,导入一个包,也只是导入而已,除非显式调用包中的API,否则单单导入,是不会执行Java代码的。但Python就不一样了,如果使用import语句导入一个模块,其实是先执行被导入模块中的所有代码,然后才会执行当前模块的代码。例如,下面的代码,会先执行foo.py脚本中的代码,然后才会执行print('current

执行这段代码,会输出如下的内容:

如果一个Python脚本,同时即可以作为主程序执行,也可以作为模块被导入,这就要求在模块被导入时不执行作为主程序执行时的代码,所以如果是在主程序中执行的代码,应该使用__main__变量进行判断。

有的同学问,在脚本文件中可以有多个__name__校验代码块吗?其实通常只有一个__name__校验代码块吗,但Python解析器并不会阻止你编写多个__name__校验代码块吗。

下面再给大家2段代码,看看输出结果会是什么:

在这段代码中导入了模块本身(foo2.py),执行代码,会输出如下结果:

大家可以分析一下这段代码的执行过程。下面将if __name__ == "__main__":去掉,看看会发生什么。

执行这段代码,会引起死循环吗?其实是不会的,因为Python解析器有缓存,如果一个模块在当前模块中已经被导入了,当第二次导入时,将不会再次执行被导入模块的代码,而是直接使用缓存中的内容,所以import foo3只会导致foo3.py文件中的代码作为导入模块的方式被执行一次。所以执行这段代码,输出结果如下:

大家可以自己分析一下程序的执行过程。

各位热衷于刷抖音的同学一定在前几个月刷到过一条风靡全抖音的视频:哦泡果奶病毒。

基于好奇,我特地跨过山和大海,也穿越人山人海,最终搞到了这个程序的安装包。程序的功能其实也很简单,就是将代码打包成apk文件后,让人将其当成安装包安装在手机上,然后运行后,手机就会自动播放90后的童年回忆,哦泡果奶主题曲。并且这个程序在安装的时候会自动申请打开控制手机音量键,否则不通过这个权限程序根本无法运行。所以说如果你打开这个程序,手机的音量就不受你控制了,除非关机,不然你的手机配置再好,也逃脱不了被哦泡果奶主题曲冲击的命运。

那有的同学一下子腰板就坐直了,嗯?要搞事情了?图片图片,搞肯定是要搞滴,但是捏,不是哦泡果奶,是另外一个小程序,具体效果如何呢?点击下面视频看效果:

可以看到上面的视频里面这个程序完全是脱离python环境运行的,也就是说不论你的电脑有没有安装python或者是Pycharm他都可以运行。

实际上这个程序的功能也很简单------让运行这个程序的人说我像吴彦祖,否则他只能关机,除非他点击:’简直就是一个人‘。

那么如果要做这个小病毒怎么做呢?看下面

首先我们要知道,如果要做出让某句话不断重复的效果,肯定是需要循环的,让某段程序重复不断地去执行,这就需要用到我们今天学的新知识------while循环了。

在讲while循环之前,我们先给大家来一段程序:

我们再来看看这段程序的运行效果:

那么短短两行代码,却让’迪迦奥特曼是我最好的朋友‘这句话不断的运行,如果我不用pycharm的强制关闭功能的话,那根本就无法关闭。

那接下来我们来看看这两行代码的意思:

我们知道while在python当中是循环的意思,那么这个时候问题来了,True加在while后面是什么意思?我们之前在第三节课讲数据类型的时候讲过True属于布尔类型,这种数据类型就两个关键字,一个True 一个False。True 代表真,也就是我们大白话说的正确,对的意思。而False代表假,大白话说错误的意思。

这个时候就必须要再讲讲while的特性了,while的这个特性跟if和elif有点像,那就是在他们后面必须加判断语句。我们平常用if或者elif的话一定会在后面加上判断语句,比如说像我们上次做的那个肥胖测试仪。同样的,while后面也必须加判断语句,那么False跟True同样的也属于判断条件,while True实际上就相当于让print('迪迦奥特曼是我最好的朋友')这行代码做了一个无限运行,无限循环。如果运行后不强制关闭这个程序,他就会一直运行下去,直到你的电脑没电或者冒烟。

那么这样一来就很好理解while True:的意思了,加上True的话就相当于加上了一个判断条件,但True就相当于一个万能令牌一样,不论是谁都可以用True自由出入各个场所。如果符合这个判断条件,那就执行print('迪迦奥特曼是我最好的朋友'),如果不符合那就不执行。但很明显,True的意思相当于直接让你执行下面的print('迪迦奥特曼是我最好的朋友'),基本上相当于走了个过场,但是该加还得加,因为我们说while的特性就是必须在他的屁股后面加判断条件。

说完判断语句接下来我们再讲讲空格,其实我刚才就说过,while循环跟if语句很像,像到什么地步呢?他只比if语句多了个循环的作用,剩下的基本差不多。就像我们接下来要说的空格,现在旁边有电脑的同学可以试试,把print('迪迦奥特曼是我最好的朋友')这行代码的空格取消掉,让他跟while True对齐,会发现什么都运行不了。因为我们说print('迪迦奥特曼是我最好的朋友')这行代码是需要循环的,既然需要让他循环,那就必须让他在while True语句下空四格,当然如果我们不需要他循环,那也就没必要让这句话空四格了。甚至没必要加while True.

那有的同学说,唉?那让他无限循环怎么停啊,别做个程序自己把自己坑了,到时候把自己电脑弄得中病毒了。安啦,既然有’制毒之法‘,那也一定有’解毒之法‘。如何让无限循环停下来呢?两种方式!

刚刚我们其实已经知道,True也是一种判断条件,只不过他就像一个永远都不会被拒绝的通行证一样,不论while下面的是什么操作,都会进行无条件执行,并且一直执行。

那么实际上除了True以外,我们还可以去加其他的判断条件,例如下面这段代码:

可以看到运行结果里'迪迦奥特曼是我最好的朋友'这句话只运行了一次,为什么?我们逐行来分析一下这段程序,首先第一行我们定义了一个a的整型变量,给他赋值为0。

那么再看第二行,第二行大家都知道就是让第二行以下带空格的代码都循环起来,但是大家仔细看第二行代码,这行代码说:我可以让你们带空格的代码去进行循环,但我有一个条件,那就是a必须小于1,你符合这个条件才能循环的说'迪迦奥特曼是我最好的朋友',否则如果不符合a<1这个条件的话就不让你循环了。

那么接下来程序就去进行判断了,首先他知道a目前是0,那么接下来他就让a去跟1作比较,让a跟1作比较说白了就是让0跟1作比较,换句话说,如果0<1才能让我们想循环的内容执行。很明显的,0确实是小于1的,这毫无争议。

因此我们的运行结果里出现了一句,'迪迦奥特曼是我最好的朋友',然而奇怪的是为什么只出现了一次这句话,难道0第二次再进行循环的时候就大于1了吗?非也非也,我们再看第四行代码。

第四行代码对第三行代码说,好的,你执行完了你的任务,已经说了一次'迪迦奥特曼是我最好的朋友'了,那么接下来该我上台表演了,我的任务就是给a加个1,我们之前说过a+=1展开就是a=a+1,相当于a给自己加了个1,那么原来的a=0,执行完第四行代码以后,a就不再是0,而是1了,因为第四行代码给a加了个1.

加完1以后的a觉得自己十分牛逼,打算再上循环那儿去跟1比比,看谁更大,可惜的是,这个时候程序再运行到第二行的时候,一判断,程序说,嗯?a变成1了?1跟1一比,两个一边儿大。得嘞,既然不符合a<1的规则,那我就不让你三四行代码运行了,因为你三四行都是带了空格的需要循环的,不合规矩我就让你不弄了,收拾收拾回家吧。然后程序接着再往下走,一看,嗯?没代码了,得嘞,任务干完了,回家睡觉。

其实相信大部分同学除了break这块儿其他基本上已经明白了,那这个break在英文当中是破碎的意思,但在我们的python里面他是专门用来终止循环的一个保留字。这也就意味着,无论while后面加了什么样的判断条件,哪怕是True这个无限循环,只要break一出来,那么当前的循环就被终止了。

这么一说,是不是上面的这个程序就好理解了,第一行代码先来个无限循环,第二行代码进行询问,如果用户输入的是‘是’,那就说你是我最好的朋友,并且说完后直接终止循环。否则就一直说哦然后继续循环到开头继续问直到用户回答是。

这个程序延续了我们上节课学习的easygui库,所以我们必须先导入这个库,然后把所有的input换成buttonbox(),print()换成msgbox()。这个程序我们就不讲了,代码放下面大家自己琢磨琢磨

将程序打包这个命令实际上挺多的,但是我们就根据今天我们做的程序敲打包命令。如果有兴趣的同学可以百度一下其他打包命令。

首先我们要知道,pyinstaller这个库的作用是专门用来打包程序的,并且这是一个第三方库,需要我们自己去下载,不会下载第三方库的第六篇文章,里面有专门的下载链接命令和方法。

这个库有个特殊点,就是在文件中不用导入这个库名,只要下载好这个库,然后直接敲命令就可以了。具体怎么操作看下面:

1.先打开需要打包的文件然后在下面找Terminal键,找到后单击打开。

3.在你的文件所存在的文件夹里找一个叫dist的文件夹,这是打包命令自动生成的。

4.打开dist文件夹,找到你的文件名但后缀是exe的那个软件,就是我们刚才生成的软件。直接发给你的好基友就可以了。

好啦,这期就到这里啦,我们下期见,拜拜!

今天早上起来,第一件事情就是理一理今天该做的事情,瞬间get到任务,写一个只用python字符串内建函数的爬虫,定义为/post/category/main/(一个很有趣的网站,一段话配一个图,老有意思了~)网站形式如下:

目标:把大的目标分为几个小的目标。因为第一次干这个,所以对自己能力很清楚,所以完成顺序由简单到复杂。

# 实现了爬的单个页面的title和img的url并存入文本

下面要重新分析网站,我已经可以获得一期的内容了,我现在要得到,其它期的url,这样就想爬多少就爬多少了。

目标网址:/post/10189/"只有数字是变化的。

后来我又发现,我想要的这两个数据都在<h2>这个标签下面,获取每期url的方法如下:

实现代码,这个我要想一想怎么写,我是第一次写爬虫,不要嘲讽我啊!

感觉快实现了,还在写:

ok了所有的代码都写完了

我要回帖

更多关于 python语言代码大全及其含义 的文章

 

随机推荐