规则一:

一个python文件中,只写一些可以运行的功能
测试代码写在这句代码下面

if __name__ =='__main__':

在讲这边的时候,我不是很懂
参考了一篇博客,地址如下:
http://blog.konghy.cn/2017/04/24/python-entry-program/

简单来理解,可以把    if __name__ =='__main__':     理解为python程序的入口

对于很多编程语言来说,程序都必须要有一个入口,比如 C,C++,以及完全面向对象的编程语言 Java等。

如果你接触过这些语言,对于程序入口这个概念应该很好理解,C 和 C++ 都需要有一个 main 函数来作为程序的入口,

也就是程序的运行会从 main 函数开始。同样,Java 必须要有一个包含 Main 方法的主类来作为程序入口。

而 Python 则有不同,它属于脚本语言,不像编译型语言那样先将程序编译成二进制再运行,而是动态的逐行解释运行。

也就是从脚本第一行开始运行,没有统一的入口。

一个 Python 源码文件除了可以被直接运行外,还可以作为模块(也就是库)被导入。

不管是导入还是直接运行,最顶层的代码都会被运行(Python 用缩进来区分代码层次)。

而实际上在导入的时候,有一部分代码我们是不希望被运行的。

#举一个例子来说明一下,假设我们有一个 const.py 文件,内容如下:

PI = 3.14
def Math():
print('PI = %s'%PI)
Math()

我们在这个文件里边定义了一些常量,然后又写了一个 Math 函数来输出定义的常量,

最后运行 Math 函数就相当于对定义做一遍人工检查,看看值设置的都对不对。

然后我们直接执行该文件(python const.py),输出:

PI = 3.14

现在,我们有一个 area.py 文件,用于计算圆的面积,

该文件里边需要用到 test.py 文件中的 PI 变量,那么我们从 const.py 中把 PI 变量导入到 test.py 中:

from const import PI
def calc_round_area(radius):
return PI *(radius**2)
def calc():
print('round area = %s'%(calc_round_area(2)))
calc()

运行test.py ,输出结果

PI = 3.14
round area = 12.56

可以看到,const 中的 Math 函数也被运行了,实际上我们是不希望它被运行,

提供 Math 也只是为了对常量定义进行下测试。

这时,if __name__ == '__main__' 就派上了用场。把 const.py 改一下:

PI = 3.14
def Math():
print('PI = %s'%PI)
if __name__ == '__main__':
Math()

然后再运行 test.py,输出如下:

round area = 12.56

总结:

if __name__ =='__main__':

就相当于是 Python 模拟的程序入口。

Python 本身并没有规定这么写,这只是一种编码习惯。

由于模块之间相互引用,不同模块可能都有这样的定义,而入口程序只能有一个。

到底哪个入口程序被选中,这取决于__name__的名字。
(先理解到这边)

规则二:

在编程中,利用一个状态来标识某种操作

举例:

有一个三层嵌套的循环程序,我可以通过break来跳出当前层的循环,
实现每一层之间进行切换。如果我现在在最里层,我要求一步切换到最外层
通过break来跳出,需要跳三次。

while True:
print('leve11')
choice = input('levell:').strip()
if choice == 'quit':break
while True:
print('level2')
choice = input('level2:').strip()
if choice == 'quit': break
while True:
print('level3')
choice = input('level3:').strip()
if choice == 'quit': break

如果利用 tag 的状态来标识这种操作,可以实现循环最里层到最外层一步跳跃。

tag = True
while tag:
print('leve11')
choice = input('levell:').strip()
if choice == 'quit':break
if choice == 'quit all': tag = False
while tag:
print('level2')
choice = input('level2:').strip()
if choice == 'quit': break
if choice == 'quit all': tag = False
while tag:
print('level3')
choice = input('level3:').strip()
if choice == 'quit': break
if choice == 'quit all':tag = False

