2024-8.python作用域+函数其他

变量的作用域

  • 讲到了函数就必须介绍变量的作用域相关。

    • 作用域指的是变量的有效范围。变量并不是在哪个位置都可以访问的,访问权限取决于这个变量是在哪里赋值的,也就是在哪个作用域内赋的值。变量在哪个作用域内赋值,则表示该变量的作用域就是该区域,变量只可以在其作用域指定区域被访问。
  • 通常而言,在编程语言中,变量的作用域从代码结构形式来看,有块级、函数、类、模块、包等由小到大的级别。但是在Python中,没有块级作用域,也就是类似if语句块、for语句块、while语句块,with上下文管理器等等是不存在作用域概念的,他们等同于普通的语句。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 核心:

    • 通常,函数内部的变量无法被函数外部访问,但内部可以访问;类内部的变量无法被外部访问,但类的内部可以。通俗来讲,就是内部代码可以访问外部变量,而外部代码通常无法访问内部变量。

    • age = 10
      def func():
          name = 'bobo'
          print(age,name)#函数内部可以访问外部变量
      func()
      print(name) #在函数外部是无法访问函数内部变量
      
    • def outer():
          def inner():
              print('i am inner')
          inner() #在函数内部可以调用inner
          return inner
      
      inner() #在函数外部不可以调用inner,因为超出了inner的作用域
      
全局变量和局部变量
  • 局部变量

    • 定义在函数内部的变量拥有一个局部作用域,被叫做局部变量
  • 全局变量

    • 定义在函数外的拥有全局作用域的变量,被称为全局变量。(类、模块等同理)
num = 123 #全局变量
def func():
    email = 'www.123.com' #局部变量
    print(email,num)
func()
#全局变量在全局区域都可以被访问
  • 注意:
    • 所谓的局部变量是相对的。局部变量也有可能是更小范围内的变量的外部变量。
a = 1 #全局变量
def func():
    b = 2 #局部变量
    print(a) #全局变量可以在全局区域被访问

    def inner():
        c = 3 #更局部的变量
        print(a)
        print(b)
        print(c)
    return inner
result = func()
result()
global关键字
  • 先来看一个例子

  • total = 0 #全局变量
    def plus(arg1,arg2):
        total = arg1 + arg2
        print('函数内的局部变量total=',total)
        print('函数内的total的地址是:',id(total))
        return total
    plus(10,20)
    print('函数外部全局变量total=',total)
    print('函数外部变量total的地址:',id(total))
    
  • 很明显,函数plus内部通过total = arg1 + arg2语句,新建了一个局部变量total,它和外面的全局变量total是两码事。而如果我们,想要在函数内部修改外面的全局变量total呢?使用global关键字!

  • global:

    • 指定当前变量使用外部的全局变量
  • total = 0 #全局变量
    def plus(arg1,arg2):
        global total #在函数内部引用了外部的全局变量total
        total = arg1 + arg2
        print('函数内的局部变量total=',total)
        print('函数内的total的地址是:',id(total))
        return total
    plus(10,20)
    print('函数外部全局变量total=',total)
    print('函数外部变量total的地址:',id(total))
    

函数其他

我们将函数涉及到的其他几点进行讲解

  • range()函数
  • 递归函数
  • 匿名函数
range函数
  • range函数是内置函数,无须特别导入,在任何地方都可以直接使用它,下面看一下具体用法:

  • 1.提供一个数字参数,直接遍历数字:

  • for item in range(5):
        print(item)
    
    • 只给一个数字类型参数,range会遍历从0到参数减1的数字。要特别注意,range默认从0开始,到参数减1,也就是左闭右开的规则,这也是Python很多地方的规则,比如切片。
  • 2.也可以指定遍历的区间:

  • for item in range(1,5):
        print(item)
    
  • 3.还可以指定步长,就像切片一样

  • for item in range(1,11,3):
        print(item)
    
  • 4.但更多的时候是结合range和len函数,遍历一个序列的索引

  • alist = [1,2,3,4,5]
    for i in range(len(alist)):
        print(alist[i])
    
  • 5.指定步长为-1可以倒序遍历

  • for i in range(6,1,-1):
        print(i)
    
