一.动态传参

函数的形参中除了默认值参数和位置参数外,还有动态传参.当不确定形参有几个或者有很多的时候,就可以使用动态传参.

1.1 动态接收位置参数

在python中使用*来接收动态位置参数

 def chi(*food):    #只有动态参数
print('我要吃',*food)
chi('饭','肉','鱼') #我要吃 饭 肉 鱼 def chi(a,b,*food): #动态参数和位置参数
print('我要吃',*food)
chi('饭','肉','鱼','桃子','苹果') #我要吃 鱼 桃子 苹果 def chi(*food,a,b):
print('我要吃',*food)
chi('饭','肉','鱼','桃子','苹果') #chi() missing 2 required keyword-only arguments: 'a' and 'b'
#★动态参数必须在位置参数的后面,否则就全被动态参数给收了 def chi(a,b,*food,c='哈哈'): #动态参数和位置参数和默认值参数
print('我要吃',*food,c)
chi('饭','肉','鱼','桃子','苹果') #我要吃 鱼 桃子 苹果 哈哈
#★顺序位置参数,动态参数,默认值参数

1.2动态接收关键字参数

在python中使用**来接收动态关键字参数

 def chi(**food):     #只有动态关键字参数
print(food)
chi(a='收到',b=1,c=6) #{'a': '收到', 'b': 1, 'c': 6} def chi(a,b,**food): #动态关键字参数和位置参数
print(a,b,food)
chi('sd','zc',n='收到',z=1,x=2) # 3sd zc {'n': '收到', 'z': 1, 'x': 2} def chi(a,b,c='哈哈',**food): #动态关键字参数和位置参数和默认值参数
print(a,b,c,food)
chi('sd','zc',n='收到',z=1,x=2) #sd zc 哈哈 {'n': '收到', 'z': 1, 'x': 2}

★★★最终顺序:位置参数>*args>默认值参数>**kwargs★★★

这四种参数可以任意的进行使用

如果想接受所有的参数:

 def func(*args,**kwargs):   #无敌
print(args,kwargs)
func(0,1,2,'及',a=1,b=2,c='积极') #(0, 1, 2, '及') {'a': 1, 'b': 2, 'c': '积极'}
##############接收到的动态位置参数保存在元组中,接收到的动态关键字参数保存在字典中############

1.3 打散和聚合

 def func(*args):
print(args)
lis=[1,2,3,4,5]
func(lis) #([1, 2, 3, 4, 5],) ##################将一个可迭代对象打碎需要在这个可迭代对象前加*#######################
def func(*args):
print(args)
lis=[1,2,3,4,5]
func(*lis) #(1, 2, 3, 4, 5) #如果是字典 def func(**kwargs):
print(kwargs)
dic={1:'a',2:'b',3:'c',4:'d',5:'e'}
func(**dic) #TypeError: func() keywords must be strings打散之后变成了1='a'不符合逻辑 ##################这里字典的键只能是字符串类型#################### def func(**kwargs):
print(kwargs)
dic={'A':'a','B':'b','C':'c','D':'d','E':'e'}
func(**dic) #{'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd', 'E': 'e'} #########################形参的位置*,**: 聚合;实参的位置*,**: 打散#############################

1.4 函数的注释

 #在函数名下且只能在函数名下,输入多行注释即可产生
def func(**kwargs):
'''
这个位置写当前函数是干什么的
:param kwargs: kwargs参数是什么意思
:return: 返回值是什么玩意
'''
print(kwargs)
dic={'A':'a','B':'b','C':'c','D':'d','E':'e'}
func(**dic)

二.命名空间

2.1

在python解释器开始运行之后,就会在内存中开辟一个空间,每当遇到一个变量的时候,就会把变量名和值之间的关系记录下来,当遇到函数定义的时候,解释器只是把函数的名读入内存,表示这个函数存在了,至于函数内部的变量和逻辑,解释器是不关心的,也就是说,一开始函数只是加载进来,只有当函数被调用或访问的时候,解释器才会根据函数内部声明的变量开辟内存空间,但是,随着函数的执行完毕,这些函数内部变量占用的空间也会随着函数的执行完毕而被清空.

 def func():
a=10
print(a)
func()
print(a) #此时的a不存在

命名空间 :存放名字和值之间的空间

命名空间的分类:

1.全局命名空间:函数外声明的变量都属于全局命名空间

2.局部命名空间:在函数中声明的变量会放在局部命名空间

3.内置命名空间:python解释器为我们提供的名字,list,tuple......

加载顺序:

1.内置命名空间

2.全局命名空间

3.局部命名空间

2.2作用域就是作用范围.

1.全局作用域

2.局部作用域

 a=10
def func():
a=40
b=20
def abc():
print('哈哈')
print(a,b)
print(globals()) # 'a': 10, 'func': <function func at 0x0000025C198F2EA0>
print(locals()) # 'b': 20, 'a': 40
func()
#####通过globals()函数来查看全局作用域中的内容,通过locals()函数来查看局部作用域中的内容

