动态参数、名称空间、作用域
动态参数
形实参数量
相等
当实参数量与形参数量相等时,参数传递正常。
def func1(a, b, c):
pass
func1(1, 2, 3)
不等
当实参数量与形参数量不相等时,则会报错。
def func1(a, b, c):
pass
func1(1, 2, 3, 4, 5, 6, 6)
形参
用户传入到函数中的实参数量不确定时,或者为了以后扩展,此时要用到动态参数 *args、**kwargs(万能参数)。
顺序
形参中所有参数的完整排序为:位置参数,*args,默认参数,**kwargs。当然,不是所有的函数都会将这些所有的参数都是用到,有些就是使用其中的几种。
参数
*args
*args用来接收所有的位置参数。例如:
def func(*args, **kwargs):
print(args)
print(kwargs)
func(1, 2, 3, 4)
其输出结果为:
注意:print()里面的args前面不能带 * 。
**kwargs
**kwargs接收所有的关键字参数。例如:
def func(*args, **kwargs):
print(args)
print(kwargs)
func(x=4, y=5, z=6)
打印结果:
注意:print()里面的kwargs前面不能带 * 。
def func(*args, **kwargs):
print(args)
print(kwargs)
func(1, 2, 3, x=4, y=5, z=6)
使用方式
位置参数,默认参数
位置参数,默认参数
def func2(a, b, sex = '男'):
print(a)
print(b)
print(sex)
func2(1, 2, '女')
位置参数、*args、默认参数
位置参数、*args、默认参数
def func2(a, b,*args, sex = '男'):
print(a)
print(b)
print(args)
print(sex)
func2(1, 2, 5,6,7,8,9, sex='女')
位置参数、*args、默认参数、**kwargs
位置参数、*args、默认参数、**kwargs
def func2(a, b, *args, sex='男',age=20, **kwargs):
print(a)
print(b)
print(args)
print(sex)
print(age)
print(kwargs)
func2(1, 2, 5, 6, 7, 8, 9, x=6, y=5, name='alex')
注意
单纯运行如下函数不会报错。
def func(*args,**kwargs):
pass func()
*的魔性用法
聚合
* 在函数定义的时候,代表聚合。
加法器
使用*args简单实现加法器,如下:
def sum1(*args):
ret = 0
for i in args:
ret += i
return ret
print(sum1(1, 2, 3,))
结果:
实例二:
def func3(*args, **kwargs):
print(args)
print(kwargs)
l1 = [1, 2, 3]
l2 = [11, 21, 32]
func3(l1, l2)
def func3(*args,**kwargs):
print(args) func3(1, 2, 3, 1, 2, 3, 11, 22, 33)
def func3(*args,**kwargs):
print(args)
print(kwargs) func3(1,2,3,1,2,3,11,22,33)
print()函数无法接收动态参数,所以当print(**kwargs)时就会报错。
def func1( **kwargs):
print(**kwargs) func1(**{'name':'alex'})
打散
*在函数的执行的时候,代表打散。
def func3(*args, **kwargs):
print(args)
print(kwargs)
l1 = [1, 2, 3]
tu1 = (1, 2, 3)
tu2 = (11, 22, 33)
func3(*l1, *tu1, *tu2)
def func3(*args,**kwargs):
print(args)
print(kwargs)
l1 = [1, 2, 3]
dic ={'name': 'alex'}
dic1 ={'age': 1000}
func3(*l1, **dic, **dic1)
def func3(*args,**kwargs): # 函数的定义 *用意是聚合。
print(args)
print(kwargs)
l1 = [1, 2, 3]
tu1 = (1, 2, 3)
tu2 = (11, 22, 33)
func3(*l1, *tu1, *tu2)
def func3(*args,**kwargs):
print(args)
print(kwargs)
l1 = [1, 2, 3]
dic ={'name': 'alex'}
dic1 ={'age': 1000}
func3(*l1, **dic, **dic1)
名称空间
名称空间包括内置名称空间、全局名称空间、局部名称空间。
空间名称
当程序运行时,代码从上至下一次读取,遇到变量与值,它会在内存中开辟一个空间,存放变量与值的内存地址的对应关系。这样存储变量与值得对应关系的空间叫做名称空间(命名空间)。
临时空间名称
当解释器遇到函数时,他会将函数名存储在内存中,但是对于函数体莫不关心。当函数执行时,他会通过函数名找到函数体,然后将函数体里面的变量等对应关系存放在一个临时开辟的空间中,随着函数的结束,临时的空间关闭,这样的空间叫做临时名称空间。
作用域
全局作用域
全局作用域包括内置名称空间、全局名称空间。
局部作用域
局部作用域包括局部名称空间。
加载顺序
内置名称空间 -----> 全局名称空间(程序运行时) -----> 局部名称空间(函数执行时)
取值顺序
局部名称空间(函数执行时) -----> 全局名称空间(程序运行时) -----> 内置名称空间
执行顺序
当代码运行时,从上至下依次执行。
name = 'girl' def func1():
global name
name = 'alex' func1() print(name)
global、nonlocal
global
- 声明一个全局变量;
- 更改一个全局变量。
nonlocal
- 不能改变一个全局变量;
- 在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。
def add_b():
b = 42 def do_global(): b = 10
print(b) # b = 10 def dd_nonlocal(): nonlocal b
b = b + 20
print(b) # b = 30
dd_nonlocal()
print(b) # b = 30
do_global()
print(b) # b = 42 add_b()
Python_动态参数、名称空间、作用域、作用域链、加载顺序、函数的嵌套、global、nonlocal的更多相关文章
-
动态参数 名称空间 作用域 作用域链 加载顺序 函数的嵌套 global nonlocal 等的用法总结
03,动态参数 *args,**kwargs # 用户传入到函数中的实参数量不定时,或者是为了以后拓展,# 此时要用到动态参数*args,**kwargs(万能参数.)# *args接收的是所有的位置 ...
-
Day 10 动态参数&;名称空间,局部全部.函数嵌套&;global nonlocal关键字.
一.动态参数#形参 有3种动态参数#*args 动态参数,不定长参数def func (*args): print(args,type(args))func(1,2,"alex", ...
-
函数的名称空间,函数的嵌套(global, nonlocal),函数名的运用
一 函数的名称空间 内置空间:存放python解释器内置函数的空间 全局空间:py文件运行时开辟的,存放的是执行的py文件(出去函数内部)的所有的变量与值的对用关系,整个py文件结束后才会消失. 局部 ...
-
python基础之函数参数,名称空间,以及函数嵌套
函数进阶内容梗概: 1. 函数参数--动态传参 2. 名称空间, 局部名称空间, 全局名称空间, 作⽤用域, 加载顺序. 3. 函数的嵌套 4. gloabal , nonlocal 关键字 1. 函 ...
-
Python——day11 函数(对象、名称空间、作用域、嵌套、闭包)
一.函数对象 函数名就是存放了函数的内存地址,存放了内存地址的变量都是对象,即 函数名 就是 函数对象 函数对象的应用 1. 可以直接被引用 fn = cp_fn 2 .可以当作函数参数传递 c ...
-
【0809 | Day 12】可变长参数/函数的对象/函数的嵌套/名称空间与作用域
可变长参数 一.形参 位置形参 默认形参 二.实参 位置实参 关键字实参 三.可变长参数之* def func(name,pwd,*args): print('name:',name,'pwd:',p ...
-
python函数:函数参数、对象、嵌套、闭包与名称空间、作用域
今天的内容整理共有5部分 一.命名关键字参数 二.函数对象 三.函数的嵌套 四.名称空间与作用域 五.闭包函数 一.命名关键字参数 # 命名关键字参数: 在定义函数时,*与**之间参数称之为命名关键字 ...
-
python--函数的返回值、函数参数的使用、名称空间与作用域、函数嵌套、函数对象
今天学习内容有函数的返回值.函数参数的使用.名称空间与作用域.函数嵌套. 下来我们一一查看. 函数的返回值 看几个栗子: def func(x): y=func() print(y) def foo( ...
-
python--函数、参数、名称空间与作用域、匿名函数、内置函数、闭包
python函数 函数定义 def welcome(): print('hello world!!') welcome() #函数调用 ...运行结果 hello world!! 函数定义和编写原则: ...
随机推荐
-
Git/GitHub 初用体验与总结
Git,一个神奇而又陌生的东西,居然到现在才去了解它,就像有一位仁兄说的,现在不会用Git真的都不好意思说自己搞IT的. 简单的讲,这Git是目前最先进的分布式版本控制系统,和他相对应的就是众所周知的 ...
-
express+gulp构建项目(一)项目目录结构
express是基于nodejs平台的web框架,它可以让我们快速开发出web引用.而gulp是一种自动构建工具,非常强大,有了它,能帮我们完成很多繁琐的工作,例如,静态文件的压缩,为静态文件加上哈希 ...
-
cvBox2D和RotatedRect中返回的角度angle详解
本文为作者原创,未经允许不得转载: 原文由作者发表在博客园: http://www.cnblogs.com/panxiaochun/p/5478555.html 关于cvBox2D和RotatedRe ...
-
【iCore3 双核心板】例程二十七:DMA LAN实验——高速数据传输测速
实验指导书及代码包下载: http://pan.baidu.com/s/1o7qnCUI iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...
-
连续最短路算法(Successive Shortest Path)(最小费用最大流)
#include <cstdio> #include <cstring> #include <queue> #include <vector> #inc ...
-
Codevs 1287 矩阵乘法&;&;Noi.cn 09:矩阵乘法(矩阵乘法练手题)
1287 矩阵乘法 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 小明最近在为线性代数而头疼, ...
-
第二百五十二天 how can I 坚持
明天就要去旅游了...还不知道去哪呢,只知道要滑雪,要泡温泉,还要去西柏坡..哈哈. 其他没什么了吧.只是昨晚刷的鞋还没干,不知道明天会不会干,明天还得早走会,九点之前就得到. 还不知道坐车坐多长时间 ...
-
form表单中的带有name的标签直接转JSON
1. 将如下内容引入页面:比如说新建一个 a.js,然后在页面中引入a.js//将form表单序列化成json格式 $.fn.serializeObject = function () { var o ...
-
Linux0.11 创建进程的过程分析--fork函数的使用
/* * linux/kernel/fork.c * * (C) 1991 Linus Torvalds */ /* 注意:signal.c和fork.c文件的编译选项内不能有vc变量优化选项/Og, ...
-
一些常用的 std 类型
[std::allocator] 标准库中包含一个名为allocator的类,允许我们将分配和初始化分离.使用allocator通常会提供更好的性能和更灵活的内存管理能力. 标准库allocator类 ...