python中的命名空间以及函数的嵌套
一.动态传参
函数的形参中除了默认值参数和位置参数外,还有动态传参.当不确定形参有几个或者有很多的时候,就可以使用动态传参.
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中的命名空间以及函数的嵌套的更多相关文章
- 13.Python中的命名空间是什么
Python中的命名空间是什么? In Python,every name introduced has a place where it lives and can be hooked for. T ...
- Python之路Python全局变量与局部变量、函数多层嵌套、函数递归
Python之路Python全局变量与局部变量.函数多层嵌套.函数递归 一.局部变量与全局变量 1.在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量.全局变量作用域是整个程序,局 ...
- Python 函数式编程 & Python中的高阶函数map reduce filter 和sorted
1. 函数式编程 1)概念 函数式编程是一种编程模型,他将计算机运算看做是数学中函数的计算,并且避免了状态以及变量的概念.wiki 我们知道,对象是面向对象的第一型,那么函数式编程也是一样,函数是函数 ...
- Python中的高阶函数与匿名函数
Python中的高阶函数与匿名函数 高阶函数 高阶函数就是把函数当做参数传递的一种函数.其与C#中的委托有点相似,个人认为. def add(x,y,f): return f( x)+ f( y) p ...
- python中enumerate()函数用法
python中enumerate()函数用法 先出一个题目:1.有一 list= [1, 2, 3, 4, 5, 6] 请打印输出:0, 1 1, 2 2, 3 3, 4 4, 5 5, 6 打印输 ...
- Python中str()与repr()函数的区别——repr() 的输出追求明确性,除了对象内容,还需要展示出对象的数据类型信息,适合开发和调试阶段使用
Python中str()与repr()函数的区别 from:https://www.jianshu.com/p/2a41315ca47e 在 Python 中要将某一类型的变量或者常量转换为字符串对象 ...
- Python中sort和sorted函数代码解析
Python中sort和sorted函数代码解析 本文研究的主要是Python中sort和sorted函数的相关内容,具体如下. 一.sort函数 sort函数是序列的内部函数 函数原型: L.sor ...
- Python中进制转换函数的使用
Python中进制转换函数的使用 关于Python中几个进制转换的函数使用方法,做一个简单的使用方法的介绍,我们常用的进制转换函数常用的就是int()(其他进制转换到十进制).bin()(十进制转换到 ...
- python --- 10 *args **kwargs 命名空间 作用域 函数的嵌套
函数进阶 1. "*" 和 "**" ① 在形参位置时 都是聚合的作用 *args 位置参数→元组 **kwargs 关键字参数→字典 混 ...
随机推荐
- elasticsearch-jdbc
jprante/elasticsearch-jdbc The Java Database Connection (JDBC) importer allows to fetch data from JD ...
- 11991 - Easy Problem from Rujia Liu?(的基础数据结构)
UVA 11991 - Easy Problem from Rujia Liu? 题目链接 题意:给一个长度n的序列,有m询问,每一个询问会问第k个出现的数字的下标是多少 思路:用map和vector ...
- Java--Vector类
Java Vector 类 Vector类实现了一个动态数组.和ArrayList和相似,但是两者是不同的: Vector是同步访问的. Vector包含了许多传统的方法,这些方法不属于集合框架. V ...
- 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 ...
- python 获取字典值
一.Python中的字典遍历方法: info = { 'name':'xiaoming', 'sex':'nan', 'age':20, 'id':1} info2 = { 'name':'hhh', ...
- eclipes中配置javadoc文档
- wpf控件设计时支持(2)
原文:wpf控件设计时支持(2) 这篇介绍在wpf设计时集合项属性添加项的定义和自定义控件右键菜单的方法 集合项属性设计时支持 1.为集合属性设计器识别具体项类型 wpf设计器允许定义集合项的类型,如 ...
- matlab Tricks(二十七)—— 可变输入参数输出参数的适配
matlab 内置的对 varargin/varargout(nargin/nargout)的支持,使得 matlab 的输入参数和输出参数,有了更为灵活的传递和使用: 比如对于 matlab 原生支 ...
- Linux性能测试 free命令
命 令: free功能说明:显示内存状态.语 法: free [-bkmotV][-s <间隔秒数>]补充说明:free指令会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存 ...
- android反射组件 (一个)java 它们的定义annotation基础知识
它们的定义annotation它由三部分组成: 它们的定义annotation.使用annotation班.annotation的处理方法. 一.自己定义annotation 元注解包含下面: 1) ...

