Python入门知识点 9--函数作用域与名称空间

一、练习答案

'''
项目名称: 上一篇练习
项目描述: 练习答案
项目环境: python3.8.10
作者所属: 小赵
'''# 1.定义一个函数,内容为输出一句('人生苦短,我选python'),并调用该函数
def talk():print('人生苦短,我选python')
talk()# 2.定义一个函数,该函数在调用的时候会接收2个数值数据,
# 返回值为返回里面较大的值,并调用输出
def num(a,b):return max(a,b)
print(num(4,10))# 3.定义一个函数,该函数在调用的时候会接收一个元组数据,
# 元组里的值都为数值,返回值为该参数的'长度'以及'元组里数值的和'.并调用输出
def num1(*args):return len(args),sum(args)
print(num1(1,2,3,4,5,6,7,7,89))# 4.定义一个函数,该函数在调用的时候会接收一个字符串数据为你的名字,
# 在声明的时候有个默认参数值为'多喝热水'.
# 函数功能为输出一句 '<你的名字>要<好好学习>' .并调用输出
def fun(name,talk1='多喝热水'):print(f'{name}要{talk1}')
fun('小赵','好好学习')# 5.通过函数实现一个计算器(加减乘除)
# 小提醒:把加减乘除分别写成4个函数,让用户选择对应功能,
# 数值也同样由用户输入(计算两个值之间的加减乘除的操作)
#第一种做法
def add_1(num1,num2):return num1+num2def sub(num1,num2):return num1-num2def mul(num1,num2):return num1*num2def div(num1,num2):return num1/num2num1=float(input('请输入要计算的第一个值'))
num2=float(input('请输入要计算的第二个值'))
select=int(input('请输入要进行的操作 1加法 2减法 3乘法 4除法'))if select==1:print(add_1(num1, num2))
elif select==2:print(sub(num1, num2))
elif select==3:print(mul(num1, num2))
elif select==4:print(div(num1, num2))
else:print('功能不存在,请重新输入存在的序号')#第二种做法:def add_1(num1,num2):return num1+num2def sub(num1,num2):return num1-num2def mul(num1,num2):return num1*num2def div(num1,num2):return num1/num2# 计算机功能字典 声明一个字典 键是1-4序号 值是对应的功能函数
calc={1:add_1,2:sub,3:mul,4:div,
}
num1=float(input('请输入要计算的第一个值'))
num2=float(input('请输入要计算的第二个值'))
select=int(input('请输入要进行的操作 1加法 2减法 3乘法 4除法'))
if select in calc: #字典结合in运算符,可以判断字典的键是否在这个字典里print(calc[select](num1,num2))
else:print('功能不存在,请重新输入存在的序号')

二、高内聚 低耦合

练习要求把加减乘除写成4个函数,为什么要分开写,我把加减乘除函数写到一个函数里不行么?--避免一个错,全部错

我把加减乘除函数都写在了一个函数里,,然后里面的除功能出错了,我这整个函数就不能用了

把加减乘除函数分开写在4个函数里:
1.谁出了问题,我可以更好的定位解决
2.出问题了,可以先把他注释,也不会影响其他的函数功能

专注做好一件事情,彼此联系不要过于紧密

高内聚-->一个程序/函数做的事情尽量统一/专一,一个函数做好一个功能就好,而不是一个函数里写一堆的功能,容易一个错全部错

低耦合-->程序与程序,函数与函数之间的关联不要太密切,各做各的事情,避免一个错,全部错

三、初识函数对象

函数:更高级的容器,里面的存的不是数据,而是代码
    一个容器能干嘛, 函数也可以干嘛
    
函数对象:把函数当成一个普通数据容器来使用

1、函数可以被引用(把定义好的函数赋值给变量)

<1>把函数的返回值赋值给一个变量
def fun1():return 'hello'a=fun1() #把函数fun1的返回值赋值给了变量a
print(a)<2>把函数本身复制给一个变量,变量就相当于函数的分身
def fun2():print('好好学习')b=fun2 #这个b是函数类型,把函数fun2的功能复制一份给了b b等价于fun2
b() #调用函数
print(b()) #函数没有定义返回值 默认是None

2、函数可以作为元素放在列表,元组,字典中使用

