动态参数、名称空间、作用域

动态参数

形实参数量

相等

  当实参数量与形参数量相等时,参数传递正常。

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的更多相关文章

  1. 动态参数 名称空间 作用域 作用域链 加载顺序 函数的嵌套 global nonlocal 等的用法总结

    03,动态参数 *args,**kwargs # 用户传入到函数中的实参数量不定时,或者是为了以后拓展,# 此时要用到动态参数*args,**kwargs(万能参数.)# *args接收的是所有的位置 ...

  2. Day 10 动态参数&名称空间,局部全部.函数嵌套&global nonlocal关键字.

    一.动态参数#形参 有3种动态参数#*args 动态参数,不定长参数def func (*args): print(args,type(args))func(1,2,"alex", ...

  3. 函数的名称空间,函数的嵌套(global, nonlocal),函数名的运用

    一 函数的名称空间 内置空间:存放python解释器内置函数的空间 全局空间:py文件运行时开辟的,存放的是执行的py文件(出去函数内部)的所有的变量与值的对用关系,整个py文件结束后才会消失. 局部 ...

  4. python基础之函数参数,名称空间,以及函数嵌套

    函数进阶内容梗概: 1. 函数参数--动态传参 2. 名称空间, 局部名称空间, 全局名称空间, 作⽤用域, 加载顺序. 3. 函数的嵌套 4. gloabal , nonlocal 关键字 1. 函 ...

  5. Python——day11 函数(对象、名称空间、作用域、嵌套、闭包)

    一.函数对象  函数名就是存放了函数的内存地址,存放了内存地址的变量都是对象,即 函数名 就是 函数对象  函数对象的应用 1. 可以直接被引用  fn = cp_fn 2 .可以当作函数参数传递 c ...

  6. 【0809 | Day 12】可变长参数/函数的对象/函数的嵌套/名称空间与作用域

    可变长参数 一.形参 位置形参 默认形参 二.实参 位置实参 关键字实参 三.可变长参数之* def func(name,pwd,*args): print('name:',name,'pwd:',p ...

  7. python函数:函数参数、对象、嵌套、闭包与名称空间、作用域

    今天的内容整理共有5部分 一.命名关键字参数 二.函数对象 三.函数的嵌套 四.名称空间与作用域 五.闭包函数 一.命名关键字参数 # 命名关键字参数: 在定义函数时,*与**之间参数称之为命名关键字 ...

  8. python--函数的返回值、函数参数的使用、名称空间与作用域、函数嵌套、函数对象

    今天学习内容有函数的返回值.函数参数的使用.名称空间与作用域.函数嵌套. 下来我们一一查看. 函数的返回值 看几个栗子: def func(x): y=func() print(y) def foo( ...

  9. python--函数、参数、名称空间与作用域、匿名函数、内置函数、闭包

    python函数 函数定义 def welcome(): print('hello world!!') welcome() #函数调用 ...运行结果 hello world!! 函数定义和编写原则: ...

随机推荐

  1. 排序算法之折半插入排序的思想以及Java实现

    1 基本思想 折半插入排序(binary insertion sort)的基本原理与直接插入排序相同,不同之处在于,确定当前记录在前面有序子数组中的位置时,直接插入排序是采用顺序查找的方法,而折半插入 ...

  2. Apache中httpd.conf文件的详解

    PHP中,Apache的配置至关重要,特别是httpd.conf这个文件,它是Apache中的核心文件.好了,废话不说,今天将这个文件中的一些内容讲解一番. ServerRoot "d:/w ...

  3. LeetCode算法题-First Unique Character in a String(Java实现)

    这是悦乐书的第213次更新,第226篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第81题(顺位题号是387).给定一个字符串,找到它中的第一个非重复字符并返回它的索引. ...

  4. 查看linux系统是运行在物理机还是虚拟机方法

    Windows:在CMD里输入:Systeminfo | findstr /i "System Model"如果System Model:后面含有Virutal就是虚拟机,其他都是 ...

  5. ant.design React使用Echarts,实力踩坑

    最近项目用到Echarts(以下用ec代替),于是照猫画虎得引入到团队的antd项目中,但是遇到2个棘手问题: 1. ec对dom不渲染,检查后发现,原来是全局存在id重复,所以使用React时,最好 ...

  6. Java(使用JNA)调用DLL库与C#调用DLL库的对比

    前言:在项目中经常使用DLL库对硬件进行操作,在发卡过程中使用频率尤为多,今天就Java与C#中调用DLL库的使用区别做一个介绍,本文着重具体的代码编写,具体过程看以下代码. 前提条件: 笔者已经封装 ...

  7. Python中的单例模式——装饰器实现剖析

    Python中单例模式的实现方法有多种,但在这些方法中属装饰器版本用的广,因为装饰器是基于面向切面编程思想来实现的,具有很高的解耦性和灵活性. 单例模式定义:具有该模式的类只能生成一个实例对象. 先将 ...

  8. L2-012 关于堆的判断 (25 分)

    就是一个最小根堆. 最小根堆的性质,根节点小于等于子树的完全二叉树吧. 构建最小根堆的过程就是一个自下向上的过程. #include<iostream> #include<strin ...

  9. 路飞学城-Python开发集训-第4章

    学习心得: 学习笔记: 在python中一个py文件就是一个模块 模块好处: 1.提高可维护性 2.可重用 3.避免函数名和变量名冲突 模块分为三种: 1.内置标准模块(标准库),查看所有自带和第三方 ...

  10. firewall

    翻译 public (active) 公共(防火墙) target: default 目标: 默认 icmp-block-inversion: no ICMP块反演:NO interfaces: et ...