递归函数
  • 如果一个函数在内部调用了自身,这个函数就被称为递归函数。

  • def func():
        print('正在调用func函数')
        func()
        
    func()
    
  • What?函数可以自己调用自己?会不会进入死循环,永远退出不了?我们先看一个例子,典型的高斯求和问题,1+2+3+4+…+99+100,不使用递归的话,我们可以用循环,这么做:

  • def sum_number(n):
        sum = 0
        for i in range(1,n+1):
            sum += i
        return sum
    
    result = sum_number(5)
    print(result)
    
  • 但如果使用递归函数来写,是这样的:

  • def sum_number(n):
        if n == 1:
            return 1
        return n + sum_number(n-1)
      
    print(sum_number(5))
    
    • 分析一下代码,当n小于等于0的时候,直接给出和值为0,这句不能省。当n大于0时,结果是n加上sum_number(n-1)。这里的sum_number(n-1)又是一次sum_number函数的调用,不过参数的值变成了n-1,要得sum_number(n)到的值就必须等待sum_number(n-1)的值被计算出来,同样要得到sum_number(n-1)的值必须等待sum_number(n-2)的值,如此一路推算下去,直到sum_number(0),因为if语句的存在,它不需要等待sum_number(-1)的计算了,而是直接给出结果0。然后程序一路返回,直到回到最初的sum_number(n),并给出最终结果。
  • 递归最核心的思想是:

    • 每一次递归,整体问题都要比原来减小,并且递归到一定层次时,要能直接给出结果!
  • 递归的优点

    • 递归函数的优点是定义简单,代码量少,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。
  • 注意:

    • 使用递归函数需要注意防止递归深度溢出,在Python中,通常情况下,这个深度是1000层,超过将抛出异常。在计算机中,函数递归调用是通过栈(stack)这种数据结构实现的,每当进入一个递归时,栈就会加一层,每当函数返回一次,栈就会减一层。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。
def sum_number(n):
    if n == 1:
        return 1
    return n + sum_number(n-1)
  
print(sum_number(5))

'''
递归调用的执行过程:
	sum_number(5):5 + sum_number(4)
	sum_number(4):4 + sum_number(3)
	sum_number(3):3 + sum_number(2)
	sum_number(2):2 + sum_number(1)
	sum_number(1):1
'''
匿名函数
  • 提问:

    • 刚开始编程的同学可能会遇到一个头疼的问题,就是变量或者函数命名的问题,虽然命名规范很简单,但是如果涉及到的操作过多给每一个操作的函数都起一个高可读性的名称,必然会挖空你的英语词汇量。
  • 当我们在创建函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。这省去了我们挖空心思为函数命名的麻烦,也能少写不少代码,很多编程语言都提供这一特性。匿名函数用好了,会有画龙点睛的效果,没用好,就容易“画虎不成反类犬”,需要我们在平时的代码过程中,多学、多看、多琢磨。

  • 匿名函数的使用

    • Python语言使用lambda关键字来创建匿名函数。
    • 所谓匿名,即不再使用def语句这样标准的形式定义一个函数。
      • lambda只是一个表达式,而不是一个代码块,函数体比def简单很多。
      • 仅仅能在lambda表达式中封装有限的逻辑。
    • 定义语法:
      • 其形式通常是这样的:lambda 参数: 表达式
  • 例子:它相当于下面的函数:

  • def func(num):
        if num > 0:
            return 1
        else:
            return 0
    #该匿名函数就等同于上面的有名函数
    result = lambda x:1 if x > 0 else 0 #x就是匿名函数的参数,0和1就是返回值
    print(result(1)) #调用匿名函数
    
  • 匿名函数只能有一个表达式,不用也不能写return语句,表达式的结果就是其返回值。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

