global与nonlocal关键字、函数名的多种用法、函数的嵌套调用、函数的嵌套定义、闭包函数、装饰器简介
一、global与nonlocal关键字
global方法:用于局部名称空间修改全局名称空间中的名字绑定关系
money = 666
def index():
global money
money = 123
index()
print(money)
nonlocal方法:用于局部名称空间修改外层局部名称空间中的名字绑定关系
def index():
name = 'jason'
def inner():
nonlocal name
name = 'kevin'
inner()
print(name)
index()
二、函数名的多种用法
函数名其实绑定的也是一块内存地址 只不过该地址里面存放的不是数据值而是一段代码 函数名加括号就会找到该代码并执行
方法一:
# 可以当做变量名赋值
def index():pass
res = index
res()
'''函数名不加括号就是函数的内存地址'''
方法二:
# 函数名可以当成函数的实参
def index():
print('from index')
def func(a):
print(a)
a(
func(index)
方法三:
# 函数名可以当成函数的返回值
def index():
print('from index')
def func():
print('from func')
return index
res = func()
print(res)
res()
def index():
print('from index')
def func():
print('from func')
return func
res = index()
print(res)
res()
方法四:
# 可以当做容器类型(可以存放多个数据的数据类型)的数据
def register():
print('注册功能')
def login():
print('登录功能')
def withdraw():
print('提现功能')
def transfer():
print('转账功能')
def shopping():
print('购物功能')
# 定义功能编号与功能的对应关系
func_dict = {
'1': register,
'2': login,
'3': withdraw,
'4': transfer,
'5': shopping
}
while True:
print("""
1.注册功能
2.登录功能
3.提现功能
4.转帐功能
5.购物功能
""")
choice = input('>>>:').strip()
if choice in func_dict:
func_name = func_dict.get(choice)
func_name()
else:
print('功能编号不存在')
三、函数的嵌套调用
函数的嵌套:在函数里面还有函数,分为外函数和内函数
# 在一个函数里面调用别的函数
def print1():
print("这是第一个函数")
def print2():
print("这是定义的第二个函数")
print1() #在print2()中调用print1()
print2()
四、函数的嵌套定义
在函数内部定义的函数要在函数内部调用
# 在函数内部定义函数
# 把复杂的功能隐藏起来,暴露给外界一个简单的接口
def all_func(type):
def register():
pass
def login():
pass
def shopping():
pass
def transfer():
pass
if type == '1':
register()
elif type == '2':
login()
elif type == '3':
shopping()
elif type == '4':
transfer()
else:
print('不存在')
all_func('1') # 注册功能
all_func('2') # 登录
五、闭包函数
闭:定义在函数内部的函数
包:内部函数使用外部函数名称空间中得名字
只有同时满足以上两个条件的函数,才是闭包函数
给函数体代码传参的方式1:代码里面缺什么变量名形参里面就补什么变量名
def register(name,age):
print(f"""
姓名:{name}
年龄:{age}
""")
register('tony', 18)
给函数体代码传参的方式2:闭包函数
def outer(name, age):
# name = 'jason'
# age = 18
def register():
print(f"""
姓名:{name}
年龄:{age}
""")
return register
res = outer('tony', 18)
res()
res()
res = outer('kevin', 28)
res()
res()
六、装饰器简介
概念
在不改变被装饰对象原代码和调用方式的情况下给被装饰对象添加新的功能
本质
装饰器并不是一门新的技术 而是由函数参数、名称空间、函数名多种用法、闭包函数组合到一起的结果
def index():
print('from index')
index()
'''给index函数添加统计执行的时间'''
import time
def index():
time.sleep(3)
print('from index')
# 1. 在函数调用之前打印此时的时间
start_time = time.time()
index()
# 2. 在函数调用完毕之后的时间
end_time = time.time()
print('index函数一共执行了%s秒' % (end_time - start_time))
global与nonlocal关键字、函数名的多种用法、函数的嵌套调用、函数的嵌套定义、闭包函数、装饰器简介的更多相关文章
- 10月11日内容总结——global和nonlocal方法、函数名的多种用法、闭包函数和装饰器
目录 一.global和nonlocal方法 global方法 nonlocal方法 二.函数名的多种用法 1.函数名可以当作变量名赋值 2.函数名可以当作函数的参数 3.函数名可以当作函数的返回值 ...
- 第十七篇 Python函数之闭包与装饰器
一. 装饰器 装饰器:可以拆解来看,器本质就是函数,装饰就是修饰的意思,所以装饰器的功能就是为其他函数添加附加功能. 装饰器的两个原则: 1. 不修改被修饰函数的源代码 2. 不修改被修饰函数的调用方 ...
- 13、python中的函数(闭包与装饰器)
一.嵌套函数 函数的内部又再定义另一个函数,这个函数就叫嵌套函数,里面含函数就叫内部函数. 示例: 二.返回函数 函数可以接收函数对象作为参数,同理函数也能返回一个函数对象作为返回值. 示例: 返回函 ...
- day13(函数嵌套定义,global,nonlocal关键字,闭包,装饰器)
一,复习 ''' 1.函数对象:函数名 => 存放的是函数的内存地址 1)函数名 - 找到的是函数的内存地址 2)函数名() - 调用函数 => 函数的返回值 eg:fn()() => ...
- python第十三天,函数的嵌套定义,global,nonlocal关键字的使用,闭包及闭包的运算场景,装饰器
今日内容 1. 函数的嵌套定义 2.global,nonlocal关键字 3.闭包及闭包的运用场景 4.装饰器 函数的嵌套定义 1. 概念:在一个函数内部定义另一个函数 2 .为什么要有函数的嵌套定义 ...
- python13 1.函数的嵌套定义 2.global、nonlocal关键字 3.闭包及闭包的运用场景 4.装饰器
## 复习 '''1.函数对象:函数名 => 存放的是函数的内存地址1)函数名 - 找到的是函数的内存地址2)函数名() - 调用函数 => 函数的返回值 eg:fn()() =&g ...
- day13函数的嵌套定义,global、nonlocal关键字,闭包及闭包的运用场景,装饰器
复习 ''' 1.函数对象:函数名 => 存放的是函数的内存地址 1)函数名 - 找到的是函数的内存地址 2)函数名() - 调用函数 => 函数的返回值 eg:fn()() => ...
- python学习Day13 函数的嵌套定义、global、nonlocal关键字、闭包及闭包的运用场景、装饰器
复习 1.函数对象:函数名 => 存放的是函数的内存地址1)函数名 - 找到的是函数的内存地址2)函数名() - 调用函数 => 函数的返回值 eg:fn()() => fn的返回值 ...
- glob.glob()、os.path.split()函数、global和nonlocal关键字
1. glob.glob() glob模块是Python最简单的模块之一, 内容非常少, 用它可以查找符合特定规则的文件路径名, 查找文件时只会用到三个匹配符: * :匹配0个或多个字符 ? : 匹配 ...
- python(动态传参、命名空间、函数嵌套、global和nonlocal关键字)
一.函数的动态传参 1.*args位置参数动态传参 def chi(*food): print(food) chi("烧烤","火锅","虾吃虾涮&q ...
随机推荐
- Windows10下python3和python2同时安装(三)VS 2013配置python环境
Windows10下python3和python2同时安装(三) VS 2013配置python环境 说明:本文基于python2和python3同时安装之后,对VS 2013进行配置,下面有些地方文 ...
- 一篇文章教你实战Docker容器数据卷
在上一篇中,咱们对Docker中的容器数据卷做了介绍.已经知道了容器数据卷是什么?能干什么用.那么本篇咱们就来实战容器数据卷,Docker容器数据卷案例主要做以下三个案例 1:宿主机(也就是Docke ...
- c++11 线程池--鸿蒙OS
一个你应该学习的线程池 说明 原理:线程+优先级队列.源码没有涉及STL,没有复杂高深的语法,安全性做得很好: queue的安全使用方式top和pop以及empty的判断都是使用了 std::lock ...
- f-strings: Python字符串处理的瑞士军刀
从 3.6 开始,Python 新增了一个格式化字符串的方法,称之为 f-string. 其用法就是在python原始字符串的基础上增加 f/F 前缀,以大括号 {} 标明被替换的字段. f-stri ...
- java中的递归机制
本文主要讲述java中的递归机制. 示例1,递归代码如下: public class Recursion01 { public static void main(String[] args) { T ...
- kali安装拼音输入法
前言 最近使用kali感觉没个中文输入法的很不方便,于是决定装个ibus的拼音输入法 安装方法 1.安装ibus 使用命令apt install ibus ibus-pinyin,注意使用root权限 ...
- 12、synchronized和Lock的使用
转载自 1.多并发案例: 一个车站有三个窗口同时卖30张票,每个窗口都有40个人在排队买票,在多线程情况下,不加锁,线程不安全,导致卖票不准确 package com.example.Lock; /* ...
- [python] 基于chardet识别字符编码
对于人类能够识别的字符,计算机会根据某一对应关系将其转换为二进制形式进行保存.这个对应关系就是字符编码表,即什么样的字符对应什么样的二进制编码.这种字符编码表往往是多种多样的,因此,如果我们想要将一个 ...
- BBS升级版
BBS项目 项目的前期准备 1.django2.2 创建一个django目录 (需要配置环境变量和数据库) 'DIRS': [os.path.join(BASE_DIR, 'templates'), ...
- 《Effective C++》模版与泛型编程
Item41:了解隐式接口和编译期多态. 纵使你从未使用过templates,应该不陌生"运行期多态"和"编译期多态"之间的差异.因为它类似于"哪一个 ...