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() #在函数内部可以调用innerreturn innerinner() #在函数外部不可以调用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 + arg2print('函数内的局部变量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 #在函数内部引用了外部的全局变量totaltotal = arg1 + arg2print('函数内的局部变量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 = 0for i in range(1,n+1):sum += ireturn sumresult = sum_number(5)
    print(result)
    
  • 但如果使用递归函数来写,是这样的:

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

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

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

相关文章

艾体宝方案 | ITT-Profitap IOTA——铁路运输的远程网络捕获和故障排除方案

在移动互联时代,铁路运输的数字化转型已成不可逆转的趋势。然而,随之而来的是对网络连接质量和故障排查的更高要求。本文将探讨如何利用艾体宝Profitap IOTA技术,在火车上实现远程网络捕获和故障排查,助力铁路运输行业迈向智能化未…

java swing电商出入库管理系统eclipse开发Mysql数据库CS结构java编程

一、源码特点 java swing 电商出入库管理系统 是一套完善的窗体设计系统,对理解SWING java 编程开发语言有帮助,系统具有完整的源代码和数据库,,系统主要采用C/S模式开发。 应用技术:javamysql 开发工具&#xff1…

WEB前端-用户注册倒计时

<body><textarea name"" id"" cols"30" rows"10">用户注册协议欢迎注册成为京东用户&#xff01;在您注册过程中&#xff0c;您需要完成我们的注册流程并通过点击同意的形式在线签署以下协议&#xff0c;请您务必仔细阅读…

net 5+ 服务创建

worker Service创建 在新版本服务中的创建&#xff0c;名称是Worker Service&#xff0c;从.NET Core 2.1开始&#xff0c;就可以使用辅助角色服务模板了&#xff0c;即Worker Service。它可以编写长期服务&#xff0c;作为 Windows 服务进行托管&#xff0c;还支持跨平台部署…

《幻兽帕鲁》今年夏天将进行游戏重大更新,年内上线竞技场模式 《幻兽帕鲁》是否还能延续热度?Mac电脑玩幻兽帕鲁

千呼唤万等待&#xff0c;《幻兽帕鲁》的0.2.0.6版本终于来了&#xff01;作为2024开年第一爆作&#xff0c;《幻兽帕鲁》在刚上线那段时间可谓是风靡整个互联网&#xff0c;Steam最高在线人数突破200W&#xff0c;但是随着热度过去&#xff0c;目前稳定地在线人数保持在了5W左…

Linux笔记之查看docker容器目录映射

Linux笔记之查看docker容器目录映射 —— 2024-04-15 code review! docker inspect 容器ID或容器名 | grep -A 20 Mounts实践 grep -A 参数详解&#xff1a; grep 的 -A 参数用于在输出中包括匹配行后的指定数目的行。 使用 -A 参数 该参数的基本语法如下&#xff1a; …

路径规划 | RRT结合APF算法快速探索随机树结合人工势场法的路径规划算法(Matlab)

目录 效果一览基本介绍程序设计参考文献 效果一览 基本介绍 RRT结合APF算法的matlab代码。地图为可以替换的栅格地图。代码是在复现华中科技大学发表的英文论文的基础上的进一步改进。RRT算法。人工势场算法。 1.原论文方法简介&#xff1a;针对快速探索随机树&#xff08;RRT&…

【Zabbix】zabbix 软件监控

使用zabbix监控系统查看服务器状态以及网站流量指标&#xff0c;利用监控系统的数据去了解上线发布的结果&#xff0c;和网站的健康状态 利用一个优秀的监控软件&#xff0c;我们可以: ●通过一个友好的界面进行浏览整个网站所有的服务器状态 ●可以在 Web 前端方便的查看监控…

机器学习-随机森林算法预测温度

文章目录 算法简介解决问题获取数据集探索性数据分析查看数据集字段信息查看数据集综合统计结果查看特征值随时间变化趋势 数据预处理处理缺失数据字符列编码数据集分割训练集、验证集、测试集数据集分割 构建模型并训练结果分析与评估进一步优化实际使用经验总结 算法简介 随…

IEDA 的各种常用插件汇总

