Python之函数-作用域和嵌套函数

Python之函数-作用域和嵌套函数

作用域

  • 一个标识符的可见范围,这就是标识符的作用域。一般常说的是变量的作用域
  • 每一个函数都会开辟一个作用域

作用域分类

  • 全局作用域
    • 在整个程序运行环境中都可见
    • 全局作用域中的变量称为全局变量global
  • 局部作用域
    • 在函数、类等内部可见
    • 局部作用域中的变量称为局部变量,其使用范围不能超过其所在局部作用域
    • 也称为本地作用域local

函数嵌套

  • 在一个函数中定义了另外一个函数
  • 内部函数inner不能在外部直接使用,会抛NameError异常,因为它在函数外部不可见。
  • 其实,inner不过就是一个标识符,就是一个函数outer内部定义的变量而已。

作用域:标识符的可见范围

  • 函数开辟了一个作用域,x被限制在当前函数作用域中,对外不可见
  • 全局的,函数外的变量,对内穿透
  • 本地使用标识符,优先使用当前作用域
  • 优先使用本地定义的局部变量,优先原则
def fn():x = 100print(x, '~~~~~~~~~~')# 定义一个函数
x# 直接执行x会提示报错
# 报错内容:NameError: name 'x' is not defined
fn()# 直接执行函数
# 返回结果:100 ~~~~~~~~~~
y = 100 # 定义一个变量y,这个y是global 全局可见
def fn2():c = 1000print(y)print(c)# y在函数外面,是全局变量,在函数内可以调用全局(global)变量
# c只在fn2函数内定义了,函数外不可直接调用,必须通过fn2函数才能调用
fn2()# 返回结果:100
# 返回结果:1000
c# 直接执行c会提示报错,原因是,c只在fn2函数中定义了,global全局中没有定义c
# 报错内容:NameError: name 'c' is not defined

函数嵌套

1. def outer():
2.     o = 65   
3.     def inner(): 
4.         print('in inner', o, chr(o)) 
5.     inner()  
6.     print('in outer', o, chr(o)) 1. # 函数定义后在内存中开辟一块空间存放
2. # 函数outer中定义一个变量
3. # 函数定义后在内存中开辟一块空间存放
4. # inner函数中定义一个print o,inner没有从outer函数中穿透进来,chr(o)='A' 
5. # 在outer函数下调用inner函数
6. # outer函数中定义一个print o,outer中本来就有变了o,chr(o)='A'
outer()# 调用了outer函数,所以inner和outer函数都被调用了
# 返回结果:in inner 65 A
# 返回结果:in outer 65 A
chr(65), chr(97), ord('A'), ord('a')# 调用了outer函数,所以inner和outer函数都被调用了
# 返回结果:('A', 'a', 65, 97)
def outer1():o = 65def inner():o = 97 # 不同语言,表现不一样print('in inner', o, chr(o)) # 'in inner' 97 ainner()print('in outer1', o, chr(o)) # 'in outer1' 65 A
outer1()# 调用了outer1函数,所以inner和outer1函数都被调用了
# 返回结果:in inner 97 a
# 返回结果:in outer1 65 A

在这里插入图片描述

JS风格的函数调用与结果显示。

def outer2():# o = 65def inner():o = 97print('in inner', o, chr(o))inner()print('in outer', o, chr(o))# 定义一个outer2函数
outer2()# 报错原因outer2函数中使用变量o,但是它本身没有变量o,所以报错
# 报错内容:NameError: name 'o' is not defined

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/168412.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python 千题 —— 基础篇】成绩评级

题目描述 题目描述 期末考试结束,请根据同学的分数为该同学评级。 A:90 ~ 100B:80 ~ 89C:70 ~ 79D:60 ~ 69E:0 ~ 60 输入描述 输入同学的分数。 输出描述 输出该同学的等级。 示例 示例 ① 输入&…

张小泉的“老字号”快守不住了:限期整改,业绩和产品各有危机