2.3 关键字global和nonlocal

global: 在局部访问全局中的内容
nonlocal: 在局部寻找外层函数中离他最近的那个变量
以上是有nonlocal的情况:
一下是没有nonlocal的情况:

python中的命名空间以及函数的嵌套的更多相关文章

  1. 13.Python中的命名空间是什么

    Python中的命名空间是什么? In Python,every name introduced has a place where it lives and can be hooked for. T ...

  2. Python之路Python全局变量与局部变量、函数多层嵌套、函数递归

    Python之路Python全局变量与局部变量.函数多层嵌套.函数递归 一.局部变量与全局变量 1.在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量.全局变量作用域是整个程序,局 ...

  3. Python 函数式编程 & Python中的高阶函数map reduce filter 和sorted

    1. 函数式编程 1)概念 函数式编程是一种编程模型,他将计算机运算看做是数学中函数的计算,并且避免了状态以及变量的概念.wiki 我们知道,对象是面向对象的第一型,那么函数式编程也是一样,函数是函数 ...

  4. Python中的高阶函数与匿名函数

    Python中的高阶函数与匿名函数 高阶函数 高阶函数就是把函数当做参数传递的一种函数.其与C#中的委托有点相似,个人认为. def add(x,y,f): return f( x)+ f( y) p ...

  5. python中enumerate()函数用法

    python中enumerate()函数用法 先出一个题目:1.有一 list= [1, 2, 3, 4, 5, 6]  请打印输出:0, 1 1, 2 2, 3 3, 4 4, 5 5, 6 打印输 ...

  6. Python中str()与repr()函数的区别——repr() 的输出追求明确性,除了对象内容,还需要展示出对象的数据类型信息,适合开发和调试阶段使用

    Python中str()与repr()函数的区别 from:https://www.jianshu.com/p/2a41315ca47e 在 Python 中要将某一类型的变量或者常量转换为字符串对象 ...

  7. Python中sort和sorted函数代码解析

    Python中sort和sorted函数代码解析 本文研究的主要是Python中sort和sorted函数的相关内容,具体如下. 一.sort函数 sort函数是序列的内部函数 函数原型: L.sor ...

  8. Python中进制转换函数的使用

    Python中进制转换函数的使用 关于Python中几个进制转换的函数使用方法,做一个简单的使用方法的介绍,我们常用的进制转换函数常用的就是int()(其他进制转换到十进制).bin()(十进制转换到 ...

  9. python --- 10 *args **kwargs 命名空间 作用域 函数的嵌套

    函数进阶 1.   "*"  和  "**" ① 在形参位置时   都是聚合的作用 *args    位置参数→元组 **kwargs   关键字参数→字典 混 ...

随机推荐

  1. elasticsearch-jdbc

    jprante/elasticsearch-jdbc The Java Database Connection (JDBC) importer allows to fetch data from JD ...

  2. 11991 - Easy Problem from Rujia Liu?(的基础数据结构)

    UVA 11991 - Easy Problem from Rujia Liu? 题目链接 题意:给一个长度n的序列,有m询问,每一个询问会问第k个出现的数字的下标是多少 思路:用map和vector ...

  3. Java--Vector类

    Java Vector 类 Vector类实现了一个动态数组.和ArrayList和相似,但是两者是不同的: Vector是同步访问的. Vector包含了许多传统的方法,这些方法不属于集合框架. V ...

  4. Python Tricks(二十一)—— 排列组合的计算

    使用循环: 阶乘的实现: def fac(n): r = 1. for i in range(1, n+1): r *= i return r 排列:Anm=m!n!=(m−n+1)⋯m def pe ...

  5. python 获取字典值

    一.Python中的字典遍历方法: info = { 'name':'xiaoming', 'sex':'nan', 'age':20, 'id':1} info2 = { 'name':'hhh', ...

  6. eclipes中配置javadoc文档

  7. wpf控件设计时支持(2)

    原文:wpf控件设计时支持(2) 这篇介绍在wpf设计时集合项属性添加项的定义和自定义控件右键菜单的方法 集合项属性设计时支持 1.为集合属性设计器识别具体项类型 wpf设计器允许定义集合项的类型,如 ...

  8. matlab Tricks(二十七)—— 可变输入参数输出参数的适配

    matlab 内置的对 varargin/varargout(nargin/nargout)的支持,使得 matlab 的输入参数和输出参数,有了更为灵活的传递和使用: 比如对于 matlab 原生支 ...

  9. Linux性能测试 free命令

    命 令: free功能说明:显示内存状态.语 法: free [-bkmotV][-s <间隔秒数>]补充说明:free指令会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存 ...

  10. android反射组件 (一个)java 它们的定义annotation基础知识

    它们的定义annotation它由三部分组成: 它们的定义annotation.使用annotation班.annotation的处理方法. 一.自己定义annotation  元注解包含下面: 1) ...