目录 IEDA 的各种常用插件汇总1、 Alibaba Java Coding Guidelines2、Translation3、Rainbow Brackets4、MyBatisX5、MyBatis Log Free6、Lombok7、Gitee IEDA 的各种常用插件汇总 1、 Alibaba Java Coding Guidelines 作用&#xff1a;阿里巴巴代码规范检查插件&#xff0c;…

BCLinux8U6系统部署oceanbase分布式数据库社区版之二、数据库服务器准备

本文是在完成步骤一、准备 OBD 中控机后的第二步&#xff0c;准备3台oceanbase分布式数据库服务器。 前序步骤&#xff1a;BCLinux8U6系统部署oceanbase分布式数据库社区版之一、准备 OBD 中控机 一、服务器配置 1、服务器硬件配置 本例采用vmware虚拟机来构建测试平台&…

Python高质量函数编写指南

The Ultimate Guide to Writing Functions 1.视频 https://www.youtube.com/watch?vyatgY4NpZXE 2.代码 https://github.com/ArjanCodes/2022-funcguide Python高质量函数编写指南 1. 一次做好一件事 from dataclasses import dataclass from datetime import datetimedatacl…

latex论文写作学习

首先无论是什么文章&#xff0c;最基础的格式都是这个&#xff1a; 如何修改字体呢&#xff1f;&#xff1a; 这样一来就可以在写完之后统一改掉了&#xff0c;用来做标记 最后记得\par 插图&#xff1a; 命令后面的中括号一般就是option

uniapp微信小程序分包

一、创建分包文件夹subPack 二、将页面文件放入分包文件夹中 启动页面和导航tabBar页面不要放入分包文件夹中 三、配置pages.json 四、效果

腾讯EdgeOne产品测评体验—腾讯云Edgeone为我的网站保驾护航

前言 众所周知&#xff0c;网站如果没有安全防护&#xff0c;极易遭受恶意攻击&#xff0c;导致运行受阻甚至瘫痪。为保障网站的安全稳定运行&#xff0c;必须采取诸如CDN加速与DDoS防护等措施&#xff0c;为用户提供安全、可靠的服务。 本文将基于腾讯云边缘安全加速平台&am…

视频怎么用二维码来分享?手机扫码看视频更方便

怎么把制作的视频快速以二维码的形式分享给其他人呢&#xff1f;视频是很多内容重要的一种展示方式&#xff0c;为了能够让其他人更加方便的查看视频内容&#xff0c;现在很多人会选择视频转二维码的方式来提供预览。将视频存储到云端然后通过扫码来调取&#xff0c;不仅减少了…

DHCP小实验

实验要求&#xff1a; 看拓扑有两个网段则我们首先需要对200.1.1.0/26进行子网划分&#xff0c;划分为两个子网&#xff0c;为200.1.1.0/27和200.1.1.32/27 我门就可以一边一个网段了&#xff0c;左边为200.1.1.0/27&#xff0c;右边为200.1.1.32/27 1、配置PC1&#xff0c;2…

2024蓝桥杯——宝石问题

先展示题目 声明 以下代码仅是我的个人看法&#xff0c;在自己考试过程中的优化版&#xff0c;本人考试就踩了很多坑&#xff0c;我会—一列举出来。代码可能很多&#xff0c;但是总体时间复杂度不高只有0(N) 函数里面的动态数组我没有写开辟判断和free&#xff0c;这里我忽略…

MySQL——基础

SQL 全称 Structured Query Language&#xff0c;结构化查询语言。操作关系型数据库的编程语言&#xff0c;定义了一套操作关系型数据库统一标准 。 SQL 通用语法 SQL语句可以单行或多行书写&#xff0c;以分号结尾。SQL语句可以使用空格/缩进来增强语句的可读性。MySQL数据库…

一文速览铁威马TOS 6全新“文件管理”

TOS 6 Beta已经上线一段时间了&#xff0c;各位铁粉用着怎么样呢&#xff1f;今天就和大家分享&#xff0c;TOS 6全新文件管理。 为了向用户提供更流畅、更便捷的文件管理体验&#xff0c;铁威马的研发团队积极借鉴了Windows OS和Mac OS在文件管理方面的优点&#xff0c;投入巨…