撰稿|行星 来源|贝多财经 11月8日,商务部等5部门发布了中华老字号的复核结果。结果显示,全国有981家中华老字号企业通过了复核,73家中华老字号企业附条件通过复核,另有55家企业未能通过复核。 贝多财经发现,张小泉股…

Pycharm常用快捷键和替换正则表达式

原生快捷键的使用: 1.CtrlF:查找 2.CtrlZ:返回上一步 3.Alt 鼠标左键选择:多行同时编辑(上、下、左、右键能够移动光标) 按住Ctrl,左键点击,定位光标 编辑过程 URL常用的替换正则表达式&am…

Echarts多条折线图 y轴与实时值提示框数值不一致解决方法:

Echarts多条折线图 y轴与实时值提示框数值不一致解决方法: 删除stack属性即可 stack看官网就是数据堆叠 发现这个bug,特此记录

【数据结构】树与二叉树(十):二叉树的先序遍历(非递归算法NPO)

文章目录 5.2.1 二叉树二叉树性质引理5.1:二叉树中层数为i的结点至多有 2 i 2^i 2i个,其中 i ≥ 0 i \geq 0 i≥0。引理5.2:高度为k的二叉树中至多有 2 k 1 − 1 2^{k1}-1 2k1−1个结点,其中 k ≥ 0 k \geq 0 k≥0。引理5.3&…

【Linux(0)】为什么要学习Linux,为什么互联网公司在招聘时,会提出要有Linux经验,及其使用;一些Linux常见指令

前言 💓作者简介: 加油,旭杏,目前大二,正在学习C,数据结构等👀 💓作者主页:加油,旭杏的主页👀 ⏩本文收录在:再识C进阶的专栏&#x1…

Yum配置、相关命令和常见问题

搭建光盘源 将系统盘读取出来,找到系统盘下存放软件包的目录 2.配置yun仓库 输入命令进入仓库编辑 #必须以.repo结尾 :wq 回车保存退出 3.命令行输入yum repolist 查看yum仓库 配置硬盘源 1.将硬盘源拷贝到目录,或者挂载到目录 2.指定repo文件baseu…

Vue 3 打印解决方案:Vue-Plugin-HiPrint

文章目录 1. Vue-Plugin-HiPrint 简介2. 安装和使用2.1 安装2.2 引入并注册插件2.3 在组件中使用 3. 配置和高级用法4. 示例应用5. 总结 🎉欢迎来到Java学习路线专栏~Vue 3 打印解决方案:Vue-Plugin-HiPrint ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f37…

STM32——NVIC中断优先级管理分析

文章目录 前言一、中断如何响应?NVIC如何分配优先级?二、NVIC中断优先级管理详解三、问题汇总 前言 个人认为本篇文章是我作总结的最好的一篇,用自己的话总结出来清晰易懂,给小白看也能一眼明了,这就是写博客的意义吧…

win 命令替代鼠标的操作

操作方式都是在 winR 输入框输入或者终端输入 1、快速打开 控制面板 运行control 2、快速打开 电源选项 运行powercfg.cpl 3、快速打开 网络连接 运行ncpa.cpl 4、快速打开 程序和功能 运行appwiz.cpl 5、快速打开 Windows Defender防火墙 运行Firewall.cpl 6、快速打开 鼠标 …

Perl语言用多线程爬取商品信息并做可视化处理

首先,我们需要使用Perl的LWP::UserAgent模块来发送HTTP请求。然后,我们可以使用HTML::TreeBuilder模块来解析HTML文档。在这个例子中,我们将使用BeautifulSoup模块来解析HTML文档。 #!/usr/bin/perl use strict; use warnings; use LWP::User…

Python - 利用 OCR 技术提取视频台词、字幕

目录 一.引言 二.视频处理 1.视频样式 2.视频截取 ◆ 裁切降帧 ◆ 处理效果 3.视频分段 三.OCR 处理 1.视频帧处理 2.文本识别结果 3.后续工作与优化 ◆ 识别去重 ◆ 多线程提效 ◆ 片头片尾优化 四.总结 一.引言 视频经常会配套对应的台词或者字幕&#xff0c…