Python小白学习之路(二十六)—【if __name__ =='__main__':】【用状态标识操作】的更多相关文章

  1. Python小白学习之路(十六)—【内置函数一】

    将68个内置函数按照其功能分为了10类,分别是: 数学运算(7个) abs()   divmod()  max()  min()  pow()  round()  sum() 类型转换(24个) bo ...

  2. Python小白学习之路(十二)—【前向引用】【风湿理论】

    前向引用 风湿理论(函数即变量) 理论总是很抽象,我个人理解: 代码从上到下执行,一旦遇到定义的函数体,内存便为其开辟空间,并用该函数的名字作为一个标识但是该函数体内具体是什么内容,这个时候并不着急去 ...

  3. Python小白学习之路(十)—【函数】【函数返回值】【函数参数】

    写在前面: 昨天早睡之后,感觉今天已经恢复了百分之八十的样子 又是活力满满的小伙郭 今日份鸡汤: 我始终相信,在这个世界上,一定有另一个自己,在做着我不敢做的事,在过着我想过的生活.-------宫崎 ...

  4. Python小白学习之路(十五)—【map()函数】【filter()函数】【reduce()函数】

    一.map()函数 map()是 Python 内置的高阶函数 有两个参数,第一个是接收一个函数 f(匿名函数或者自定义函数都OK啦):第二个参数是一个 可迭代对象 功能是通过把函数 f 依次作用在 ...

  5. Python小白学习之路(十九)—【文件操作步骤】【文件操作模式】

    一.文件操作步骤 step1:打开文件,得到文件句柄并赋值给一个变量step2:通过句柄对文件进行操作step3:关闭文件 举例: a = open('hello world', 'r', encod ...

  6. Python小白学习之路(十八)—【内置函数三】

    一.对象操作 help() 功能:返回目标对象的帮助信息 举例: print(help(input)) #执行结果 Help on built-in function input in module ...

  7. Python小白学习之路(十四)—【作用域】【匿名函数】【编程方法论】【高阶函数】

    吧啦吧啦内心戏 在没有具体学作用域之前,我在之前的学习笔记中就有提到 我开始以为是自己自创的词儿 没想到这个词早已经存在(手动捂脸) 真是个无知的小火锅(不知者无罪) 我发现自己最擅长做的事情,就是给 ...

  8. 嵌入式Linux驱动学习之路(二十六)DM9000C网卡驱动程序

    基于DM9000C的原厂代码修改dm9000c的驱动程序. 首先确认内存的基地址 iobase. 确定中断号码. 打开模块的初始化函数定义. 配置内存控制器的相应时序(结合DM9000C.C的手册). ...

  9. FastAPI 学习之路(十六)Form表单

    系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...

  10. 【Java学习笔记之二十六】深入理解Java匿名内部类

    在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...

随机推荐

  1. mybatis 使用merge into

    前一篇博客,oracle的merge into语法 : oracle merge into语法 mybatis 使用merge into,跟一般的update写法相同: <update id=& ...

  2. function类型(c++11)

    1.c++五大可调用的对象 可调用的对象常常作为泛型算法的实参 1)函数 2)函数指针 函数名其实也是函数指针,只不过函数名是一个常量指针,它的值不能改变,只能指向该函数,不能改变它的值让它指向别的函 ...

  3. Oracle数据库使用mybatis的时候,实体类日期为Date类型,mybatis里面定义的是Date类型,插入的时候,时分秒全部是12:00:00问题

    实体类中日期定义的是Date类型的,没毛病: 我在mybatis里面定义的是Date类型的,进行测试的时候发现,数据库插入的日期的时分秒全部都是一样的,都是12:00:00,很郁闷: 后来把mybat ...

  4. DOM3级的变化

    由于存在跨浏览器开发问题所以不推荐使用: 兼容性: event.key 包含所按下键的字符 event.char 属性IE9和safari和chrome并不支持 event.location 返回所按 ...

  5. ON_UPDATE_COMMAND_UI和ON_COMMAND有什么区别?

    区别如下: UPDATE_COMMAND_UI表示处理菜单对应的用户界面显示状态. COMMAND表示处理该菜单对应的功能. 传统SDK程序要改变选单命令项状态,可以呼叫EnableMenuItem或 ...

  6. 【1】jQuery异步(Ajax)操作之JSONP [转]

     前言: 说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求如何解决?这两个问题目前都有不同的解决方案,比如数据可以用自定义字符串或者用XML来描述,跨域 ...

  7. 常用模块xml,shelve,configparser,hashlib

    XML 什么XML:全称 可扩展标记语言 标记指的是代表某种含义的字符 XML<> 为什么需要XML 为能够在不同的平台间继续数据的交换 为了使交换的数据能让对方看懂 就需要按照一定的语法 ...

  8. JVM、JRE,JDK

    JVM解释class     Java虚拟机,解释编译后的class文件给系统..java代码编译成 .class机器指令,就能在JVM运行了,直接到硬件执行,实现了跨平台,只要操作系统安装了JVM, ...

  9. 《ARM Cortex-M3权威指南》笔记(1)

    http://blog.csdn.net/roverx/article/details/6624859 第1章 介绍 一.ARM Cortex‐M3处理器初探 CM3处理器内核是单片机的中央处理单元( ...

  10. 20155326 实验三 敏捷开发与XP实践

    20155326 实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器 ...