如果函数放在集合中,能不能拿出来,并且完成调用呢?
不行,因为集合是无序的,没有对应的方法可以查到

def fun3():print('天天向上')li=[1,2,3,4,fun3,'小赵'] #这里只是把函数存在这个列表里,不需要现在调用
li[4]() #直接调用输出
print(li[4]) #内存地址
print(li[4]()) #没有返回值 所以会输出None
dict1={1:fun2,2:'哈哈'}
dict1[1]()

3、函数可以作为参数,传递给另一个函数

def name():my_name='小赵'return my_namedef name1(a):print(f'我是个靓女{a}')def name2(b):print(f'{b}是靓女一个')name1(name()) #把name返回值传给name1,name的返回值是‘小赵’,所以作为实参传给了a
name2(name())

4、函数可以作为返回值来使用,你返回的数据可以是一个函数

'''
卑微码农在线打工
老板(任务1,任务2)码农(要求1,要求2)干活干活返回 做好的东西返回 码农(要求)
'''
def boss(a,b): #老板收到两个任务(参数)def yi_nuo(c,d): #我接收到老板的任务 ,加了创意所以是cdreturn c+d #做好东西return yi_nuo(a,b) #老板拿做好的东西 邀功print(boss(1,2)) #成果是老板的 给老板打工

四、名称空间

名称空间--用来存名字的地方

程序中有一些专门的内存区域来保存对应的数据
    名称空间-->存储变量名,函数名,模块名
    内存数据-->变量值,函数代码,模块代码
    
生命周期:一个数据/程序,从创建到结束的过程
    
名称空间一共分为三层

1.内建名称空间(存内置函数)
    生命周期:随着python程序启动而生成,在程序关闭时回收/清除所有数据
    加载顺序:最先被加载出来的
    存放对象:print input type sum..这些内置函数
        
2.全局名称空间(存用户定义在python外层的名字)
    生命周期:随着python程序启动而生成,在程序关闭时回收/清除所有数据
    加载顺序:第二个加载出来的
    存放对象:用户自己定义的变量名/函数名
        
3.局部名称空间(在函数里定义的名字)
    生命周期:随着函数调用而生成,结束调用后关闭
    加载顺序:在调用时才会被加载
    存放对象:在函数里定义的变量名/函数/形参名

a=666 #a定义在外层,属于全局名称空间
def fun(a,b):z=88 #z定义在函数里,属于局部名称空间print(z) #在这里打印 小弟会听大哥的话print('hhh')return a+b
# fun(1,2) #变量z只有在函数调用时才能输出
print(fun(1,2))
# print(z) #z是fun的小弟 不能在外面越过大哥fun去直接打印z 

总结:
    一个程序里的数据都会存储在对应的位置
    名称空间-->用来存储名字的地方

五、作用域

作用域:一个数据能够使用的范围
   
作用域分为
1.全局作用域:整个程序里都可以使用
    (内建名称空间,全局名称空间)
    
2.局部作用域:只有局部位置才能使用(函数内)
    (局部名称空间)

b='我是全局变量' #整个程序里都可以使用
print(b)  #可以在外层直接输出def fun2():print(b) #可以在函数里输出fun2()#局部变量
def fun3():c='我是一个局部变量'print(c) #c是一个私有变量,正常来说只有函数fun3才能使用
fun3()
# print(c) #单独在外面打印会报错

1、global提权

该关键字可以在局部内定义全局变量,也可以在局部内修改全局变量

def 函数名():global 变量名变量名=值
函数名()#global用法一 在函数内定义一个全局变量,让一个数据从局部变为全局
def name():global aa='小赵'name() #局部名称空间,需要调用函数才能生成对应的名称空间
print(a) #a就提权成为了全局变量 在外层也可以直接调用#global用法二 在局部内修改全局变量
num=10
def num_sum():global numnum+=100  #num=num+100return num
print(num_sum())

2、nonlocal降权

将局部变量深度局部化(深度私有化)

在嵌套函数中(nonlocal使用前提),内层函数修改外层函数的变量值

def fun():b=520 #局部变量def num():nonlocal b #再度局部化,深度私有化,用上这个关键字,才能在内层函数中去修改外层函数的变量值b=88num()print(b)
fun()

六、匿名函数 lambda表达式

