main函数的分析(python)

对于很多编程语言来说,程序都必须要有一个入口,比如C,C++,以及完全面向对象的编程语言Java,C#等。如果你接触过这些语言,对于程序入口这个概念应该很好理解,C,C++都需要有一个main函数作为程序的入口,也就是程序的运行会从main函数开始。同样,Java,C#必须要有一个包含Main方法的主类,作为程序入口。

而Python则不同,它属于脚本语言,不像编译型语言那样先将程序编译成二进制再运行,而是动态的逐行解释运行。也就是从脚本第一行开始运行,没有统一的入口。

一个Python源码文件(.py)除了可以被直接运行外,还可以作为模块(也就是库),被其他.py文件导入。不管是直接运行还是被导入,.py文件的最顶层代码都会被运行(Python用缩进来区分代码层次),而当一个.py文件作为模块被导入时,我们可能不希望一部分代码被运行。

假设我们有一个const.py文件,内容如下:

PI = 3.14

def main():
    print("PI:", PI)

main()

# 运行结果:PI: 3.14

现在,我们写一个用于计算圆面积的area.py文件,area.py文件需要用到const.py文件中的PI变量。从const.py中,我们把PI变量导入area.py:

from const import PI

def calc_round_area(radius):
    return PI * (radius ** 2)

def main():
    print("round area: ", calc_round_area(2))

main()

'''
运行结果:
PI: 3.14
round area:  12.56
'''

我们看到const.py中的main函数也被运行了,实际上我们不希望它被运行,因为const.py提供的main函数只是为了测试常量定义。这时if __name__ == "__main__"派上了用场,我们把const.py改一下,添加if __name__ == "__main__"

PI = 3.14

def main():
    print("PI:", PI)

if __name__ == "__main__":
    main()

运行const.py,输出如下:

PI: 3.14

运行area.py,输出如下:

round area:  12.56

如上,我们可以看到if __name__ == "__main__"相当于Python模拟的程序入口,Python本身并没有这么规定,这只是一种编码习惯。由于模块之间相互引用,不同模块可能有这样的定义,而程序入口只有一个。到底哪个程序入口被选中,这取决于__name__的值。

通俗的理解__name__ == '__main__'

if __name__ == '__main__'的意思是:

当.py文件被直接运行时,if __name__ == '__main__'之下的代码块将被运行;

当.py文件以模块形式被导入时,if __name__ == '__main__'之下的代码块不被运行。

#hello.py
def foo():
    str="function"
    print(str);
if __name__=="__main__":
    print("main")
    foo()

运行结果

python hello.py

#运行结果
main
function

在Python Shell中运行结果

>>> import hello
>>> hello.foo()
function
>>> hello.__name__
'hello'

可以发现这个内置属性__name__自动的发生了变化。
这是由于当你以单个文件运行时,__name__便是__main__
当你以模块导入使用时,这个属性便是这个模块的名字。

典型的Python文件结构:

main函数的分析(scala)

object HelloScala
{
  def main(args: Array[String]): Unit =
  {
    println("I Love You Scala");
  }
}

如图所看到的,在Scala中能够使用object和class分别定义一个类。两者还是存在一些区别。以后我会在专门的博客中给予介绍。