POST 为什么会发送两次请求?

本文目录 同源策略 什么是同源策略 CORS 简单请求 预检请求 附带身份凭证的请求与通配符 完整的请求流程图 总结 前言 最近博主在字节面试中遇到这样一个面试题,这个问题也是前端面试的高频问题,因为在前端开发的日常开发中我们总是会与post请求…

【数据结构】-- 栈和队列

🌈 个人主页:白子寰 🔥 分类专栏:python从入门到精通,魔法指针,进阶C,C语言,C语言题集,C语言实现游戏👈 希望得到您的订阅和支持~ 💡 坚持创作博文…

Mybatis-plus中的分页操作

Mybatis-plus中的分页操作 1.导入Mybatis-plus依赖2.创建mybatis配置类3.参数 1.导入Mybatis-plus依赖 因为是一个springboot项目&#xff0c;其中的pom.xml文件内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns&q…

ping命令的使用

一、实验环境 同实验案例分析ARP解析过程环境。 二、需求描述 熟悉 ping 命令的用法并熱悉 ping 命令的各种参数 三、推荐步骤 分别 ping 一个存在的和不存在的IP地址&#xff0c;观察返回的信息分别测试 ping 命令的相关参数。 四、实验步骤 1.ping 一个存在的和不存在…

数据加密、文档加密为什么都选择安企神软件

数据加密、文档加密为什么都选择安企神软件 免费试用安企神 在数据加密和文件加密领域&#xff0c;有众多优秀的软件&#xff0c;他们功能各异、价格不同、效果也大相径庭&#xff0c;经过对比使用、用户口碑和技术网站评判&#xff0c;安企神在各方面都稳坐第一把交易。其原…

ECA-Net:深度卷积神经网络中的高效通道注意力机制【原理讲解及代码!!!】

ECA-Net&#xff1a;深度卷积神经网络中的高效通道注意力机制 在深度学习领域&#xff0c;特别是在深度卷积神经网络&#xff08;DCNN&#xff09;中&#xff0c;注意力机制已经成为提升模型性能的关键技术之一。其中&#xff0c;ECA模块&#xff08;Efficient Channel Attent…

Nginx常用配置,开箱即用

经常遇到Nginx安装和配置的问题。这里笔者将常用配置统统写在下面&#xff0c;方便咱们日常使用。这里本着开箱即用的原则&#xff0c;所以大多数时候不会解释为什么要这样去配置&#xff0c;也不涉及Nginx的安装步骤。下面的所有配置&#xff0c;都可以直接复制后粘贴使用&…

虚幻引擎源码版安装下载,点击GenerateProjectFiles.bat报错 error NU1101NuGet包问题解决参考方案

开发环境配置与源码安装使用 安装VS2022 按照官方文档安装需要的vs配置 虚幻引擎源代码下载 Epic里面下载的引擎与源代码引擎区别&#xff1a;Epic里面下载的引擎是已经编译过的它的源代码访问权限不完整&#xff0c;源代码版本提供比较完整引擎代码&#xff0c;并且可以修…

顺序表(增删减改)+通讯录项目(数据结构)+顺序表专用题型

什么是顺序表 顺序表和数组的区别 顺序表本质就是数组 结构体初阶进阶 系统化的学习-CSDN博客 简单解释一下&#xff0c;就像大家去吃饭&#xff0c;然后左边是苍蝇馆子&#xff0c;右边是修饰过的苍蝇馆子&#xff0c;但是那个好看的苍蝇馆子一看&#xff0c;这不行啊&a…

SAP NWDI(二)服务开启(SLD,CM,CMS)

一、启用System Landscape Directory 二、启用 NWDI using CMS

反射

