Python主函数如何调用函数 主函数想要去调用那个函数, 方法里就有直接调用的这种, 还有通过模块去调用的那种, 或者使用类的方法进行调用的方式。在这些种种方式当中, 直接调用函数是最常见而且也是最简单的一种路数。当你身处主函数的位置时, 你可以直接去向那些已经被定义好了的函数发起调用, 同时还要把必要的参数传递过去, 以此来完成操作。借助于此种手段, 你就可以实现在程序不同部分之间共享代码以及功能的目的, 这样的做法能够有效地提高代码在阅读时的清晰度以及在后期维护时的便利性。接下来我们将对这种方法展开极为详细的介绍性说明工作。直接调用函数的方式, 指的是在主函数内部, 使用函数名称紧跟括号的形式来实现已定义函数的调用。举例来说, 要是你存在一个名为add的函数, 你就可以在主函数里面利用add(a, b)这个写法去把它调出来执行。这种方式的优点是过程非常简单而且清晰明了, 能够适合大多数的实际应用场景, 下面是相关的简单示例:def add(a, b):return a bdef mn():result add(3, 4)print(fThe result is: {result})if __name__ __main__:main()在这个例子中, add函数是被定义为用于计算两个参数相加的结果的一个函数, 而在主函数main里面呢, 就直接对add函数进行了调用, 并且还传递了两个具体的参数过来, 一个是3, 另一个是4, 最终得到的输出结果为7。一、不用犹豫, 直接把那个函数给调用起来就行。直接在主函数里面, 用函数名加上括号这种样子, 去直接调用已经定义好的函数。这种做法是最常见的。这样做也可以让程序的不同部分之间共享代码还有功能, 从而把代码的可读性提高, 还能够把可维护性也提升。1.对简单函数进行定义, 并且对简单函数进行调用。在中, 定义一个函数很简单, 只需要使用def关键字即可。下面是一个简单的例子:def greet(name):return fHello, {name}!def main():message greet(Alice)print(message)if __name__ __main__:main()在这个例子里, 我们定义了一个叫作greet的函数。这个函数接收一个参数name。它会返回一个问候的字符串。在main这个主函数里面, 我们调用了greet函数。我们把Alice作为参数传给它。最后输出的结果是Hello, Alice!。1.2 带有默认参数的函数函数的这个部分, 还是能够去带上有一些默认的参数的存在, 这样的话, 在调用这个函数的时候, 某些参数是可以直接省去的, 请看下面这段代码, 它就是一个例子, 里面就带有了这样的默认情况。def greet(name, greetingHello):return f{greeting}, {name}!def main():message1 greet(Alice)message2 greet(Bob, Hi)print(message1)print(message2)if __name__ __main__:main()在如今所展示的这个示例里面, greet这个函数它自身是拥有着两个参数的, 而在这两个参数之中的某一个参数, 它是被设定为拥有着一个默认值的, 并且这个数值就是Hello。接下来在主函数这里, 我们是对其进行了两次分别的调用操作的。第一次调用的时候, 我们只给它传递了一个参数。而第二次调用的时候, 则是给它传递了两个参数。经过这一系列过程以后, 最终产生的输出结果分别是两个片段。其中的第一个片段内容是Hello, Alice!。而另一个片段的內容则是Hi,Bob!二、通过模块调用函数模块就是那种包含了定义以及语句的文件的东西。在这个文件里面, 它可以定义一些函数、类和变量, 同时模块中也可以包含那些可以被执行起来的代码内容是通过使用模块来调用函数的, 这个过程的具体做法是这样的, 首先要把函数写在某个模块的里面, 然后, 接下来就是在你的主程序当中去把这个模块给导入进去, 接着再去运行并调用放在那个模块里面的具体函数, 这种办法在编程操作中是比较有利的, 因为它可以帮助人们对写出来的代码进行合理的组织安排, 并且能够重复地利用已经实现好的功能部分。2.首先, 我们需要完成创建与导入模块这一系列操作。首先, 我们要去搞一个事情, 就是创建一个文件, 这个文件的后缀名是.py, 这个文件在专业的说法里边叫做模块文件, 创建好了这个文件之后, 我们马上要在里面定义一个叫函数的东西。# mymodule.pydef multiply(a, b):return a * b接下来, 需要在主程序当中把这个模块给进行导入, 并且要对其中所包括的函数加以调用。# main.pyimport mymoduledef main():result mymodule.multiply(3, 4)print(fThe result is: {result})if __name__ __main__:main()在这个例子里面, 我们是在一个叫做.py的这个模块文件的内部, 去定义了一个特定的函数名称, 同时在那些主程序也就是main.py这个文件里, 把这个模块进行了导入操作, 并且对之前说的那个函数调用了它, 最后所产生的输出结果数字是12。2.第二步, 是使用从某个特定的路径或者位置进行导入的操作语句。除了采用语句来导入整个模块以外, 我们也可以从使用 from… 语句这个角度出发去获取特定函数或者变量。这样一来, 对函数进行调用的时候在语法方面就会得到简化。接下来下面是一个例子:# mymodule.pydef multiply(a, b):return a * b# main.pyfrom mymodule import multiplydef main():result multiply(3, 4)print(fThe result is: {result})if __name__ __main__:main()在这个例子里面, 我们是采取了一种方式, 就是直接导入了那个函数, 用的就是 from 语句。然后, 等到在主程序里面去调用这个函数的时候, 就不需要再使用模块名作为前缀了。就这么一来二去的, 最终输出的结果就变成了12。三、可以通过使用类的方式来对函数进行调用。在面向对象这种编程的方式里头, 函数通常是以类的一个方法的形式存在的状况之下, 人们通过创建类的具体实例这一操作, 是可以去调用这些方法的这种做法的话, 使用类的这种方法来调用函数的这种动作的话, 是能够帮助把数据和行为给封装在一起的这一效果的表现之下是能够提高代码的那种可阅读性或者是可维护性的程度的。3.1, 去给类里面的办法进行定义以及去完成对它的调用这个操作。第一步的时候, 我们会去定义一个类别在里面, 接着, 要在这个类别的内部去定义出来一个执行任务的函数过程。class Calculator:def add(self, a, b):return a b接着之后, 要在主程序里面去弄出一个类的实例出来, 并且把这个实例当工具使, 调用它里面的那些方法。def main():calc Calculator()result calc.add(3, 4)print(fThe result is: {result})if __name__ __main__:main()在这样一个特定的情形里面, 我们规定了一个名字叫作那个名字的类这种东西, 并且在那个类的内部又定义了一个名字叫做add的一个方法, 之后就是在主要的那个运行函数当中, 我们又新建了一个这个类所对应的实例化对象calc, 紧接着又去调用了calc.add这样一个调用过程, 到了最后一步的时候输出出来的结果就是数字7这么一个值。3.2 类的方法与静态方法除了那些需要跟对象实例绑定在一起的实例方法之外, 类也还可以去定义所谓的静态方法, 这些个静态方法压根儿就不依赖于类的具体实例对象是什么样子的, 开发者能够直接就着类别名把这个静态方法给调用了呢, 接下来我就用一个具体的例子来给大家做一番展示说明:class Math:staticmethoddef subtract(a, b):return a - b在主程序当中, 我们直接通过那个类来调用那个静态的方法。def main():result Math.subtract(7, 4)print(fThe result is: {result})if __name__ __main__:main()在这个实例里面, 我们给这个叫做Math的那个类进行了定义, 然后呢, 在该类内部的代码块中又声明了一个具有静态特性的函数功能, 等到来到主程序入口函数运行的时候, 我们就采取了直接用Math后边加个点的方式去触发了那个静态的函数能力, 最后得到的结果显示值是3。四、调用函数的时候, 可以采用的是闭包的方式, 也可以是采用的装饰器的方式。闭和装饰器属于编程里的比较高级的功能, 借助着它们能够让代码变得更具灵活性, 同时也能增强代码在各个不同场景下的复用能力, 所谓闭包, 指的其实就是把另外一个函数定义在了某个函数的内部, 而那个被定义在内部的函数, 则具备去访问外部那个所属函数所拥有的变量这样一种能力, 至于说装饰器, 它则是闭包当中的一种特别的类型存在, 并且它的功能在于能够起到扩展其他现有函数所具有的功能的作用。4.第一步, 先把闭包给弄出来, 第二步之后再去把那个函数给调用起来。闭包是在函数内部定义的函数, 这个内部的函数能够访问其外部的函数的变量, 下面是一个简单的闭包的例子:def outer_function(x):def inner_function(y):return x yreturn inner_functiondef main():add_five outer_function(5)result add_five(3)print(fThe result is: {result})if __name__ __main__:main()在这个例子当中, 返回的是一个内部函数, 这个内部函数是可以访问到参数x的, 在主函数当中, 我们进行了调用, 并且将参数5传递了进去, 被返回的那个函数最终是存储到了一个变量里面的, 后来我们再对它进行调用, 传入了参数3这样的操作之后, 最终的输出结果就是数字8了。4.2, 是使用装饰器来调用函数, 这一操作。所谓装饰器, 其实就是一种特殊的闭包。它的主要作用是用来扩展函数的功能。下面是一个简单的例子。def my_decorator(func):def wrapper():print(Something is happening before the function is called.)func()print(Something is happening after the function is called.)return wrappermy_decoratordef say_hello():print(Hello!)def main():say_hello()if __name__ __main__:main()在这个示例里, 我们规定了一个装饰器, 该装饰器会接收一个函数当作参数, 然后返回另一个被包装的函数。在调用那个被装饰的函数的之前阶段和之后阶段, 它会分别打印一些相关的消息信息, 通过这个符号语法形式, 我们把函数给进行了装饰处理, 在主要函数里面进行函数调用的时刻, 就会先去执行那些写在了装饰器里面的代码逻辑部分, 最终所呈现出来的输出结果具体如下。Something is happening before the function is called.Hello!Something is happening after the function is called.五、通过不断地调用函数自己来进行递归操作。递归是一种在函数内部调用自身的一种编程技巧。递归函数通常包含一个或多个基准条件, 是为了防止出现无限递归的情况。递归在解决某些问题时非常的有效果, 特别是那些问题, 它们可以被分解成更小的、相同类型的问题。5.1 简单的递归例子下面提供一个用于进行阶乘计算的, 利用递归方法来实现的函数的一个具体示例。def factorial(n):if n 0:return 1else:return n * factorial(n - 1)def main():result factorial(5)print(fThe result is: {result})if __name__ __main__:main()在这个案例里, 那个函数是靠着自己调用自己来搞定阶乘计算的。要是n等于0的话, 它就返回1, 这是基准条件。要是n不等于0的话, 它就返回n乘以比n小1的那个数。在主函数里面, 我们调用了这个函数, 并且把参数5传了进去。最后输出的结果是120。5.对于递归这一种调用方式, 我们需要去对它的深度加以限制。因为担心无限递归会引起栈溢出的问题, 所以默认会对递归的深度进行限制。如果想要修改这个限制, 可以使用sys模块来做。接下来就是一个关于如何修改递归深度限制的范例展示:import syssys.setrecursionlimit(2000)def factorial(n):if n 0:return 1else:return n * factorial(n - 1)def main():result factorial(1500)print(fThe result is: {result})if __name__ __main__:main()在这个例子里面, 我们使用了sys.(2000)这个操作, 把递归深度限制设置成了两千, 紧接着就去计算一千五百的阶乘了。大家千万要注意, 递归的深度如果搞得太大, 就会导致性能方面的问题, 所以这一步应该非常谨慎的使用。六、通过生成器调用函数生成器是属于迭代器之中的一种特殊类型的东西, 它的作用是用来生成一系列的取值。当你在编写这种生成器函数的时候, 会使用yield这个关键字, 而且不是使用关键字来把得到的结果返回回去。因为这个生成器是在需要的时候才去生成对应的数值, 并不是在一开始就一次性地把所有值全都生成完毕, 所以它就大大提高了对于内存空间利用的效率。6.首先明确一下生成器函数的基本定义方式, 然后再去执行对该调用操作。这是一个用来生成器函数的简单例子。def count_up_to(max):count 1while count max:yield countcount 1def main():for number in count_up_to(5):print(number)if __name__ __main__:main()在这个例子里面, 有一个东西叫作函数, 具体来说, 它是一个生成器类型的函数, 这个函数的具体操作方式是用到了yield这个关键的词语, 它的作用就是为了把从1一直到最大值max的这些数值一个一个地给生成出来, 我们在主要的那个函数体部分当中, 采用了for这种循环结构的代码方式来对前面说到的那个生成器进行遍历取值这样的动作, 并且每拿到一个值之后就立刻把它打印显示出来, 最后所呈现出来的最终输出结果则是:123456.这是第2点, 内容是要去使用那种生成器的表达方式。生成器表达式这个说法呢, 它其实就是一种用来描述生成器的比较简洁的语法表现形式。这种形式和列表推导式是有点像的。下面咱们来看一下是一个什么样的关于生成器表达式的具体的例子:def main():squares (x * x for x in range(5))for square in squares:print(square)if __name__ __main__:main()在这个例子里面, 大家是用那个叫做生成器表达式的东西, 写成x * x for x in range(5)这种形式, 来生成出一堆的平方值的。然后在主函数的那个位置, 大家是使用for循环这一种方式来遍历这个生成器, 最后把每一个平方值都进行打印操作一下, 最终出来的结果是:01234七、可以通过采用多线程的方式, 同时还可以借助于多进程的方式来进行函数的调用操作。在有些场合, 大家得同时好多个活儿一块儿干, 于是乎就给弄出了多线程支持多进程支持这两个玩意儿, 为的就是让大家能并发着去执行那堆事, 要是碰上了那些个老在那儿做输入输出操作的活计, 也就是所谓的I/O密集型任务呢, 那就用线程来搞定, 可要是碰上那些个老在那儿死算数玩命占处理器资源的活计, 也就是所谓的CPU密集型任务时, 那就还是得多进程上阵才好。7.我们可以采取使用多个线程来共同调用相应函数的做法。在下面这个部分, 有一个通过运用模块来达成多线程操作的案例, 该情况如下所述:import threadingdef print_numbers():for i in range(5):print(i)def main():thread threading.Thread(targetprint_numbers)thread.start()thread.join()if __name__ __main__:main()在这个例子里面, 我们把一个叫作的函数给定义了下来, 并且通过使用某个方法创建好了一个线程用来去把那个函数给执行了。之后呢, 我们在主函数那边把线程也给启动了, 然后等着那个线程结束, 最后得到的输出结果是:012347.第2步, 使用多进程的方式来调用相关函数。下面是这样一个情形, 在这个情形里大家使用模块来实现多进程的过程, 这里给出一个具体的例子。import multiprocessingdef print_numbers():for i in range(5):print(i)def main():process multiprocessing.Process(targetprint_numbers)process.start()process.join()if __name__ __main__:main()在这个例子当中, 我们定义了一个叫做该函数的函数, 然后, 使用那个点号来创建一个进程, 目的就是让这个进程去执行这一套代码。之后, 就是在主程序里面去把这个进程给启动起来, 同时还在等着这个进程跑完, 最后得到的输出结果是:01234八、通过去调用那个函数, 而且采用的是异步的那种方式。异步编程这种用来处理并发任务的手段, 其实是一种属于编程范式的范畴。它特别适合拿去做那些输入输出密集型的任务。在这个体系里, 专门提供了模块来给异步编程进行支持。只要你通过异步去调用函数, 那么在任务等待那个输入输出操作完成的空隙里, 你就可以同时去执行其他的一些任务了。这样做, 自然而然就能起到提高整个程序运行效率的效果。8.1 定义和调用异步函数下面是一个使用模块实现异步调用函数的例子import asyncioasync def print_numbers():for i in range(5):print(i)await asyncio.sleep(1)async def main():await print_numbers()if __name__ __main__:asyncio.run(main())在这个案例之中, 我们进行了一个异步函数的定义处理工作, 该函数在运行过程中使用了 await .sleep(1) 这个操作来模拟异步 I/O 操作环节的存在状况。与此同时, 在主函数内部的代码编写里面, 我们调用了之前定义的函数, 并且在调用环节应用了 await 这一关键字来进行辅助说明。然后我们还进一步使用了.run 这个方法去对主函数进行整体的运行操作, 最终得到的输出结果为数字以每秒一次的频率被持续输出的情形。012348.可以同时执行好几个异步工作, 让它们在两个并发状态下一起运行。该模块还具备支持同时执行多个异步任务的能力, 以下是一个具体的示例。import asyncioasync def print_numbers():for i in range(5):print(i)await asyncio.sleep(1)async def print_letters():for letter in abcde:print(letter)await asyncio.sleep(1)async def main():task1 asyncio.create_task(print_numbers())task2 asyncio.create_task(print_letters())await task1await task2if __name__ __main__:asyncio.run(main())在本例中, 我们创建了两个异步函数, 并调用它们的特定方法来生成了两个任务项目。然后我们在主程序代码里使用await这个关键字去等待那两个任务全部干完。最后结果显示出来的是数字和字母交叉出现的状态。0a1b2c3d4e九、就是利用回调函数来进行调用。回调函数是一种函数, 这个函数会被当作参数传递给了另外一个函数去使用, 并且在特定的事件发生的时候, 或者在特定的条件被满足的时候, 它就会进行调用, 这种回调函数的存在, 使得它在异步编程的这个领域当中得到广泛的使用, 同时它也使得自己在事件驱动编程的这个领域中能够被广泛应用。9.第一步是给出关于回调函数的具体定义, 接着是对其进行实际调用。下面给出一个采用回调函数来实现相关功能的示例, 具体做法如下:def process相关问答FAQs如何在中定义主函数在代码里头, 主函数一般是一个名叫main()的函数, 可以通过定义这个函数, 并且在文件的末尾加上if 这样的判断条件, 来保证当脚本被直接运行的时候, 它能够被执行, 示例代码如下:def main():print(这是主函数)if __name__ __main__:main()如何在主函数中调用其他函数在主函数里头, 大家能够直接去调用那些已经定义好的其他函数。做法挺简单的, 只要在主函数的代码块里面写上那个函数的名字就行了。举个例子吧, 假如你有一个被命名为greet()的函数, 那么你可以在main()这个函数里面把它给调用起来:def greet():print(你好欢迎使用Python)def main():greet()if __name__ __main__:main()在调用函数的过程当中, 应该使用一种什么方法来将参数传递进去呢。在程序中, 当调用一个函数的时候, 可以向它传递相应的参数。至于定义函数这个环节, 可以在括号里面指定具体的参数名称, 到了实际调用的时候, 再将对于的值传进去就完事了。比如说:def add(a, b):return a bdef main():result add(5, 3)print(f两个数的和是: {result})if __name__ __main__:main()通过这种方式, 可以灵活地在主函数中调用其他函数, 传递需要的参数, 并获取返回值。