Python 函数声明先后顺序的问题!

Python的列表等变量的声明必须要在函数定义与函数调用之前 源代码—–这个代码作用是调用Linux应用终端操作来实现计算,并把计算结果取出来,组成相似矩阵,有五组值也就是有五组相似矩阵,这个是我做蛋白质结构预测用到的,自己写的,分享出来给大家,如有疑惑,欢迎评论区交流。# 此代码主要为说明问题,后面我会贴上完整代码以及数据。 def cal_simi(n): file = os.popen('cd '+path[n-1]+';ls').readlin 阅读详情
AI摘要

本文探讨了Python中函数调用的顺序问题,特别是在函数定义与调用不在同一位置时可能出现的错误。通过实例说明了解释器如何解析代码,并提出了最佳实践。

在 Python 中如果把函数定义写在调用的下方可能会出错,例如下面的代码

foo()
def foo():      print("hello")

执行时会报出错误

Python资源共享群:484031800

NameError: name 'foo' is not defined

这时候要把 foo() 调用代码放到该函数的声明后面

def foo():      print("hello")
foo()

这样执行就一切正常了。这仿佛像是 C 语言中的函数调用需要提前声明一般,例如在 C 语言中要调用后头的定义的函数要写成

void foo();
 
int main() {
    foo();
}
 
void foo() {
    printf("Hello");
}

实际上 Python 中并不存在函数提前声明一说,也不能像 Java 那样函数可以写在任意位置,因为 Java 是编译型的语言,Python 是解释型的。

而且也不是一定要求被调用的函数一定要在源代码层面上定义在调用者前方。

Python 中函数声明的顺序据我理解有两条规则

  1. Python 源代码是由上往下解析的
  2. 找到程序入口(未包含在函数中的代码) 即开始执行,执行到的函数未被先行解释到即报错

分析下面两段代码

def foo():
    bar()
 
if __name__ == '__main__':
    foo()
 
def bar():
    print("hello")

Python 从第 1 行一直解析到第 4 行的入口,进而往回跳,调用到第 1 行的 foo() 函数,而其中的 bar() 函数还未及被解析到,所以会提示

NameError: name 'bar' is not define

如果把程序入口往后调

def foo():
    bar()
 
def bar():
    print("hello")
 
if __name__ == '__main__':
    foo()

上面代码执行无误,输出

hello

foo() 调用的 bar() 不也是在它下方声明的吗?所以这一点与 C 是有区别的。

这时候的理解是这样的,Python 从第 1 行自上往下解析到第 7 行的程序入口时,foo() 并未实际调用 bar(),但 foo() 和 bar() 函数都已解析到了,所以回过头来 foo() 与 bar() 之间怎么调用都无妨。

因此, 最好的实践方法就是把程序的入口放到代码的最下方,那么它前面的函数不管如何的声明顺序都没有关系 。 

FCKeditor 2.6.4 php版本任意文件上传——漏洞复现 一、漏洞描述 FCKeditor是目前最优秀的可见即可得网页编辑器之一,它采用JavaScript编写。具备功能强大、配置容易、跨浏览器、支持多种编程语言、开源等特点。它非常流行,互联网上很容易找到相关技术文档,国内许多Web项目和大型网站均采用了FCKeditor。 Fckeditor 低于 2.6.4 php 版本任意文件上传漏洞,当您的PHP环境配置为 GPC = Off 时可绕过currentfolder参数过滤上传脚本木马控制网站服务器 二、漏洞原理 漏洞版本:<=2.6.4 三、环境搭建 阅读详情

相关推荐

agv调度系统3.0技术介绍

agv调度系统,穿梭车调度系统,调度系统技术介绍,教你做调度

持续分享调度系统开发过程 4869

python函数的定义必须在调用前面(函数调用函数例外)

在这种情况下,被调用的函数可以在调用函数的后面定义,因为解释器会在执行到调用函数的语句时才会去找调用函数的定义。这种情况下,被调用函数的定义可以在调用函数的后面。这是因为Python解释器是按照从上到下的顺序执行代码的,当解释器遇到函数调用时,它必须已经知道该函数是如何定义的。如果在函数调用之前定义函数,解释器就可以找到并执行函数。但是,如果在函数调用之前没有定义函数,解释器就无法找到函数的定义,会抛出一个NameError的异常。因此,函数调用函数的情况下,被调用函数的定义可以在调用函数的后面。

weixin_74798055的博客 2609

自动化学报latex模板——ctex2.4.6和ctex2.9.2直接使用步骤

自动化学报latex模板——ctex2.4.6和ctex2.9.2直接使用步骤 1.背景及问题 最近在使用自动化学报latex模板写作业时,一只对latex搞不清楚,网上关于各种版本的latex下载了一堆(比如ctex中文套装方案的各个版本及texlive+texstudio方案,中间还升级了miktex,windet等),发现都未能成功编译出来自动化学报的latex模板,反正开始头很大!!!最后终于没忍住打开了: 自动化学报官网下载模板链接,因为我就要用latex模板(不能服输!)找到的解决方案是:使用

QIANFANGshiwo的博客 7712

python中函数调用

