首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么Python没有main函数?

其实,可能他们是想模仿真正的main函数,但是许多人都被误导(或误解),然后编写了非常笨拙的代码。 在本文中,我们来讨论一下为什么Python没有main函数。...在开始讨论之前,我们先来回答以下两个问题: 所谓的“main函数”究竟是什么意思? 为什么有些编程语言必须编写main函数?...为了让操作系统/引导程序找到程序的开头,需要定义这样一个函数。 简而言之,需要在大量可执行的代码中定义一个至关重要的的开头。 不难看出,对于这些语言来说,main函数是不可或缺的组成部分。...换句话说,Python不需要规定程序员必须在语法上定义一个统一的入口(无论是函数、类还是其他东西)。...除了函数名是“main”之外,这段代码与我们前面介绍的main函数没有半点关系,这个函数既不是必须的,也不能确定程序的执行顺序。即便没有上面这样的main函数,也不会有任何的语法问题。

1.8K20

Python 为什么没有 main 函数?为什么我不推荐写 main 函数?

本期“Python 为什么”栏目来聊聊 Python 为什么没有 main 函数? 在开始正题之前,先要来回答这两个问题:所谓的 “main 函数”是指什么?...为什么有些编程语言需要强制写一个 main 函数?...这些语言是编译型语言,需要把代码编译成可执行的二进制文件,为了让操作系统/启动器找到程序的起点,所以要约定这一个函数。简单地说,就是在一大堆代码里,需要定义一个显著的可用于执行的开头。...也就是说,Python 没有必要在语法层面规定程序员必须定义出一个统一的入口(不管是函数还是类还是什么东西)。...除了函数名是“main”以外,它跟我们前面介绍的正统的 main 函数没有半毛钱关系,既没有强制性,也没有必然决定程序执行顺序的作用。缺少它,也不会导致什么语法问题。

