博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python记录_day10 动态传参 命名空间 作用域
阅读量:5327 次
发布时间:2019-06-14

本文共 2150 字,大约阅读时间需要 7 分钟。

一、动态传参

动态传参用到 *args 和 **kwargs ,*号表示接收位置参数,args是参数名;**表示接收关键字参数,kwargs是参数名

1 def chi(*food): 2     print(food)    #('胡辣汤', '油条', "豆浆") 3     print(*food)   #'胡辣汤', '油条', "豆浆 4 chi("胡辣汤","油条","豆浆") 5  6  7 def chi(**food): 8     print(food)    9 10 chi(food1="胡辣汤",food2 = "油条",food3="豆浆")11 #结果  {'food1': '胡辣汤', 'food2': '油条', 'food3': '豆浆'}

参数顺序: 位置参数,*args, 默认值参数,**kwargs

无敌传参:可以接收任何参数

1 #无敌传参示例2 def func(*args, **kwargs):   #可以是任何参数3        pass4 5 func("位置参数",kw ="关键字参数")

注意:*号在形参位置表示聚合,在实参位置表示打散  ,字典打散用两个**

def func(*args): #形参位置  聚合    print(args)lst = [1,2,3]t = (22,33)func(*lst,*t)  #实参位置 将列表和元组打散了#结果  (1, 2, 3, 22, 33)def fun(**kwargs):  #形参位置,聚合     print(kwargs)dic1 = {
"name":"alex","gender":"男"}dic2 = {
"age":"1000"}fun(**dic1,**dic2) #实参位置, 字典打散# 结果 {'name': 'alex', 'gender': '男', 'age': '1000'}dic1 = {
"name":"alex","age":"30"}dic2 = {
"age":"1000"}fun(**dic1,**dic2) #这是会报错,因为两个字典中有重复的key,一个key对应多个值

二、命名空间和作用域

在python解释器开始执行之后, 就会在内存中开辟一个空间, 每当遇到一个变量的时候, 就把变量名和值之间的关系记录下来,

我们给存放名字和值的关系的空间起了个名字叫:命名空间。我们的变量在存储的时候就 是存储在这片空间中的。

 

分为内置命名空间、全局命名空间、局部命名空间

内置空间存储python解释器内置的东西,全局空间放py文件中函数外声明的变量,局部空间放函数内声明的变量

顺序:

文件加载时

  先加载内置空间,再全局,最后局部(函数调用时才用到)

在取值的时

先从局部空间找,然后是全局空间,最后是内置空间

 

作用域

作用域就是作用范围, 按照生效范围来看分为 全局作用域和局部作用域

全局作用域: 内置空间+全局空间的变量

局部作用域:局部空间的变量

 

查看作用域:

  globals()  查看全局作用域中的变量名字

  locals() 查看当前作用域中的变量名字  (可以用在全局也可以用在局部)

三、函数的嵌套

1. 注意函数的执行顺序

2. 只要遇到了()就是函数的调用. 如果没有()就不是函数的调用

四、golbal和nonlocal关键字

golbal关键字  表示引入全局变量 arg,如果全局变量中没有arg就在局部声明这个变量为全局变量

nonlocal关键字  表示在局部 引入上一层空间的变量,如果上一层没有继续找上一层,都没有时报错。

1 a = 100 2 def func(): 3     print(a)  # 取值时可以取全局变量,逐层往上找 4 func() 5  6 def func(): 7     a = 28  # 想要修改时会报错,局部空间不能直接修改全局变量 8     print(a) 9 func()10 --------------11 a = 10012 def func():13     global a   # 加了个global表示不在局部创建这个变量了. 而是直接使用全局的a14     print(a)   #10015     a = 28  #这时就能在局部空间修改全局变量了16     print(a)   #2817 func()18 print(a)  #2819 20
golbal
1 a = 10 2 def func1(): 3     a = 20 4     def func2(): 5         nonlocal a  #找上一层的a  a = 20 6         a = 30     #将a =20 修改为 a =30 7         print(a)  #30 8     func2() 9 print(a) #1010 func1()
nonlocal

 

转载于:https://www.cnblogs.com/zhang-yl/p/9879922.html

你可能感兴趣的文章
jmeter-The JVM should have exitted but did not
查看>>
结对第二次
查看>>
【学习分享】温水里的程序员,技术将成为温水。
查看>>
markdown编辑器使用建议
查看>>
Android系统自带样式(android:theme)(转)
查看>>
js offset
查看>>
开通博客园第一天jq,css,net之bs开发,ui开发求虐求交流
查看>>
内部类+迭代器设计模式的java实现。。。
查看>>
网络管理
查看>>
java+适配器模式 实现自己的迭代器...
查看>>
Qt界面设计1
查看>>
面试题7:用两个栈实现队列
查看>>
int类型的整数转换成汉字
查看>>
Macbook下安装memcached
查看>>
websocket使用nginx作为反向代理
查看>>
java基础之路(一)
查看>>
Linux 2.6.x fs/pipe.c local kernel root(kit?) exploit (x86)
查看>>
android 开发 View_10_ Path之基本操作[转载]
查看>>
利用LineRenderer画出一个圆,类似于lol中的攻击范围
查看>>
Unity3D性能优化--- 收集整理的一堆
查看>>