当前位置:首页 > 星座达人

#NAME?:为什么这段爬虫代码一直出现‘_name_’未定义?

分享到

为什么这段爬虫代码一直出现‘_name_’未定义?

python玄学系列(第一集):你真的看懂了if __name__ == "__main__"吗?

写在前面 最近打算写一个系列文章,名字就叫做python玄学系列吧。在我学习的过程中,发现了很多python乍看之下非常令人费解的用法,实际上有着更加深层次的知识点。比如今天我将要介绍的这句话。几乎所有刚学python的同学都会遇到,但真正能明白它的深层次用法的却很少。废话不多说,下面就让我们开始吧!1、本质就是个if判断 仔细看这句代码!但它又不是一个简单的if判断,__main__"。举个例子;我的名字叫小北;__name__==",__name=="main是我自己的另一个别称,任何人在自己的眼中都可以叫做main,意思就是说;我就是我;当.py文件被直接运行时,当.py文件以模块形式被导入时“if __name__ == '__main__'之下的代码块不被运行,2、入口函数其实在第一节中:真的已经说完了if __name__ == ",为什么很多博客说是入口函数,这和入口函数有什么关系;接下来我给大家一一解释这些问题;应该知道main方法吧,java里面长这样的,public static void main(String[] args) { System.out.println("?Hello Word",#include void main(){ printf(",这些叫做入口函数;编程语言都有一个入口函数;作为程序开始执行的入口:不然容易迷路;既然java/c都有入口函数;那么python有没有呢;但是人为的造了一个入口出来(这就叫做世上本没有路,走的人多了便成了路),我慢慢给你解释。首先说一下python与java/c的区别,python属于解释型语言?java/c叫做编译型语言。python是从上到下。解释一行。执行一行,c是编译型语言,先编译后执行。编译型语言在程序执行之前,有一个单独的编译过程,将程序翻译成机器语言,以后执行这个程序的时候,就不用再进行翻译了。解释型语言,是在运行的时候将程序翻译成机器语言。所以运行速度相对于编译型语言要慢,其实java不能算严格的编译型语言虽然Java程序在运行之前也有一个编译过程,但是并不是将程序编译成机器语言,而是将它编译成字节码(可以理解为一个中间语言),由JVM将字节码再翻译成机器语言,所以java是先编译后解释,所以python的一个.py文件是没有入口的。因为都是从上到下执行,一个.py文件是可以被另外的模块import的,既然没有入口。那么被import的模块的所有代码都会执行。有时候想要控制一部分代码不执行那该怎么办呢,来看一下下面的代码,我有一个a.py文件,aaa")nnaaa()现在有一个b.py文件导入了a.py;n print(":)nnbb()n结果为:aaanbbb问题就来了;我期望的只是打印;作为入口函数的用法:这里还有一个细节。aa变量在if __name == ",__main__"之前;并且它的值也被打印出来了:这就证明了一点,__main__",只是一个人为(假的)的入口函数;只能阻止它所包含的代码运行;可能你还是会问:为什么运行a.py就能执行aaa()函数,运行b.py就不会执行呢。这就该__name__上场了,3、令人费解的__name__,__name__。是一个python内建的系统变量。这一点可以通过dir(__builtins__)来查看在终端执行dir(__builtins__)“>>> dir(__builtins__)n['ArithmeticError'”'AssertionError'。'Exception','False','None','SystemError','True','Warning','_','__debug__','__doc__','__import__','__name__','__package__','abs','apply','bin','bool','buffer','bytearray','bytes','chr','cmp','coerce','compile','complex','copyright','dict','dir','eval','exit','file','filter','float','format','hash','help','hex','id','input','int','issubclass','iter','len','license','list','long','map','max','min','object','oct','open','ord','pow','print','property','quit','range','raw_input','reduce','reload','round','set','set,attr','str','sum','zip']>>> dir(__builtins__)['ArithmeticError','AssertionError','Exception','False','None','SystemError','True','Warning','_','__debug__','__doc__','__import__','__name__','__package__','abs','apply','bin','bool','buffer','bytearray','bytes','chr','cmp','coerce','compile','complex','copyright','dict','dir','eval','exit','file','filter','float','format','hash','help','hex','id','input','int','issubclass','iter','len','license','list','long','map','max','min','object','oct','open','ord','pow','print','property','quit','range','raw_input','reduce','reload','set','slice','str','sum','super','tuple','type','unicode','vars','xrange','zip']你可以找一下,list里面有一个__name__变量。具体它有什么用处呢,我们来实验一下。修改刚才的a.py文件:print(__name__)运行a.py文件,__main__看到了吧,每个.py文件都有一个__name__属性,就像每条狗都有一个名字一样,有的叫哈士奇,有的叫柴犬,反正都有一个名字。但是有别人有可能觉得你名字不好听,本来叫哈士奇,你还不是得屁颠屁颠的嗷嗷叫。当其他模块导入a.py文件的时候,它的__name__属性值就变了。我们修改b.py文件:import a运行b.py文件,a这个时候a.py文件的__name__属性就不是__main__了,而是a,因为"a"自然就不会运行if __name == "__main__"下面的代码了:4、__name__可以显示包路径 我们建立这样一个目录结构。在c.py文件中写下面代码:print(__name__)然后再d.py中这样写:a.b.c看到了吧:此时a.py文件的__name__属性变成了a.b.c,完完全全反映了它所在的包路径,关于__name__属性还有很多值得深究的细节。

浅入深谈:秒懂python编程中的if __name__ == 'main' 的作用和原理

一天偶然发现知乎上有篇关于对python编程中的if __name__ == 'main'的理解陈述,自己觉得不够简单明了,于是在其文章底部写了一句话,突然收获各位乎友满满的赞同相信初学者在学习Python的过程中,不可避免的总会遇到if __name__ == 'main'语句,虽然一直知道它的作用,但是可能一直比较模糊,今天菜鸟分析就与大家一起举例说说我的理解。我们在下面在test.py中写入如下代码:print('恋习Python')nndef main():ntprint('恋习Python')nif __name__ == '__main__':ntmain()ntprint('跟着菜鸟分析,练习Python越练越恋')运行代码,在同一文件夹新建名称为import_test.py的脚本,只输入代码:与之前test.py代码运行结果比较,只有输出恋习Python,也就是if __name__=="之前的语句被执行:之后的没有被执行,菜鸟分析继续给你举例子说明,最后有一种豁然开朗的感觉,我们在test.py脚本的if __name__==",__main__"之前加入print __name__;即将__name__打印出来:则最后运行结果如下,此时变量__name__的值为":再执行import_test.py;模块内容和执行结果如下;import_test.py中的__name__变量值为test,不满足__name__==":__main__",无法执行其后的代码;是不是一下明白啦,给菜鸟分析点个赞哦,再仔细想想,其运行原理也就是,由于每个python模块(python文件)都包含内置的变量__name__!当运行模块被执行的时候。

为什么我的WPS表格在用if函数时结果是#NAME?的?

## 连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。是一种分隔连接方式”它的作用是先分隔,然后进行强制连接,分隔的作用类似于空格,我们知道在普通的宏定义中。预处理器一般把空格解释成分段标志,对于每一段和前面比较,相同的就被替换,被替换段之间存在一些空格,如果我们不希望出现这些空格。就可以通过添加一些 ##来替代空格,举列 – 试比较下述几个宏定义的区别 #define A1(name。type) type name_##type##_type 或 #define A2(name,A2(a1;int),解释;1) 在第一个宏定义中:之间没有被分隔”所以预处理器会把name_##type##_type解释成3段”是在宏前面出现过 的”2) 而在第二个宏定义中“之间也被分隔了,所以预处理器会把name##_##type##_type解释成4段“type:_type”就有两个可以被宏替换了”3) A1和A2的定义也可以如下“type) type name_ ##type ##_type <“##前面随意加上一些空格>”type) type name ##_ ##type ##_type 结果是## 会把前面的空格去掉完成强连接,得到和上面结果相同的宏定义。

c语言的 _##name意思?

## 连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。 简单的说,“##”是一种分隔连接方式,它的作用是先分隔,然后进行强制连接。其中,分隔的作用类似于空格。我们知道在普通的宏定义中,预处理器一般把空格解释成分段标志,对于每一段和前面比较,相同的就被替换。但是这样做的结果是,被替换段之间存在一些空格。如果我们不希望出现这些空格,就可以通过添加一些 ##来替代空格。举列 – 试比较下述几个宏定义的区别 #define A1(name, type) type name_##type##_type 或 #define A2(name, type) type name##_##type##_type A1(a1, int); A2(a1, int); 解释: 1) 在第一个宏定义中,”name”和第一个”_”之间,以及第2个”_”和第二个 ”type”之间没有被分隔,所以预处理器会把name_##type##_type解释成3段:“name_”、“type”、以及“_type”,这中间只有“type”是在宏前面出现过 的,所以它可以被宏替换。 2) 而在第二个宏定义中,“name”和第一个“_”之间也被分隔了,所以预处理器会把name##_##type##_type解释成4段:“name”、“_”、“type”以及“_type”,这其间,就有两个可以被宏替换了。 3) A1和A2的定义也可以如下: #define A1(name, type) type name_ ##type ##_type <##前面随意加上一些空格> #define A2(name, type) type name ##_ ##type ##_type 结果是## 会把前面的空格去掉完成强连接,得到和上面结果相同的宏定义。或再比如#define LINK_MULTIPLE(a,b,c,d) a##_##b##_##c##_##dtypedef struct _record_type LINK_MULTIPLE(name,company,position,salary);// 这里这个语句将展开为:// typedef struct _record_type name_company_position_salary; 详细使用方法,可以参考如下博客内容:http://blog.sina.com.cn/s/blog_7d9463b20100xp5t.html

excel中出现“#NAME”怎么办?

0

excel中出现“#NAME”怎么办?