和C++一样,Python中函数的定义必须在调用的前面, 但是在函数的内部调用一个函数,不用考虑函数的顺序,只要被调用的函数被定义了即可 1.先定义后,后调用为一般方法: def add_test(a,b): return a+b reslut = add_test(1,2) print(result) 2.可以在函数内部调用后面的函数 def add_1(a,b): return add_2(a,b) #函数内部调用add_2 def add_2(...

catofblack的博客 7784

RTX 5090配Ubuntu 24.04踩坑记:手把手搞定OpenVLA-OFT环境(附版本避坑清单)

本文详细记录了在RTX 5090显卡和Ubuntu 24.04系统上部署OpenVLA-OFT环境的完整过程,包括驱动安装、CUDA配置、PyTorch版本选择等关键步骤。提供了经过验证的版本组合清单和常见错误解决方案,帮助开发者高效搭建AI开发环境。

weixin_30342209的博客 467

Linkage Mapper 输出文件夹结构解析——LCPs(栅格廊道)、LinkagePaths(矢量廊道)、Nodes(节点)

Linkage Mapper输出文件解析摘要 Linkage Mapper是生态连通性分析的重要工具,通过最小累积阻力模型(MCR)识别物种迁移廊道。其输出包含三类核心文件: LCPs(栅格廊道):存储累积阻力值的栅格数据,直观展示低阻力路径,适用于空间分析和廊道质量评估。 LinkagePaths(矢量廊道):以矢量线状要素精确记录廊道位置和走向,便于地图可视化及连通性分析。 Nodes(节点):标记廊道关键点(起点/终点/交汇点),为保护策略制定提供依据。 典型应用场景包括: 山地物种(如大熊猫)栖息地

走向CTO的路上... 1334

python的类方法、写在前面可以调用后面的吗_python3.6里,super()的问题,为什么子类调用父类的方法时,super需要在后面加一个()?...

