day10 参数args kwargs 作用域
函数参数/作用域/args/kwargs
1.参数
1.1参数基本知识
- 任意个数 
- 任意类型 - func("1",True)
 
1.2位置传参(调用函数并传入参数)
def func(a1,a2):
  pass
func(1)#缺少位置参数
func(1,2,3)#多了位置参数
1.3关键字传参
def func(a1,a2):
  pass
func(a2=99,a1=2)#根据形参名字传入值
1.4关键字传参和位置传参可以混合使用
注意:位置参数在前 关键字参数在后,总和参数个数要和函数参数个数相等
def func(a1,a2,a3):
  pass
func(1,a2=3,a3=9)#根据形参名字传入值
func(a1=1,3,9)#报错 关键字参数在前
func(1,a1=2,a3=9)#报错  a1得到多个值
func(1,a2=0,9)#报错  关键字在前
1.5默认参数[定义]
参照open()函数
注意:如果默认值是可变类型
def func(a1,a2=9)#a2可传可不传
		pass
func(1,2)#给a2传新值 覆盖默认值
func(1)#默认a2=9
1.6 万能参数(*args)—>arguments 多个参数
- args:接受n个位置参数 
- 可以接受任意类型参数,并转换为元组 
- 调用时候无* - #args循环遍历每个位置参数 一个一个放入args中 并转换为元组
 def func(*args):
 print(args) func(1) # (1,)
 func(1, 2, 3) # (1,2,3)
 func(1, 2, [1, 23], "True", "alex")
 func((1, 2, 3))
 # 该元组作为一个单元素传入 -->元组嵌套((1,2,3),))
 #(1,)
 # (1, 2, 3)
 # (1, 2, [1, 23], 'True', 'alex')
 # ((1, 2, 3),))
- 调用时有:直接将后面的位置参数转换为元组 - def func(*args):
 print(args) func(*(1, 2, 3)) # 打散传入元组 变成多个变量传入args -->(1,2,3)
 func(*[1, 2, 3]) # args原理是 循环遍历每个元素 添加到元组中(1,2,3)
 #(1, 2, 3)
 #(1, 2, 3)
 
- 只能用位置传参 
 def func(a1,*args,a2):
 pass
 func(1,2,3,4,a2=0)#a2只能关键字传参
 #a1=1 args=(2,3,4)
1.7键值万能参数(**kwargs)
- 接收任意个关键字参数 - def func(**kwargs):
 print(kwargs) func(k1=1,k2="gao")#kwargs={"k1":1,"k2":"gao"}
- 调用时有* - def func(**kwargs):
 print(kwargs)
 func(**{"k1":1,"k2":"gao"})#kwargs=kwargs={"k1":1,"k2":"gao"}
 
- 调用时候无* - def func(**kwargs):
 print(kwargs)
 func(k1=1,k2="gao")#kwargs={"k1":1,"k2":"gao"}
- 只能用关键字传参 
- 综合应用 - def func(*args,**kwargs):
 print(args,kwargs)
 func(*[1,2,3],k1=2,k5=9,k19=999)#(1,2,3) {"k5":9,"k19":999}
 func(*[1,2,3],**{"k1":"1","k2":2})#(1,2,3){"k1":"1","k2":2}
 func(11,22,*[1,2,3],k11=333,k33="bb")#(11,22,1,2,3) {"k11":333,"k3":"bb"}
 - #5.看代码写结果 # def func(name,age=19,email='123@qq.com'):
 # pass # a. 执行 func('alex') ,判断是否可执行,如可以请问 name、age、email 的值分别是?
 #可行 name=alex age=19 email=123@qq.com # b. 执行 func('alex',20) ,判断是否可执行,如可以请问 name、age、email 的值分别是?
 #可行 name:alex age:20 email:123@qq.com # c. 执行 func('alex',20,30) ,判断是否可执行,如可以请问 name、age、email 的值分别是?
 #可行 name:alex age:20 email:30 # d. 执行 func('alex',email='x@qq.com') ,判断是否可执行,如可以请问 name、age、email 的值分别是?
 #可行 name:alex age:19 email:x@qq.com # e. 执行 func('alex',email='x@qq.com',age=99) ,判断是否可执行,如可以请问 name、age、email 的值分别是?
 #alex 99 x@qq.com # f. 执行 func(name='alex',99) ,判断是否可执行,如可以请问 name、age、email 的值分别是?
 #不可行 关键字参数在前 位置参数在后 # g. 执行 func(name='alex',99,'111@qq.com') ,判断是否可执行,如可以请问 name、age、email 的值分别是?
 #不可行
练习
c. 请将执行函数,并实现让args的值为 ([11,22],33) 且 kwargs的值为{'k1':'v1','k2':'v2'}
def func(*args,**kwargs):
    print(args)
    print(kwargs)