我们平时函数都是称为:有名函数

匿名函数顾名思义:无名函数

#你现在要写一个函数,可以先用匿名函数写好它的功能,在调用时取个名字#有名写法
def add1(a,b):return a+bprint(add1(5, 6))#匿名写法
add2=lambda a,b:a+b
print(add2(90,100))语法格式:lambda 变量:操作b=lambda a:print(a)
b('哈哈')

本篇文章到这就结束了,有什么问题欢迎随时评论或者私信哦~

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

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

相关文章

【Vulnhub系列】Vulnhub_SecureCode1靶场渗透(原创)

【Vulnhub系列靶场】Vulnhub_SecureCode1靶场渗透 原文转载已经过授权 原文链接&#xff1a;Lusen的小窝 - 学无止尽&#xff0c;不进则退 (lusensec.github.io) 一、环境配置 1、从百度网盘下载对应靶机的.ova镜像 2、在VM中选择【打开】该.ova 3、选择存储路径&#xff0…

Mathtype7.8中文版远程安装并嵌入word(包成功)

Mathtype7.8是一款专业的数学公式编辑工具&#xff0c;能够帮助用户在各种文档中插入复杂的数学公式和符号。数学公式编辑器工具可以轻松输入各种复杂的公式和符号&#xff0c;与Office文档完美结合&#xff0c;显示效果超好&#xff0c;比Office自带的公式编辑器要强大很多。M…

obsidian 首页制作 辅助笔记总结回顾

记笔记最重要的是回顾与总结&#xff0c;有这么一款插件可以让我们自己搭建一个美观的首页&#xff0c;它包括热力图、文稿统计、文稿回顾等等功能&#xff0c;你是否愿意尝试呢&#xff1f; 今天就介绍一款插件&#xff0c;能快速制作笔记首页&#xff0c;辅助总结、回顾。 …

深入浅出搞懂 Apache CXF 框架

Web服务是系统与系统之间通信的重要方式。本文将结合Apache CXF和Spring&#xff0c;详细讲解如何创建和配置Web服务&#xff0c;并给出具体的示例&#xff0c;帮助读者快速上手。 什么是Web服务&#xff1f; Web服务是一种允许不同应用程序通过网络进行互操作的技术&#xff…

sql注入详解【从数据库架构分析】

简介 SQL注入是一种常见的Web应用程序安全漏洞&#xff0c;它允许攻击者在Web应用程序中插入恶意SQL语句&#xff0c;从而操纵数据库执行非授权的操作。这种攻击利用了应用程序在处理用户输入时的不足&#xff0c;特别是当应用程序直接将用户输入作为SQL语句的一部分使用&…

Flutter Screenshot使用指南:轻松捕获Widget为图片

Flutter Screenshot使用指南&#xff1a;轻松捕获Widget为图片 简介 screenshot 是一个Flutter插件&#xff0c;它提供了一个简单的方法来捕获任何Widget为图片&#xff0c;包括那些未渲染在屏幕上的Widget。 主要功能 捕获屏幕上的Widget为图片。支持捕获不可见的Widget&a…

聊聊基于Alink库的特征工程方法

独热编码 OneHotEncoder 是用于将类别型特征转换为独热编码的类。独热编码是一种常用的特征编码方式&#xff0c;特别适用于处理类别型特征&#xff0c;将其转换为数值型特征。 对于每个类别型特征&#xff0c;OneHotEncoder 将其编码成一个长度为类别数量的向量。 每个类别对…

数据库实验:SQL Server基本表单表查询

一、实验目的&#xff1a; 1、掌握使用SQL语法实现单表查询 二、实验内容&#xff1a; 1. 查询订购日期为2001年5月22日的订单情况。&#xff08;Orders&#xff09;&#xff08;时间日期的表达方式为 dOrderDate ‘2001-5-22’&#xff0c;类似字符串&#xff0c;使用单引号…

Python爬虫技术 第20节 模拟用户交互

Python爬虫技术是一种自动化获取网页数据的方法。模拟用户交互是其中的一个高级主题&#xff0c;通常用于处理那些需要用户输入、点击按钮或者执行其他交互操作才能加载数据的动态网站。 下面我会分步骤介绍如何使用Python来模拟这些用户交互&#xff1a; 1. 基础爬虫知识 在…

