python调用函数详解


一、定义函数与调用函数的顺序

函数被定义后,本身是不会自动执行的,只有在被调用后,函数才会被执行,得到相应的结果。但是在 Python 中我们要注意一个关键点,就是Python不允许前向引用,即在函数定义之前,不允许调用该函数。

例如:

复制代码
print plus(1,2)
def plus(a,b):  
    return a+b  

运行结果为:

复制代码
NameError: name 'plus' is not defined  

从报错结果可以看出,名字为plus的函数还没进行定义(虽然我们是在后面进行了定义)。所以当我们在调用函数时,一定要确定在调用之前进行了函数定义。

二、正确使用参数

我们要在调用函数时,需要正确调用函数的名称和参数

例如我们定义了一个加法函数:

复制代码
def plus(a,b):  
    return a+b  

我们在调用plus()函数时,如果传入的参数类型不对,会报TypeError错误。而且有时我们传入的参数类型不是规定类型的话,就算调用函数运行结果没有报错,也会产生逻辑错误。

例如:

复制代码
# 定义plus函数,作用是求两个正整数之和  
def plus(a,b):  
    return a+b
# 调用plus函数,参数类型为'1','2'  
print(plus('1','2'))  

输出结果:

复制代码
12  

虽然上述例子的程序运行结果没有报错,但是结果却与我们的预期不符,因为我们的本意是调用plus()加粗样式函数实现两个整数的加法。但是如果我们传入的是字符串类型的数值时,结果就是两个字符串的拼接。所以这个例子告诉我们一定要注意传入参数的类型。当我们传入正常类型的参数时,传入的参数个数不一致时,也会报TypeError错误。

例如:

复制代码
# 定义plus函数,作用是求两个正整数之和  
def plus(a,b):  
    return a+b
# 调用plus函数,参数为1,2,3  
print(plus(1,2,3))  

报错:

复制代码
TypeError: plus() takes 2 positional arguments but 3 were given  

报错原因显示,因为plus()函数允许有且仅有2个参数,但是却在调用时传入了3个参数,所以程序报错。

三、函数与函数之间的调用

3.1 第一种情况 程序代码如下:

复制代码
def x(f):  
    def y():  
        print(1)  
    return y
def f():  
    print(2)
x(f)  

运行结果:

复制代码
无结果

分析:因为第9行中的x(f)中的f没有带括号,f只是一个普通的参数,所以程序只调用执行了x(f)函数,没有调用执行f()函数。x(f)函数中虽然也定义了y()函数,但是x(f)函数中没有调用执行y()函数,只是执行了return y。而y变量也没有值,所以整个程序的返回值就为无结果。

3.2 第二种情况 程序代码如下:

复制代码
def x(f):  
    def y():  
        print(1)  
    return y
def f():  
    print(2)
x(f())  

运行结果:

复制代码
2  

分析:因为第9行中的x(f())中的f()带括号,所以程序先调用执行f()函数,先输出2。然后2作为参数传入到x(f)函数中,程序开始调用执行x(f)函数。x(f)函数中虽然也定义了y()函数,但是x(f)函数中没有调用执行y()函数,只是执行了return y。而y变量也没有值,所以调用执行x(f)函数没有产生任何结果。因此该程序最终只输出了2。

3.3 第三种情况 程序代码如下:

复制代码
def x(f):  
    def y():  
        print(1)  
    return y()
def f():  
    print(2)
x(f)  

运行结果:

复制代码
1

分析:因为第9行中的x(f)中的f没有带括号,f只是一个普通的参数,所以程序只调用执行了x(f)函数,没有调用执行f()函数。x(f)函数中也定义了y()函数,并且返回是y()函数。因此程序调用执行了y()函数,输出结果是1。

3.4 第四种情况

复制代码
def x(f):  
    def y():  
        print(1)  
    return y()
def f():  
    print(2)
x(f())

运行结果:

复制代码
2  
1  

分析:因为第9行中的x(f())中的f()带括号,所以程序调用执行了f()函数,先输出2。然后2作为参数传入到x(f)函数中,程序开始调用执行x(f)函数。x(f)函数中也定义了y()函数,并且返回是y()函数。因此程序也调用执行了y()函数,也输出了1。最终该程序先后输出了2和1。

3.5 第五种情况 程序代码如下:

复制代码
def x(f):  
    def y():  
        print(1)  
        print(f())  
    return y()
def f():  
    #print(2)  
    return 2
x(f)  

运行结果:

复制代码
1  
2  

分析:因为第9行中的x(f)中的f没有带括号,f只是一个普通的参数,所以程序只是先调用执行了x(f)函数。在x(f)函数中也定义了y()函数,而且返回值是y()函数,所以程序会调用执行y()函数。在y()函数中先是执行print(1)语句,输出1,接着执行print(f())语句,所以程序在这时也会调用执行f()函数,输出2。最终该程序先后输出了1和2。

好了,今天就介绍到这儿,欢迎点赞收藏!

相关推荐
科技研学社8 分钟前
服装厂激光开袋机与智能模板机怎么选?核心工序设备深度对比与落地实战
数据库·python
心中有你02149 分钟前
C 语言文件操作详解:从写入、追加到读取与定位的完整 实战
c语言·开发语言
小张成长计划..21 分钟前
【Linux】26:线程互斥和同步
java·开发语言
张张123y4 小时前
后端第十四课:Agent 记忆系统(让 Agent 记住上下文和用户,跨会话不健忘)
java·大数据·人工智能·python·agent·记忆
阿里嘎多学长8 小时前
2026-10-20 GitHub 热点项目精选
开发语言·程序员·github·代码托管
happylifetree9 小时前
Python67:核心语法-函数进阶-参数类型(函数作为参数)
python
布吉岛的石头9 小时前
Java 程序员第 50 阶段2:预训练的目标函数:自回归语言建模本质
java·开发语言·人工智能·深度学习·回归·transformer
小羊没烦恼!9 小时前
铁道部新客票系统设计(二)
开发语言·前端·数据库·python·oracle·c#·php
quantdash_cc10 小时前
从实时行情到价格观察表:用 Python 和 Pandas 构建策略输入数据
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
镜子AI10 小时前
镜子AI工程实践:用 Python 做 GEO 实体一致性审计,并自动生成 JSON-LD 结构化数据
人工智能·python·json