val=func([11,22],33,k1="v1",k2="v2")
val1=func(*[[11,22],33],k1="v1",k2="v2")
#第一种:传入多个位置参数 循环遍历加入args后 变成元组
#第二种:类似强制转换方式   tuple([[11,22],33])将*后面的转换为元组
([11, 22], 33)
{'k1': 'v1', 'k2': 'v2'}
#————————————————————————————————————————————————————————
([11, 22], 33)
{'k1': 'v1', 'k2': 'v2'}
2.作用域
2.1全局作用域
2.1局部作用域
2.3总结
- 一个函数是一个作用域 - def func():
 x=9
 print(x)
 func()
 print(x)#报错
 
- 作用域中查找数据规则:优先自己作用域查找,再去自己父级作用域查找,直到找到全局作用域为止 - x=10
 def func():
 x=9
 print(x)#9
 func()
 print(x)#10
 - 注意:函数的调用顺序
 - x = 10 def func():
 x = 8
 print(x) # 8 def func2():
 x = 999
 print(x) # 999 print(x) # 8
 func2() func() # 执行 8 8 999- #
 x = 10 def func():
 x = 8
 print(x) # 8 def func2():
 x = 999
 print(x) # 999 print(x) # 8
 func2() #
 print(x) # 8
 #func2函数执行完毕后 内部局部变量x被销毁掉 所以不会对自己内部的变量进行重新赋值 func() # 执行8 8 999 8
- 子作用域中只是读取或者修改【列表类型等可变类型】父级作用域的值,【默认】无法为父级的变量重新赋值 ,子作用域只是在自己内部重新开辟一块空间,为该变量赋值。但是通过添加global /nonlocal 关键字可以为父级的指定变量重新赋值 - NUM=[1,2,3]
 def func():
 #NUM.append(999)#可以修改父级可变类型的值
 print(NUM)#[1,2,3,999]
 
- global :找到全局作用域中的变量 - name = "gao" def func():
 name = "chen"
 print(name) # chen def func2():
 global name # 找到全局变量name
 name = "gao_chen"#为全局变量的name重新赋值
 print("val:" + name) # func2内部的name gao_chen print(name) # func 内部的chen
 func2() #
 print(name) # chen func() # 函数执行
 print(name) # gao_chen 内部函数通过global修改lname的值 #chen
 #chen
 #val:gao_chen
 #chen
 #gao_chen
- nonlocal :找到父级作用域中指定变量 ,【必须是父级作用域 不包括全局作用域】 
- 如果父级(父级的父级…..)作用域中不存在 则报错 - name = "gao" def func():
 name = "chen"
 print(name) # chen def func2():
 nonlocal name # 找到父级作用域的name(func中的name)
 name = "gao_chen"
 print("val:" + name) # gao_chen print(name) # chen
 func2() #
 print(name) # gao_chen func() #
 print(name) # gao- name = "gao" def func():
 print(name) def func2():
 nonlocal name #报错 可以是父级,父级的父级 但是不能是全局
 name = "gao_chen"
 print("val:" + name) print(name)
 func2()
 print(name) func() #
 print(name) #SyntaxError: no binding for nonlocal 'name' found name = "gao" def func():
 name = "hahahaha"
 print(name) # hahahaha def func2():
 print("val:" + name) # val:hahahaha def inner():
 nonlocal name#不报错 父级的父级的name
 name = "test" inner() print(name) # hahahaha
 func2()
 # 其内部函数inner()也会被func2执行 因为inner()内部定义nonlocal关键字
 # 所以父级作用域的func()函数的name会被重新赋值
 print(name) # test 被局部修改 func() #
 print(name) # gao 没有被改变
 #hahahaha
 #hahahaha
 #val:hahahaha
 #test
 #gao
- 全局变量尽量大写 
3.总结
- 函数类型 - def func()
- def func(a1,a2=None)
- def func(*args,**kwargs)
 
- 函数参数 - 形参 - def func()
- def func(a1,a2=None)
- def func(*args,**kwargs)
 
- 实参 - 位置传参 
- 关键字传参 
- 传参规则: 位置参数在前,关键字参数在后
- 默认参数 
- 万能传参 - *args:位置传参—>可传任意类型 ——>都会转为元组 - 调用函数时候有*
- 调用函数时候没有*
 
- **kwargs:关键字传参——>转为字典 - 调用函数时候有*
- 调用函数时候没有*
 
 
 
 
- 作用域 - 局部和全局 
- 一个函数一个作用域 
- 作用域查找规则: - 自己没有父级 父级再找父级,父级都没有找全局
- 自己->父级->父级->全局[读/修改(可变)]
- 子作用域内不能为父级作用域内的变量重新赋值 只能读取或者修改[可变类型]
 