vue的虚拟Dom和diff算法

什么是虚拟dom&#xff1a; 虚拟 DOM 是一个抽象的虚拟树结构&#xff0c;用于表示页面的结构和内容&#xff0c;但它并不直接与实际的浏览器 DOM 交互。当响应式数据变化时&#xff0c;Vue 会生成一个新的虚拟 DOM 树&#xff0c;表示更新后的页面状态&#xff0c;再通过diff…

NumpyPandas:Pandas库(50%-100%)

目录 前言 一、排序 1.使用索引排序 2.使用变量值排序 二、计算新变量 1.新变量为常量 2.根据原变量新增列 3.基于一个原变量做函数运算 4.在指定位置插入新列 三、修改替换变量值 1.对应数值替换 2.指定范围替换 四、虚拟变量变换 五、数值变量分组 六、数据分组…

ChatGPT:@JSONField 有什么用

ChatGPT&#xff1a;JSONField 有什么用 JSONField 注解在使用 Fastjson 进行 JSON 序列化和反序列化时&#xff0c;提供了以下主要功能&#xff1a; 字段别名&#xff1a; 你可以使用 JSONField 注解指定 JSON 字符串中字段的名称。如果 Java 对象的字段名与 JSON 字符串中的…

构建大规模账号池与本地部署:GitHub爬虫项目详解

账号池搭建 必要性 常见登录方式&#xff1a; 基于Session Cookie的登录基于JWT的登录&#xff1a;登录生成JWT字符串 账号池存储cookie或者JWT字符串 方便后续发请求爬取数据 本地部署 conda建立一个虚拟环境 conda create -n new_env python3.x # 替换 x 为你需要的 P…

Python3网络爬虫开发实战(7)JavaScript 动态渲染页面爬取

文章目录 一、Selenium1. 基本安装2. 基本使用3. 声明浏览器对象4. 访问页面5. 查找节点6. 节点交互7. 动作链8. 执行 JavaScript9. 获取节点信息10. 切换 Frame11. 延时等待12. 前进后退13. Cookies14. 选项卡管理15. 异常处理16. 反屏蔽17. 无头模式18. Pyppeteer&#xff0c…

80后最后的书信 年代

当时11亿人口只有1.8万部固定电话 中国几千年来 鱼传尺素 雁寄鸿书 写信最后要写 亲啓 如有照片&#xff0c;封面要写内有照片&#xff0c;请勿折叠 信的开头应该是 见字如面&#xff0c;展信舒颜 如果拜托别人做事情&#xff0c;最后要写为盼 最后要写 某某草 书未尽…

ubuntu 配置opencv-python-imsow()报错

python调用imshow&#xff08;&#xff09;时出现下面的错误&#xff1a; error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-c…

Python --Pandas库基础方法(1)

文章目录 Pandas主要数据结构Pandas 的安装Series对象创建使用列表创建调取值与索引指定index字典创建标量与index对象一起传入创建 DataFrame对象创建创建DataFrame对象values、index、columns属性列表创建索引columns的使用 Pandas中的Index导入csv文件指定列名指明分隔符读取…

关于黑马Ajax项目的笔记

一、token的介绍 概念&#xff1a; 访问权限的令牌&#xff0c;本质上是一串字符串 创建&#xff1a; 正确登录后&#xff0c;由后端签发并返回 作用&#xff1a; 判断是否有登录状态等&#xff0c;控制访问权限 注意 前端只能判断token有无&#xff0c;后端才能判断to…

复制带有随机指针的链表(通过复制链表实现)

public static Node copyListWithRand2(Node head){ // 如果头节点为空&#xff0c;直接返回null if(head null){ return null; } // 初始化当前节点和下一个节点 Node cur head; Node next null; // 遍历链表&#xff0c;复制每个节点&#xf…

大厂面经:京东大数据面试题及参考答案(3万字长文)

目录 Hive窗口函数有什么,什么场景,怎么用 Hive文本拼接函数是什么 Hive的数据存储格式有哪些,优缺点 两个表 join 过程中,空值的情况如何处理? Hive存储结构的区别? Hive本身对于SQL做了哪些优化? Hive分区和分桶区别? Hive分桶表的作用? HBase负载均衡怎么…