扩展类继承自基类的一个方法行为,然后如果想要把基类的这个行为重新执行一遍,在自己的这个行为前面加上基类的引用,super后面为啥要加一个括号呢?直接写super.working()就报错了。。而且,这里写基类的名字,Employee().working()也会报错。。只能用super().working(),为啥啊。。代码如下:class Employee:def __init__(self,na...

weixin_39795268的博客 560

FPGA/IC秋招经典100题(含详解)

FPGA/IC秋招笔试面试经典100题(含答案及详解),持续更新。。。

Crazzy_M的博客 1万+

python编程 函数的定义、调用

python编程 函数的定义、调用

m0_56051805的博客 1001

深度学习(五)迁移学习(实战:新数据预测+vgg16和聚类预测)

6、成功引入PCA数据降维技术,剔除了数据中的噪音信息、降低了模型复杂度、减少了模型训练时间,并最终提高了模型表现;gen=datagen.flow_from_directory(path,target_size=(224,224),batch_size=2,save_to_dir=dst_path,save_prefix='gen',save_format='jpg') # 生成图片大小224*224,bs产生多少组图像,存储路径和前缀。1、通过使用新数据,实现了模型的2次训练,达到了较好的预测效果;

weixin_37699342的博客 775

RK3588网卡出现丢包或者带宽不足的问题验证排查

注意除了有最大的TCP数据接收缓冲,还有/proc/sys/net/core/wmem_max — 最大的TCP数据发送缓冲可以调整,这里暂时没用到,针对具体需要可适当调整。比如把ethx接口中断从默认的cpu0迁移到其它cpu,例如将eth0中断234移到cpu7 (10是16进制, cpu0 =3588的cpu有8个核,4个A55(小核)+4个A76(大核),可以找到对应中断 将中断从默认cpu0核切到cpu7。tcp_rmem:单位是字节,接收缓存区大小,缓存从对端接收的数据,后续会被应用程序读取。

Android/Linux驱动开发传帮带学习,让驱动入门门槛更低! 2030

python入口函数_Python 函数声明先后顺序的问题!

在 Python 中如果把函数定义写在调用的下方可能会出错,例如下面的代码foo() def foo(): print("hello") 执行时会报出错误Python资源共享群:484031800NameError: name 'foo' is not defined 这时候要把 foo() 调用代码放到该函数的声明后面def foo(): print("hello") foo...

weixin_42417004的博客 197

使用 Simulink + Simscape Electrical 实现一个三相半控桥式整流器的仿真模型

本文详细介绍了使用Simulink搭建三相半控桥式整流器仿真模型的方法。主要内容包括系统结构设计、建模步骤(从创建项目到参数配置)、移相触发控制的实现,以及阻感负载下的动态响应分析。通过合理设置三相电源、整流器模块、触发控制和测量模块,实现了输出电压和电流波形的仿真观测。文章还提供了优化建议,如添加滤波器、实时控制等改进方向,为电力电子变换器的仿真研究和性能优化提供了实用指导。

amy_mhd的博客 141

python define function的顺序_Python 函数声明先后顺序的问题!

在 Python 中如果把函数定义写在调用的下方可能会出错,例如下面的代码foo()def foo(): print("hello")执行时会报出错误Python资源共享群:484031800NameError: name 'foo' is not defined这时候要把 foo() 调用代码放到该函数的声明后面def foo(): print("hello")foo()这样...

weixin_39542608的博客 359

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

python人物出场顺序_解决Python 函数声明先后顺序出现的问题

在 Python 中如果把函数定义写在调用的下方可能会出错,例如下面的代码foo()def foo():print("hello")执行时会报出错误NameError: name 'foo' is not defined这时候要把 foo() 调用代码放到该函数的声明后面def foo():print("hello")foo()这样执行就一切正常了。这仿佛像是 C 语言中的函数调用需要提前声明一般...

weixin_36259939的博客 372

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

python的函数需要声明么_python基础教程解决Python 函数声明先后顺序出现的问题...

在 Python 中如果把函数定义写在调用的下方可能会出错,例如下面的代码foo()def foo():print("hello")执行时会报出错误NameError: name 'foo' is not defined这时候要把 foo() 调用代码放到该函数的声明后面def foo():print("hello")foo()这样执行就一切正常了。这仿佛像是 C 语言中的函数调用需要提前声明一般...

weixin_39957068的博客 1063

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

python define function的顺序_解决Python 函数声明先后顺序出现的问题

在 Python 中如果把函数定义写在调用的下方可能会出错,例如下面的代码foo()def foo():print("hello")执行时会报出错误NameError: name 'foo' is not defined这时候要把 foo() 调用代码放到该函数的声明后面def foo():print("hello")foo()这样执行就一切正常了。这仿佛像是 C 语言中的函数调用需要提前声明一般...

weixin_39785165的博客 132

python函数的声明和调用_解决Python 函数声明先后顺序出现的问题

在 Python 中如果把函数定义写在调用的下方可能会出错,例如下面的代码1234foo()def foo():print("hello")执行时会报出错误NameError: name 'foo' is not defined这时候要把 foo() 调用代码放到该函数的声明后面1234def foo():print("hello")foo()这样执行就一切正常了。这仿佛像是 C 语言中的函数调用...

weixin_39539684的博客 667

Python 函数声明先后顺序的问题

在 Python 中如果把函数定义写在调用的下方可能会出错,例如下面的代码 foo() def foo(): print("hello") 执行时会报出错误 NameError: name 'foo' is not defined 这时候要把foo()调用代码放到该函数的声明后面 def foo(): print("hello") foo() 这样执...

一叶不知秋 2700

python define function的顺序_Python 函数声明先后顺序的问题

在 Python 中如果把函数定义写在调用的下方可能会出错,例如下面的代码foo()def foo():print("hello")执行时会报出错误NameError: name 'foo' is not defined这时候要把 foo() 调用代码放到该函数的声明后面def foo():print("hello")foo()这样执行就一切正常了。这仿佛像是 C 语言中的函数调用需要提前声明一般...

weixin_39789101的博客 365

Python的函数声明

目录 一、创建函数:def 二、函数返回值:return 三、局部变量和全局变量 1、局部变量和全局变量 2、同名变量的遮蔽 3、global关键字 四、默认参数 一、创建函数:def 语法:def 函数名(参数1,参数2,...,参数n): 语句 ●函数中所有的语句都应具有相同的缩进位 ●函数中可以有任意个参数,也可以没有参数 ●可以用pass关键字来创建空函数,例: def nothing(): pass 二、函数返回值:return ●函数可以没...

xcxhzjl的博客 7416

110道Python面试题(真题),建议收藏!

允许变量的值发生变化,即如果对变量进行append、+=等这种操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址也不会变化,不过对于相同的值的不同对象,在内存中则会存在不同的对象,即每个对象都有自己的地址,相当于内存中对于同值的对象保存了多份,这里不存在引用计数,是实实在在的对象。当使用del删除变量指向的对象时,如果对象的引用计数不为1,比如3,那么此时只会让这个引用计数减1,即变为2,当再次调用del时,变为1,如果再调用1次del,此时会真的把对象进行删除。

python03011的博客 2万+

python面试常见问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.youkuaiyun.com/weixin_55579895/article/details/121350484 收起 目录 1-10 11-20 21-30 31-40 41-50 1-10 1、一行代码实现1–100之和 # 1、一行代码实现1--100之和 sum(range(1,101)) 1 2 3 2、如何在一个函数内部修改全局变量 # 2、如何在一个函数内部

qq_18898965的博客 667

python 小数相乘_2020年96道最新python面试题(上)建议收藏!一举通过面试!

让你最短时间内掌握核心知识点,一举通过Python 面试!当你发现这些题你差不多都能回答上来,那说明你的水平已经可以去面试工作了。1、一行代码实现1--100之和利用sum()函数求和2、如何在一个函数内部修改全局变量利用global在函数声明 修改全局变量3、列出5个python标准库os:提供了不少与操作系统相关联的函数sys: 通常用于命令行参数re: 正则匹配math: 数学运算datet...

weixin_36441329的博客 295
上一篇: 使用 Python 处理 JSON 格式的数据!
下一篇: Windows文件名非用反斜杠?Python帮你解决这个麻烦!
普通网友
博客等级 码龄7年 438粉丝 263原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值