- 重新赋值: - global
- nonlocal
 
 
- 函数嵌套 
day10 参数args kwargs 作用域的更多相关文章
- python之动态参数 *args,**kwargs和命名空间
		一.函数的动态参数 *args,**kwargs, 形参的顺序1.你的函数,为了拓展,对于传入的实参数量应该是不固定,所以就需要用到万能参数,动态参数,*args, **kwargs 1,*args ... 
- python之动态参数 *args,**kwargs(聚合,打散--转载
		转自https://www.cnblogs.com/ellisonzhang/p/10243122.html 一.函数的动态参数 *args,**kwargs, 形参的顺序 1.你的函数,为了拓展,对 ... 
- python可变参数*args, **kwargs
		python可变参数*args, **kwargs def foo(* args, ** kwargs): print ' args = ', args print ' kwargs = ', k ... 
- python之动态参数 *args,**kwargs(聚合,打散)
		一.函数的动态参数 *args,**kwargs, 形参的顺序1.你的函数,为了拓展,对于传入的实参数量应该是不固定,所以就需要用到万能参数,动态参数,*args, **kwargs 1,*args ... 
- 动态参数(*args,**kwargs),命名空间和作用域,global和nonlocal,函数的嵌套
		1. 动态参数 位置参数的动态参数: *args 关键字参数的动态参数 : **kwargs 顺序: 位置,*args,默认值,**kwargs 在形参上*聚合, **聚合 在实参上*打散, **打散 ... 
- python 中参数*args, **kwargs
		def func(*args, **kwargs): print 'args : ', args print 'kwargs :', kwargs def test(): func(1,2,'x',' ... 
- python 位置参数和关键字参数 *args **kwargs
		#!/usr/bin/env pythondef foo(*args,**kwargs): print('args: {0}'.format(args)) print('kwargs {0}'.for ... 
- python函数参数*args **kwargs
		毕业多年,把C++都就饭吃了....今天居然在纠结什么是形参什么是实参..... 定义函数里面写的参数就是形参,因为没有内存占用,实际调用时写的参数就是实参,因为有内存占用和传值 然后就是位置参数,可 ... 
- 函数动态参数 *args **kwargs
		def f1(*args,**kwargs): print(args,type(args)) print(kwargs,type(kwargs))li = [11,22,33]dic = {'k1': ... 
随机推荐
- I2C 上拉电阻选择计算公式
			I2C接口上拉电阻的选择 - I2C接口上拉电阻的选择 1.I2C接口的输出端是漏极开路或集电极开路,所以必须在接口外接上拉. 2.上拉电阻的范围很宽,但也需要跟据功耗.信号上升时间等具体确定. 和速 ... 
- 棋牌平台开发教程之扎金花大小比较算法在php中的实现
			PHP中扎金花比大小如何实现 在棋牌游戏中,不管是现实的还是线上的,扎金花无疑是最热门棋牌游戏之一,鄙人从小就酷爱扎金花,机缘巧合后面从事了IT行业,话不多说,直接进去正题吧. 扎金花两副牌的比较规则 ... 
- ERROR: Cannot load message class for [speech_control/command]. Are your messages built?
			ubuntu14.04 ROS indigo 问题: 执行查看指定消息的命令,出现下面的错误提示,找不到该消息类型. ~$ rostopic echo /speech/command ERROR: C ... 
- GC 是什么? 为什么要有GC?
			C/C++中由程序员进行对象的回收像学校食堂中由学生收盘子,.Net 中由GC 进行垃圾回收像餐馆中店员 去回收. GC 是垃圾收集器(Garbage Collection).程序员不用担心内存管理, ... 
- s5p6818开发板uboot网络开通
			手上的开发板网络默认是不通的,但是通过阅读uboot源码,发现uboot源码中,是有对这个网络的初始化的实现的函数的,只不过是没有调用而已,所以,要手动调用这个函数,把板子的网络调通: 首先是遇到了这 ... 
- tp5.0中使用PHPexcel,以及Loader的一些问题
			在5.0中使用PHPexcel遇到一些问题,记录一下方便以后查看. 非使用PHPexcel的方法: 参考:http://blog.csdn.net/sinat_35861727/article/det ... 
- ORACLE视图简单创建和使用
			1.创建 create view v (pdate,goodsId,productionId,qty)列名 as select p.pdate,p.goodsId,p.productionId,sum ... 
- java中的异常处理问题。
			异常处理--基本概念 当出现程序无法控制的外部环境问题(用户提供的文件不存在,文件内容损坏,网络不可用...)时,JAVA就会用异常对象来描述. java中用2种方法处理异常: 1.在发生异常的地方直 ... 
- org.springframework.cloud FeignInterceptor
			package org.rx.feign; import org.apache.commons.lang3.ArrayUtils; import org.aspectj.lang.Proceeding ... 
- 前端开发【第四篇: Dom操作】
			文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口.它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式.我们最为关心的是,DOM把 ... 