2.5K31
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    为什么 Python 没有函数重载?如何用装饰器实现函数重载?

    当我们像 area(7) 这样调用函数 area 时,它会调用第二个函数,而 area(3,4) 则会调用第一个函数。 为什么 Python 中没有函数重载? Python 不支持函数重载。...函数名 函数接收的参数量 被重写的__call__方法会调用被封装的函数,并返回计算的值(这没有啥特别的)。...我们没有更改 Python 的默认行为,因此在原生的命名空间中,同名的函数只有一个。 这个 get 函数决定了会调用函数的哪个实现(如果重载了的话)。...") # 调用被封装的函数,并返回调用的结果 return fn(*args, **kwargs) 该方法从虚拟命名空间中获取正确的函数,如果没有找到任何函数,它就抛出一个 Exception...运用函数重载 准备好所有代码后,我们定义了两个名为 area 的函数:一个计算矩形的面积,另一个计算圆的面积。下面定义了两个函数,并使用overload装饰器进行装饰。

    3.4K10

    【C++】多态 ⑧ ( 验证指向 虚函数表 的 vptr 指针 | 对比定义了虚函数的类和没有定义虚函数类的大小 )

    对比 定义了 虚函数 的类 与 没有定义虚函数的类 的大小 , 其它成员都相同 , 定义了虚函数的类多出了 4 字节 , 多出的 4 字节就是 vptr 指针占用的内存空间 ; 一、验证指向 虚函数表...1 个虚函数 ; 如果 没有虚函数 , 就不会生成虚函数表 ; 如果 类 中有 virtual 虚函数 , 则 该类的 每个对象 中 , 都有一个 指向 虚函数表的 vptr 指针 ; 虚函数表 存储...; 2、虚函数类与普通函数类对比 - 多出了 vptr 指针的大小 下面的代码中 , 定义了 2 个类 , 区别是 一个定义了 virtual 虚函数 , 另外一个没有定义 虚函数 ; 在 Parent...中定义了 虚函数 virtual void fun(int a) ; 在 Parent2 中定义的是 普通函数 void fun(int a) ; 使用 sizeof 函数 , 获取这两个类的大小 ,...判断两个类的区别 ; 最终得到 , 有 虚函数 的 类 , 比 没有 虚函数 的 类 , 多 4 字节 , 也就是一个指针的大小 , 定义了 虚函数 的类 , 多出的 4 字节就是 vptr 指针的大小

    22740

    明明写了个自定义函数,为什么调用不了?

    小勤:这个“调用自定义函数”功能怎么用的?我明明写了个自定义函数(add)的哦,为什么调用不了? 大海:你仔细看看这个功能的说明? 小勤:“调用此文件中为各行定义的自定义函数”?还是不理解。...然后再去刚才那个“调用自定义函数”功能试试? 小勤:啊!这个可以啊,原来要这样?这个功能说明里“此文件中”的意思是只能调用本查询外部的自定义函数,而不能调用本查询内部的自定义函数? 大海:对的。...也就是说最终还是用了查询里面的那个自定义函数? 大海:对的,当查询内的自定义函数与查询外的自定义函数名称一样时,会以查询内部的为准。...所以,这里要注意的是: “调用自定义函数”的操作功能只是在一定程度上简化了写添加自定义列公式的工作,并不会因为它只能选择外面的自定义函数,就一定会使用选择的那个函数;同时,在写自定义函数时,一定要注意...,无论在查询内部还是外部,不要使用相同的名称,否则容易导致出现了错误(这往往是没有错误提示的逻辑计算错误,数据计算复杂时很难发现)。

    74630

    构造函数为什么一般不定义为虚函数?而析构函数一般写成虚函数的原因 ?

    浏览量 3 1、构造函数不能声明为虚函数 1)因为创建一个对象时需要确定对象的类型,而虚函数是在运行时确定其类型的。...而在构造一个对象时,由于对象还未创建成功,编译器无法知道对象的实际类型,是类本身还是类的派生类等等 2)虚函数的调用需要虚函数表指针,而该指针存放在对象的内存空间中;若构造函数声明为虚函数,那么由于对象还未创建...,还没有内存空间,更没有虚函数表地址用来调用虚函数即构造函数了 2、析构函数最好声明为虚函数,首先析构函数可以为虚函数,当析构一个指向派生类的基类指针时,最好将基类的析构函数声明为虚函数,否则可以存在内存泄露的问题...如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除指向派生类的基类指针时,只会调用基类的析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全。子类析构时,要调用父类的析构函数吗?...析构函数调用的次序时先派生类后基类的。和构造函数的执行顺序相反。并且析构函数要是virtual的,否则如果用父类的指针指向子类对象的时候,析构函数静态绑定,不会调用子类的析构。

    70510

    我发现了华点:vue规定用普通函数定义方法,为什么react又要我用箭头函数!

    在调用时分别打印this,结果如下: 箭头函数中this正确指向了组件实例,但普通函数中却指向了undefined,为什么?...但为什么使用箭头函数,this又可以正确指向组件实例呢?...,是被挂载到原型链上的;而使用箭头函数定义的方法,直接赋给了实例,变成了实例的一个属性,并且最重要的是:它是在「构造函数的作用域」被定义的。...我们知道,箭头函数没有自己的this,用到的时候只能根据作用域链去寻找最近的那个。放在这里,也就是构造函数这个作用域中的this——组件实例。...这样就可以解释为什么react组件中,箭头函数的this能正确指向组件实例。

    79610

    C++ link2005 error 错误 解决方法汇总(一般重复定义,如果都是不就是 函数定义和实现没有分离)

    一般都是重复定义。 可以按照VS给出的信息去找相关的变量或者宏定义,还有函数。 这里需要注意include,不要重复include,不要重复定义宏。...但上述这些,都是很好理解的…… 如果大家按照上边说的检查了,还是百思不得其解,那么就看看关于类的函数定义和实现分离的问题吧。...一个兄弟的文章方法类似:http://blog.csdn.net/pang040328/archive/2009/07/07/4328270.aspx(不过说得很简单) 大家留意编译器出现的错误,这种情况一般都是类的函数定义重复...但只有一处定义了,为什么呢? 一般这种情况出现,是因为在h文件中,直接写了类函数的定义,虽然定义不在类中,已经分离出类之外,但还在.h文件中。...解决方法很简单,就把那几个函数放到对应的cpp中,如果没有就建一个。 我的例子: Connection.h是一个类,其中四个函数定义在类之外,但还在h文件中。

    51740

    iTween 那些事儿(一)

    .MoveUpdate   就拿MoveTo举例,该接口的作用便是在一段时间以内将目标GameObject由当前位置移动到目标位置,定义上其提供了两个重载版本:   public static void...(gameObject, paramTable);   上述代码略显复杂,使用iTween提供的一个辅助函数Hash(params object[] args) 可以帮助我们简化代码:   iTween.MoveTo...重载版本那么简洁,iTween之所以提供了这种略显复杂的重载接口,为的是让使用者可以达到对动画过程的细致控制,就MoveTo而言,除了我们上面提到的目标位置和动画时间之外,还有诸如延迟时间、循环类型甚至回调函数等等参数...,值得一提的是RetrieveArgs,这个函数很长,但是核心内容却很简单:就是一一取出我们之前设定的各个动画参数,譬如time、name等等,没有设定的一些参数则统一设置为默认值。   ...动画还没有完全结束的时候,又新添了一个MoveTo动画,如果不做特殊处理,这种情况肯定会引起冲突,iTween在这里的解决方法是直接去除其中某个冲突动画,这也给我们在iTween使用上提了一个醒,应该尽量避免上面这种存在冲突的动画使用方式

    86220

    python 捕捉和模拟鼠标键盘操作

    pag.scroll(200) 缓动/渐变(Tween / Easing)函数 缓动/渐变函数的作用是让光标的移动更炫。...其中,pyautogui.easeInQuad()函数可以用于moveTo(),moveRel(),dragTo()和dragRel()函数,光标移动呈现先慢后快的效果,整个过程的时间还是和原来一样。...F1…….F12键 ‘volumemute’, ‘volumedown’,‘volumeup’ 有些键盘没有 ‘pause’ PAUSE键 ‘capslock’, ‘numlock’,‘scrolllock...except: print('error') finally: output.close() 总体思路就是遍历所有6位数用户名,如果该用户名已经被人注册了,用户名输入框会变成红色提示,如果没有被人注册...最后我跑了一个中午,找到了两个可以使用的数字,第一个不知道因为什么原因已经被人注册了但是误判为没有被注册,但是第二个数字可以使用,于是我的作业就完成了。

    3.6K20

    图解javascript this指向什么?

    ;   2)point.moveTo函数是用dot(.)进行调用的,即进入“是”分支,即这里的this指向point.moveTo中.之前的对象point。   ...图解point.moveTo函数的this指向什么的解析图如下图所示: ?...那么p2.moveTo(10,10)可解释为:   1)p2.moveTo(10,10)函数调用是用new进行调用的么?这个明显不是,进入“否”分支,即函数是否用dot(.)进行调用?...然后初始化变量,首先初始化函数的形参表,值为 arguments变量中对应的值,如果 arguments变量中没有对应值,则该形参初始化为 undefined。...如果没有,继续初始化该函数内定义的局部变量,需要注意的是此时这些变量初始化为 undefined,其赋值操作在执行环境(ExecutionContext)创建成功后,函数执行时才会执行,这点对于我们理解

    68790

    在函数内定义一个字符数组,用 gets 函数输入字符串的时候,如果输入越界,为什么程序会崩溃?

    在C语言中,使用gets函数输入字符串时,如果输入的字符串长度超过了字符数组的边界,程序可能会崩溃。...这是因为gets函数不会检查输入的字符串长度是否超过了目标数组的容量,这会导致缓冲区溢出(Buffer Overflow)。...这些额外的字符可能会覆盖相邻的变量、函数返回地址或其他重要数据,导致程序行为异常或崩溃。栈溢出:如果字符数组是在栈上分配的,超出数组边界的写操作可能会覆盖栈上的其他数据,包括函数的返回地址。...这种情况下,当函数返回时,程序会尝试跳转到一个无效的地址,从而导致崩溃。...总结使用gets函数时,如果输入的字符串长度超过字符数组的容量,会导致缓冲区溢出,进而可能引起程序崩溃。为了确保程序的安全性和稳定性,建议使用fgets等更安全的函数来替代gets。

    9710

    canvas学习总结三:绘制路径-线段

    基于路径的绘制系统  大多数绘制系统,如:SVG(Scalable Verctor Graphics, 可缩放的矢量图形),Adobe Illustrator等,都是基于路径的, 使用这些绘制系统时,你需要先定义一个路径...lineTo(x,y): 绘制一条从当前位置到指定x以及y位置的直线,如果当前路径中没有子路径,那么这个方法的行为与moveTo()一样。...不是必需的,如果图形是已经闭合了的,即当前点为开始点,该函数什么也不做。...从上面的例子我们可以看出closePath()的位置不同,也会影响我们的图形 注意:当你调用fill()函数时,所有没有闭合的形状都会自动闭合,所以此时closePath()函数不是必须的。...总结 本节内容主要讲解canvas中路径中线性路径的绘制方法,主要是利用 moveTo()定义起点,lineTo()定义终点,stroke()描绘当前路径。

    79810

    VC++6.0入门——第四讲 简单绘图

    文章链接:https://cloud.tencent.com/developer/article/2465870某一天登录远程服务器时,突然没有了登录成功的页面,报错有的时候并不复杂,复杂的是基础知识是否掌握...引出VC++6.0入门——第四讲 简单绘图第四讲 简单绘图本章将剖析MFC消息映射机制,探讨发送给窗口的消息是如何被MFC框架通过窗口句柄映射表和消息映射表来用窗口类的处理函数进行响应的。...加入点击弹窗框架类CMainFrame中加入不生效,需要在CDrawView中加入编写代码,加入一个消息框在头文件中,自动加入了注释宏源文件中加入了宏,加入了消息响应函数的宏划线的实现1鼠标的抬起与放下的事件定义...IDB_BITMAP1);CBrush brush(&bitmap);CClientDC dc(this);dc.FillRect(CRect(m_ptOrigin,point),&brush);空的矩形画笔实现构造函数初始化为...(m_ptOrigin);dc.LineTo(m_ptOld); // 画出一个点// dc.MoveTo(m_ptOrigin); // 线性的扇形dc.MoveTo(m_ptOld); // 画出边线

    9810
    领券