day11:return关键字&全局/局部变量&函数名的使用&函数的嵌套&nonlocal关键字&locals/globals
关键字:return
自定义函数的返回值,return可以把值返回到函数的调用处
1.return+六大标准数据类型,还有类和对象,函数
如果不定义return,默认返回的是None
2.在执行return之后,立刻终止函数,后面的代码不执行
# 1.return的返回类型
def func():
# return 1
# return 3.14
# return "abc"
# return []
# return ()
# return {"a":1}
pass
res=func()
# 如果不定义return,默认返回的是None
print(res)
# 2.在执行完return 之后,立刻终止函数,后面的代码不执行
def func():
print(1)
print(2)
return 3 # 立刻终止函数,后面的print(4)和print(5)不执行
print(4)
print(5)
res =func()
print(res) def func():
for i in range(3):
if i==2:
return 1
print(i)
res = func()
print(res) # 0 1 1
# 3.模拟简单的计算器 + - * /
def func(sign,num1,num2):
if sign=="+":
res= num1+num2
elif sign=="-":
res =num1-num2
elif sign=="*":
res = num1*num2
elif sign=="/":
if num2 ==0:
return "除数不能为0,老弟"
res = num1/num2
else:
return "这个本计算器真算不了"
return res res = func("+",3,5)
res = func("-",10,20)
res = func("*",10,20)
res = func("/",20,10)
res = func("/",20,0)
res = func("&",20,0)
print(res)
全局变量和局部变量
局部变量:在函数内部定义的变量(局部命名空间)
全局变量:在函数外部定义的或者使用global在函数内部定义(全局命名空间)
作用域:作用的范围
局部变量作用域:在函数的内部
全局变量作用域:横跨整个文件
生命周期:
内置变量>全局变量>局部变量
1.局部变量
# 1.局部变量
def func():
# 定义局部变量
a=5
# 获取局部变量
print(a)
# 修改局部变量
a=10
print(a)
func()
print(a) # error 不能在全局调用局部变量
2.全局变量
# 2.全局变量
# 定义全局变量
b=10
# 获取全局变量
print(b)
# 修改全局变量
b=20 def func():
# 可以在函数内部获取全局变量
print(b)
func()
3.使用global在函数内部创建全局变量
# 3.使用global在函数内部创建全局变量
def func():
global c
c=200
func()
print(c)
4.使用global在函数内部修改全局变量
# 4.使用global在函数内部修改全局变量
d=300
def func():
global d
d=400
func()
print(d)
5.总结:
可以使用global关键字在函数内部定义一个全局变量
也可以使用global关键字在函数内部修改一个全局变量
函数名的使用
1.函数名是一个特殊的变量,可以把函数当做变量对它赋值
def func():
print("我是func函数")
return 1 # 1.函数名是个特殊的变量,可以当做变量赋值
a="你好"
print(a)
a=func()
# a() # 函数可以像变量一样销毁
del a
a()
2.函数名可以作为容器类型数据的参数
# 2.函数名可以作为容器类型数据的元素
def func1():
print("我是func1函数")
def func2():
print("我是func2函数")
def func3():
print("我是func3函数") lst=[func1,func2,func3]
for i in lst:
print(i)
i() # func1() func2() func3()
3.函数名可以作为函数的参数
# 3.函数名可以作为函数的参数
def func3():
print("我是func3函数") def func4(f):
f() # 我是func3函数 func4(func3)
4.函数名可以作为函数的返回值
# 4.函数名可以作为函数的返回值
def func(f):
return f
res = func(func2) # f---> func2 -----> res=func2()
res()
5.__doc__ 或者help查看文档
# __doc__ 或者help查看文档
def func(a):
"""
功能:xxxx
参数:a
返回值:1
"""
print("xxxx")
return 1 help(func)
res = func.__doc__
print(res) 输出结果: 功能:xxxx
参数:a
返回值:1
函数的嵌套
1.一个简单的例子
def outer():
def inner():
print("我是inner函数")
inner()
outer()
inner() # 调用外部函数时,内部函数不可以再函数外部调用!
1.内部函数可以直接在函数外部调用吗?不行
2.调用外部函数后,内部函数可以在函数外部调用吗?不行
3.内部函数可以在函数内部调用吗? 可以
4.内部函数在函数内部调用时,是否有先后顺序?有!必须先定义再调用
2.函数嵌套案例
# 外层是outer,内层是inner,最里层是smaller,调用smaller里面的所有代码 def outer():
def inner():
def smaller():
print("我是smaller函数",id)
smaller()
inner()
outer()
3.LEGB原则
找寻变量的调用顺序采用LEGB原则,即就近原则
B- Builtin(Python):python内置模块的命名空间 (内建作用域)
G- Global(module):函数外部所在的命名空间(全局作用域)
E -Enclosing function locals:外部嵌套函数的作用域(嵌套作用域)
L -Local(function):当前函数内的作用域(局部作用域)
依据就近原则 从下向上 由里向外 依次寻找
nonlocal关键字
nonlocal 遵循LEGB就近找变量原则
1.找当前空间上一层的局部变量进行修改
2.如果找不到,会继续向上寻找
3.最后什么也没有,直接报错
1.找当前空间上一层的局部变量进行修改
# 1.找当前空间上一层的局部变量进行修改
def outer():
a=100
def inner():
nonlocal a
a=200
print(a) # 200
inner()
print(a) # 200
outer()
2.如果找不到,会继续向上寻找
# 2.如果找不到,会继续向上寻找
def outer():
a=100
def inner():
def smaller():
nonlocal a
a=400
print(a) # 400
smaller()
print(a) # 400
inner()
print(a) # 400
outer()
3.注意点:nonlocal只能修改局部变量
# 3.注意点:nonlocal只能修改局部变量
a=100
def outer():
def inner():
def smaller():
nonlocal a # nonlocal只能修改局部变量,而本程序中第一行的a是全局变量,nonlocal无法修改
a=400
print(a)
smaller()
print(a)
inner()
print(a)
outer()
4.不使用nonlocal修改局部变量--->只能适用于列表
# 4.不使用nonlocal修改局部变量
def func():
lst=[1,2,3,4]
def inner():
lst[-1]=10
inner()
print(lst)
func()
globals和locals
1.locals 获取当前作用域中所有变量
locals 如果在全局,调用locals之后,获取的是打印之前的所有变量,返回字典,全局空间作用域
locals 如果在局部,调用locals之后,获取的是调用之前的所有变量,返回字典,局部空间作用域
# locals 在全局:获取打印之前的所有变量
def func():
ff = 123
a = 1
b = 2
res = locals()
c = 3
print(res) # 是一个大字典,里面有很多键值对,a:1 b:2 c:3均可以打印出来(截止到打印之前)
d = 4 # d:4 不会被打印
# locals 在全局
a1 = 10
def func():
a = 1
b = 2
res = locals()
c = 3
print(res) # a:1 b:2 会被打印出来 截止到调用local()之前的都会被打印出来
d = 4
a2 = 20
func()
a3 = 30
2.globals 只获取全局空间中所有变量
globals 如果在全局,调用globals之后,获取的是打印之前的所有变量,返回字典,全局空间作用域
globals 如果在局部,调用globals之后,获取的是调用之前的所有变量,返回字典,全局空间作用域
# global 在全局
def func():
ff = 123
a = 1
b = 2
res = globals() # a:1 b:2 c:3 截止到打印之前
c = 3
print(res)
d = 4
# global 在局部
a1 = 10
def func():
a = 1
b = 2
res = globals()
c = 3
print(res)
d = 4
a2 = 20
func() # globals() a1:10 a2:20 截止到调用处
a3 = 30
3.globals 动态批量创建全局变量
# 1.用字符串定义全局变量
dic = globals() # 必须是global定义的字典,普通字典无效
print(dic) # 返回的是系统的字典
# 在全局的字典当中,通过添加键值对,自动创建全局变量
# 对应的键时变量名,对应的值是变量指向的值
dic["name"] = "致和"
print(name) # 致和
# 2.批量定义全局变量
def func():
dic = globals()
# 通过在全局系统字典当中,添加键值对,批量创建变量
for i in range(1,6):
# "a%d" % (1) => "a1" "a%d" % (2) => "a2"
dic["a%d" % (i)] = i # 1~5 func()
day11:return关键字&全局/局部变量&函数名的使用&函数的嵌套&nonlocal关键字&locals/globals的更多相关文章
- Delphi 调用C/C++的Dll(stdcall关键字, 会导致函数名分裂. 此时函数名变成_stdadd@8)
delphi调用C++写的Dll, 当然这个Dll要求是非MFC的Dll, 这样子才能被delphi调用. 根据C++定义函数的情况, Delphi有不同的相对应的处理方法.1. 声明中不加__std ...
- c++入门之——const在函数名前面和函数后面的区别
class Test(){ public: Test(){} const int foo(int a); const int foo(int a) const; }; 一.概念 当const在函数名前 ...
- php函数名前添加& 函数的引用返回
function &test(){ static $b=0; $b= $b+1; return $b; } $a= test(); echo $a,"\n"; $a = 3 ...
- "函中函" -------------------- func2(func) -------------- 函数名可以当做函数的参数
def func(): print("吃了么")def func2(fn): print("我是func2") fn() # 执⾏传递过来的fn # 即 fn替 ...
- 用var 变量=函数名 方式调用函数时如何传值的问题
通过:xmlhttp.onreadystatechange= function(){FuncName(param)};orxmlhttp.onreadystatechange= new Functio ...
- day09-Python运维开发基础(函数收集参数、命名关键字参数与返回值、函数名的特殊使用及 全局/局部变量详解)
1. 函数收集参数.命名关键字参数与返回值.函数名的特殊使用 # ### 默认形参 和 关键字实参 # 默认形参和 关键字实参 在写法上是一样 # 函数的定义处 """默 ...
- 记录我的 python 学习历程-Day11 两个被忽视的坑、补充知识点、函数名的应用、新版格式化输出、迭代器
补充知识点 函数形参中默认参数的陷阱 针对不可变数据类型,它是没有陷阱的 def func(name, sex='男'): print(name) print(sex) func('Dylan') # ...
- python 全栈开发,Day11(函数名应用,闭包,装饰器初识,带参数以及带返回值的装饰器)
一.函数名应用 函数名是什么?函数名是函数的名字,本质:变量,特殊的变量. 函数名(),执行此函数. python 规范写法 1. #后面加一个空格,再写内容,就没有波浪线了. 2.一行代码写完,下面 ...
- python day11 ——1. 函数名的使⽤ 2. 闭包 3. 迭代器
⼀. 函数名的运⽤. 1.函数名的内存地址 def func(): print("呵呵") print(func) 结果: <function func at 0x11 ...
- python基础学习Day11 函数名的应用、闭包、迭代器
一.函数名的应用 1.函数名就是函数的内存地址 def func(): print(666) func() print(func) #函数的内存地址 2.函数名可以作为变量 def func1(): ...
随机推荐
- 9.22 2020 实验 3:Mininet 实验——测量路径的损耗率
一.实验目的 在实验 2 的基础上进一步熟悉 Mininet 自定义拓扑脚本,以及与损耗率相关的设定:初步了解 Mininet 安装时自带的 POX 控制器脚本编写,测试路径损耗率. 二.实验任务 ...
- 新的世界,我们推荐不劳而获 -> 持续更新中
随着技术带来的生产力爆发越来越猛烈,有人提出是不是有必要保留一些落后的生产工艺及相关岗位,以避免社会动荡. 我的答案:不用.但是要改变社会对于不劳而获的态度:我们对于生活资料的不劳而获持接受的态度,但 ...
- jieba原理
一.jieba介绍jieba库是一个简单实用的中文自然语言处理分词库. jieba分词属于概率语言模型分词.概率语言模型分词的任务是:在全切分所得的所有结果中求某个切分方案S,使得P(S)最大. ji ...
- Spyglass CDC工具使用(二)
最近一直在搞CDC (clock domain crossing) 方面的事情,现在就CDC的一些知识点进行总结. 做CDC检查使用的是Spyglass工具.以下内容转载自:Spyglass检查之CD ...
- element ui el-date-picker format 和 value-format 格式不一致,会导致日期输入框不显示
element ui el-date-picker和value-format 不一致导致输入框不显示
- lcd 驱动程序框架分析
在嵌入式产品中,lcd的用途可谓很大,很多产品都会用到lcd作为人机交互的接口,在linux内核中当然也有lcd的驱动,内核中都是做好了框架,用平台设备来添加和管理不同的lcd驱动程序,因为每款arm ...
- C#实现控制台打印年历
C#实现控制台打印年历 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System. ...
- [.Net]Framwork WebAPI添加接口请求监控
思路: 通过重写 ActionFilterAttribute 拦截Action的请求及返回信息,实现对接口请求的监听. 最终效果如下: 全局启用需配置如下: 局部启用需配置如下: 源码如下: 1 // ...
- 【Flutter】环境搭建(Windows+Android Studio 3.6.1)
最近参加的项目需要用到Flutter框架进行iOS/Android双端开发,然而第一步环境搭建的过程就忙活了一整个晚上,直到现在终于有时间静下心来整理一下搭建过程中遇到的困难. 0x00 Flutte ...
- 钉钉回调事件-asp.net core 开发钉钉回调事件
最近有一个钉钉的项目,所以,接下来的日子里,我会把钉钉开发中遇到的问题都整理成博客,供大家参考. 钉钉开发者后台,添加好了小程序,需要提供一个回调URL地址,用于数据的同步.如下图 根据钉钉提供的de ...