在Scala中定义一个函数使用:def 来修饰 
完整定义一个函数为: 
def 函数名(參数:參数类型。參数:參数类型): 返回值类型={ 

比如:

def methodName(parameterStr: String, parameterInt: Int): Int =
{
    return 1;
}

Unit表示这种方法没有返回值,相当于Java其中的void,在Java中叫做返回类型,在Scala中叫做结果类型。

object RunAppDemo {
    def main(args:Array[String]) {
        println("Hello, Scala")
    }
}  

这种方式省略了返回值类型。

println("I Love You Scala");

就是向控制台打印一句话。全部Scala程序的入口都是从main函数开始的。

基本规则(scala)

每一种语言都有自己规定。记住这些有助于我们不在后面的编程犯错,写出更加美丽的程序出来。 
区分大写和小写:这点和非常多语言一样 Scala也是区分大写和小写的,比如HELLO和hello是意义全然不同的 
类名:首字母大写,而且採用驼峰结构。比如:HelloWorld.scala 
方法名:除首个单词的首字母小写以外。其余单词首字母大写。比如:def getData(){} 
变量命名:以字母或者下划线开头。能够使用字母,数字或下划线。“$”字符在Scala中是保留关键字。不能使用。

换行符:Scala是面向行的语言,语句可以用分号(;)结束或换行符(println())

python参考:

https://blog.csdn.net/yjk13703623757/article/details/77918633

https://www.cnblogs.com/jpfss/p/9227532.html

scala参考:

https://www.cnblogs.com/jhcelue/p/7299568.html

https://blog.csdn.net/w_j_w2010/article/details/49741849

https://www.cnblogs.com/ahu-lichang/p/7207847.html?utm_source=itdadao&utm_medium=referral

https://www.cnblogs.com/sayhihi/p/7402698.html

main方法的更多相关文章

  1. 一个java文件中可包含多个main方法

    java中的main方法是java应用程序的入口,java程序在运行时,首先调用执行main方法.但并不是说java中只能有一个main方法,不同类中都可以包含main方法.当JVM进行编译时,会提示 ...

  2. java 执行 jar 包中的 main 方法

    java 执行 jar 包中的 main 方法 通过 OneJar 或 Maven 打包后 jar 文件,用命令: java -jar ****.jar执行后总是运行指定的主方法,如果 jar 中有多 ...

  3. 10、代码块、构造代码块、静态代码块及main方法之间的关系

    1.普通代码块: 在方法或语句中出现在{}之间的类容就称为普通代码块,简称代码块.普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出现先执行”,即顺序执行. /*下面第一个类时合法的 ...

  4. 为什么使用Junit Test而不用普通java main方法来完成测试?

    因为在程序里边,一个接口对应一个实现方法,而在接口中常常会定义相关的很多方法,所以在测试的时候,如果都在main方法里边进行测试,main方法就会显得臃肿,而且不便于以后其他人测试以及查看测试数据,用 ...

  5. Java中是否可以调用一个类中的main方法?

    前几天面试的时候,被问到在Java中是否可以调用一个类中的main方法?回来测试了下,答案是可以!代码如下: main1中调用main2的主方法 package org.fiu.test; impor ...

  6. 解决Java接口内部类的main()方法无法打印输出的问题

    问题源自<Thinking in Java>关于内部类的章节,例子如下: public interface ClassInInterface{ void howdy(); public c ...

  7. maven project中,在main方法上右键Run as Java Application时,提示错误:找不到或无法加载主类XXX.XXXX.XXX

    新建了一个maven project项目,经过一大堆的修改操作之后,突然发现在main方法上右键运行时,竟然提示:错误:找不到或无法加载主类xxx.xxx.xxx可能原因1.eclipse出问题了,在 ...

  8. 【细说Java】关于main方法的一些细节

    Public static void main(String[] args) public :main方法是jvm运行的入口,所以必须是public来供外部调用 static :main方法无需生成对 ...

  9. 22.编写一个类A,该类创建的对象可以调用方法showA输出小写的英文字母表。然后再编写一个A类的子类B,子类B创建的对象不仅可以调用方法showA输出小写的英文字母表,而且可以调用子类新增的方法showB输出大写的英文字母表。最后编写主类C,在主类的main方法 中测试类A与类B。

    22.编写一个类A,该类创建的对象可以调用方法showA输出小写的英文字母表.然后再编写一个A类的子类B,子类B创建的对象不仅可以调用方法showA输出小写的英文字母表,而且可以调用子类新增的方法sh ...

  10. main方法中声明8种基本数据类型的变量并赋值

    main方法中声明8种基本数据类型的变量并赋值  char→  int→ long→ float→ double byte→ short→ 

随机推荐

  1. python列表操作方法详解

      列表 列表是Python中最基本的数据结构,列表是最常用的Python数据类型,列表是一个数据的集合,集合内可以放任何数据类型,可对集合方便的增删改查操作.Python已经内置确定序列的长度以及确 ...

  2. redhat 7.6 流量监控命令、软件(1) ethstatus

    1. 查看1个月内流量,只保留一个月的流量 命令: sar   -n  DEV   -f    /var/log/sa/sa26 RX代表进来的流量,TX代表出去的流量 2.安装查看实时流量软件eth ...

  3. ios APP进程杀死之后和APP在后台接收到推送点击跳转到任意界面处理

    https://www.jianshu.com/p/ce0dc53eb627 https://www.cnblogs.com/er-dai-ma-nong/p/5584724.html github: ...

  4. Python 正则表达式之 sub 和 subn函数的使用

    re.sub() 函数的功能 re是reguler expressioin的缩写,表示正则表达式 sub 是 substitute 的缩写,表示替换: re.sub是个正则表达式方面的函数,用来实现通 ...

  5. PTA的Python练习题(三)

    继续在PTA上编写Python的编程题. 从 第2章-11 求平方与倒数序列的部分和 开始 1. a,b=map(int,input().split()) s=0 while(a<=b): s= ...

  6. null值可以赋给引用变量,不能给基本类型

    下面正确的写法是? cbyte i=128 boolean i=null long i=0xfffL double i=0.9239d null表示没有地址:null可以赋值给引用变量,不能将null ...

  7. Qt5.5 使用smtp发邮件的各种坑

    本人刚开始学习C++,用的是Qt5.5的IED,经过了两天的学习和查找资料,终于成功发了第一封邮件.以163邮箱为例,简单总结一下. 1.设置邮箱 这一步比较关键,要开通smtp服务,在开通的过程中会 ...

  8. 1004 Counting Leaves (30分) DFS

    1004 Counting Leaves (30分)   A family hierarchy is usually presented by a pedigree tree. Your job is ...

  9. node.js的C++入门

    最近的任务是把计划库的API用JavaScript语言调用起来,需要用Node.js的C++扩展,本文简单归总一下node.js addons官方文档https://nodejs.org/api/ad ...

  10. VS2013 ERROR MSB8020

    error MSB8020: The build tools for Visual Studio 2013 (Platform Toolset = 'v120') cannot be found. T ...