目录 01、Java反射机制概述1.1、使用反射&#xff0c;实现同上的操作、调用私有属性 02、理解Class类并获取Class实例2.1、Class类的理解2.2、获取Class实例的4种方式2.3、Class实例对应的结构的说明 03、ClassLoader的理解3.1、ClassLoader的理解3.2、使用ClassLoader加载配置…

C语言【数组】

一、数组基本语法 1. 什么是数组 数组是c语言的一种数据结构&#xff0c;用于存储一组具有相同数据类型的数据&#xff1b; 数组中每个元素可以通过下标进行访问&#xff0c;索引从0开始&#xff0c;最大值为数组长度-1。 2. 数组的使用 类型 数组名[元素个数]; int arr[5]…

xftp、xshell连不上虚拟机解决方法

一、检查连接虚拟机ip看是否正确 查看虚拟机系统 IP ifconfig 二、检查虚拟机防火墙是否关闭 查看防火墙状态(ubuntu) sudo ufw status 关闭防火墙 sudo ufw disable 查看防火墙状态(centos) systemctl status firewalld.service 关闭防火墙 systemctl stop firewalld.se…

HarmonyOS Next 悬浮窗拖拽和吸附动画

介绍 本示例使用position绝对定位实现应用内悬浮窗&#xff0c;并且通过animateTo结合curves动画曲线实现悬浮窗拖拽跟手和松手吸附边缘的弹性动画效果。 效果图预览 使用说明 按住悬浮窗可以拖拽&#xff0c;松开后悬浮窗自动靠左或靠右&#xff0c;如果悬浮窗超出内容区上…

线圈、寄存器、存储区代号、功能码 案例说明

线圈和寄存器 表示数据类型 线圈&#xff1a;表示Boolean数据类型 寄存器&#xff1a;表示非Boolean数据类型&#xff0c;用来暂时存放参与运算的数据和运算结果&#xff0c;具有接收数据、存放数据和输出数据的功能。 ModbusRTU 读输出线圈 存储区代号 0区 功能码 0x01 读输入…

冯喜运:4.17晚间黄金原油操作建议

【黄金消息面解析 】&#xff1a;周三(4月17日)欧洲时段&#xff0c;现货黄金短线持续反弹&#xff0c;当前金价位于2394美元/盎司附近&#xff0c;已从日内低点2372美元/盎司附近回升。金价在触及纪录高位2432美元/盎司后形成了对称三角形。金价下一个潜在障碍为历史高位2432美…

JS/TS笔记学习1

周末总得学点什么吧~ 奥利给! 跑火车 递归 减速 let currentIndex 0; let speed 500; // 初始速度&#xff0c;单位是毫秒 let decrement 20; // 每次迭代速度减少的量 const cells document.querySelectorAll(.cell); function highlightCell() { cells.forEach(…

14_SpringMVC

文章目录 MVCSpringMVC与JavaEE对比SpringMVCSpringMVC的核心流程SpringMVC入门案例RequestMapping注解的使用Handler方法的返回值Handler方法的形参keyvalue形式的请求参数Json请求参数 RESTful风格接口静态资源处理FilterHandlerInterceptor异常处理SpringMVC核心流程流程图 …

界面设计【1】-项目的UI设计css

引言&#xff1a; 本篇博客对简单的css html界面设计做了简要介绍 这篇博客主要就是介绍了做横向项目中&#xff0c;CSS界面设计与优化。 界面设计【1】-项目的UI设计css 1. 什么是css?2. css编程demo3. 可视化效果 1. 什么是css? CSS是层叠样式表&#xff08;Cascading S…

一篇写给前端的精选面试题,中大厂面试重复率高到爆!!!

写在前面 针对前端环境恶劣&#xff0c;很多人在前端面试的时候都直接去找相关公司的面经&#xff0c;或者没有真正新一点各个厂里常用面试题&#xff0c;现在小编给大家整理好了&#xff0c;前端面试无非就是那些&#xff0c;面试题更别谈新旧&#xff0c;只不过很多公司常用…
最新文章