一、动态参数(不定长参数)def func(*args):

形参: 3种 动态参数
args元组,他包含了你所有的位置参数.
*args 动态参数,不定长参数
**kwargs 他包含了关键字动态参数

*rarge用法
def func(*args):
print(args,type(args))
func(1,2,'alex',3,4,5,6,8,4,7,2)

结果

*args按位置对应不能放到,其他形参位置前边

def func(*args,a,b,c):
print(a)
print(b)
print(c)
print(args,type(args))
func(1,2,'alex',3,4,)

结果

正确用法

def func(a,b,c,*args):
print(a)
print(b)
print(c)
print(args,type(args))
func(1,2,'alex')

结果

位置参数,*args,默认参数,**kwargs
def func(a,b,c,sex = '男',*args):
print(a)
print(b)
print(c)
print(sex)
print(args,type(args))
func(1,2,'alex','wusir','ritian '

结果

sex='男’被wusir覆盖

def func(a,b,c,*args,sex = '男'):
print(a)
print(b)
print(c)
print(sex)
print(args,type(args))
func(1,2,'alex','wusir','ritian ',sex='女')

结果

**kwargs的用法

def func(**kwargs):
print(kwargs)
func(a = 1,b = 4,c = 3,d = 2)

结果

def func(a,b,c,*args,sex = '男',**kwargs):
print(a)
print(b)
print(c)
print(sex)
print(args,type(args))
print(kwargs)
func(1,2,'alex','wusir','ritian ',sex = '女',name = 'taibai',age = 21)

结果

*args,**kwargs万能参数

def func2(*args,**kwargs):
#万能参数
print(args)
print(kwargs)
func2(1,2,3,5,name='alex',age=56)

结果

*rags加法计算器

def my_sum(*args):
count = 0
for i in args:
count += i
return count
print(my_sum(1,2,3,6,78))
print(sum([1,2,3]))

结果

*魔法运算:打散

def func2(*args,**kwargs):
print(args)
#(1,2,3)
l1 = [1,2,3,]
l2 = [1,2,3,2,3,100,2]
func2(*l2,*l1)

结果

def func3(*args,**kwargs):
print(args)
print(kwargs)
dic = {'name':'alex','age':12}
dic2 = {'name':'jin','age':22}
func3(**{'name1':'alex','age1':12},**{'name2':'jin','age2':22},name3 = 'wusir')

结果

def func3(*args,**kwargs):
print(args)
print(kwargs)
dic = {'name':'alex','age':12}
dic2 = {'name':'jin','age':22}
func3(**{'name1':'alex','age1':12},**{'name2':'jin','age2':22},name3 = 'wusir')

结果

 

二、名称空间

名称空间: 

等执行到函数调用的时候,Python解释器会再开辟一块内存来储存这个函数里面的内容,这个时候,才关注函数里面有哪些变量,而函数中的变量回储存在新开辟出来的内存中,函数中的变量只能在函数内部使用,并且会随着函数执行完毕,这块内存中的所有内容也会被清空。我们给这个‘存放名字与值的关系’的空间起了一个名字-------命名空间。



全局名称空间:代码在运行伊始,创建的存储“变量名与值的关系”的空间叫做

局部名称空间:在函数的运行中开辟的临时的空间
内置名称空间:内置命名空间中存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的,拿过来就可以用的方法。
name = 1
def func():
n = 2
print(666)
print(n)

结果:因为n不在全局名称空间,所以找不到。

加载顺序:内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)

取值顺序:

  在局部调用:局部命名空间->全局命名空间->内置命名空间

  在全局调用:全局命名空间->内置命名空间

综上所述,在找寻变量时,从小范围,一层一层到大范围去找寻。

加载顺序:
内置名称空间 ---> 全局名称空间 ----> 局部名称空间(执行函数时)
取值顺序:
先从局部名称空间找----> 全局名称空间找----->内置名称空间找
name = 'wusir'
def func():
name = 'alex'
print(name)
func() 

结果:

def len(x):
return x print(len([1,2,3]))

结果

作用域的角度:
全局作用域 全局名称空间,内置名称空间
局部作用域 局部名称空间,
 'wusir'
def func():
name = 'alex'
# print(name)
print(globals())
print(locals())
func() print(globals())
print(locals())

结果

三 函数的嵌套

#局部找全局的函数名可以找到
def fun1():
print(111)
def fun2():
print(222)
fun1()
fun2()
print(111)

结果:

def fun2():
print(222)
def fun3():
print(666)
print(444)
fun3()
print(888)
print(333)
fun2()
print(555)

结果

四 global(翻译:全球)全局变量与nonlocal(翻译:外地)

作用域

作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。

全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效

局部作用域:局部名称空间,只能在局部范围生效

globals和locals方法

在全局调用

print(globals())
print(locals())

在局部调用

def func():
a = 12
b = 20
print(locals())
print(globals()) func()

global关键字,nonlocal关键字。

global:

  1,声明一个全局变量。

  2,在局部作用域想要对全局作用域的全局变量进行修改时,需要用到 global(限于字符串,数字)。

ps:对可变数据类型(list,dict,set)可以直接引用不用通过global。

def func():
global a
a = 3
func()
print(a) count = 1
def search():
global count
count = 2
search()
print(count)
global 1,声明一个全局变量
#引用全局变量,并改变
def func():
global a
a = 2
print(a)
func()
print(a)

结果:

l1 = [1,2,3]
def func():
l1.append(444)
func()
print(l1)

结果

nonlocal:

  1,不能修改全局变量。

  2,在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。

nonlocal的用法:

a = 1
def func():
nonlocal a
a = 2
print(a)
func()

结果:报错

父级函数
def func():
name = 'wusir'
def inner():
nonlocal name
name = 'taibai'
print(name)
print(name)
inner()
print(name)
func()

结果:

def add_b():
b = 42
def do_global():
b = 10
print(b)
def dd_nonlocal():
nonlocal b
b = b + 20
print(b)
dd_nonlocal()
print(b)
do_global()
print(b)
add_b()
10 30 30 42

结果:

函数的动态参数与命名空间 day10的更多相关文章

  1. 自学python day 10 函数的动态参数、命名空间、作用域

    作业提升: s为字符串 s.isalnum() 所有字符都是字母或者数字 s.isalpha() 所有字符都是字母 s.isdigit() 所有字符否是数字 2. for i in range(1,1 ...

  2. 百万年薪python之路 -- 函数的动态参数

    1.函数的动态参数 1.1 动态接收位置参数 在参数位置用*表示接受任意参数 def eat(*args): print('我想吃',args) eat('蒸羊羔','蒸熊掌','蒸鹿尾儿','烧花鸭 ...

  3. 百万年薪python之路 -- 函数的动态参数练习

    1.继续整理函数相关知识点. 2.写函数,接收n个数字,求这些参数数字的和.(动态传参) def func(*args,**kwargs): num_sum = 0 num_dic = [] num ...

  4. Python函数02/函数的动态参数/函数的注释/名称空间/函数的嵌套/global以及nolocal的用法

    Python函数02/函数的动态参数/函数的注释/名称空间/函数的嵌套/global以及nolocal的用法 目录 Python函数02/函数的动态参数/函数的注释/名称空间/函数的嵌套/global ...

  5. python 函数的动态参数 命名空间,作用域以及函数嵌套,global和nonlocal (重点)

    *** 坚持坚持,即使你不太强*** 1.函数的动态传参 2.函数的命名空间及作用域 3.函数嵌套 4.global和nonlocal关键字 一.函数的动态传参 1. *args: 位置参数动态传参, ...

  6. day11函数的进阶动态参数,命名空间,作用域,第一类对象

    一.习题收藏 5.写函数,计算传入字符串中[数字].[字母].[空格] 以及 [其他]的个数,并返回结果. # def func4(s): # dic = { # 'num':0,'alpha':0, ...

  7. python27期day10:函数的动态参数、函数的注释、函数的名称空间、函数的嵌套、global(修改全局的)、nonlocal(修改局部的)、函数名的第一类对象及使用、作业题。

    1.动态参数的作用: 能够接收不固定长度参数 位置参数过多时可以使用动态参数 * args是程序员之间约定俗称(可以更换但是不建议更换) * args获取的是一个元组 ** kwargs获取的是一个字 ...

  8. 函数补充:动态参数,函数嵌套,global与nonlocal关键

    一丶动态参数 1.*args 位置参数,动态传参 def func(*food): print(food) print(func("米饭","馒头"," ...

  9. PYTHON 函数的动态参数

    #普通参数示例 def func(args): print(args) func(123456) #执行结果为123456 如果给多个参数,就会报错 #动态参数示例 def func(*args): ...

随机推荐

  1. [jQ]jQuery显式操作Checkbox,并用数组存储关联值的方案

    ---------------------------------------------------------------------------------------------------- ...

  2. C# Excel转换为Json

    demo:https://files.cnblogs.com/files/guxingy/Excel%E8%BD%AC%E6%8D%A2%E4%B8%BAJson%E5%AF%B9%E8%B1%A1. ...

  3. openstack常用命令

    共享镜像 glance member-create fa47923c-2d3b-4d71-80cf-a047ba3bf342 eb3913b9ae5f41b09f2632389a1958d8删除共享镜 ...

  4. MDI窗体容器

    Mdi是一个窗体容器控件,直接在新建好的窗体里面,将此窗体设置为Mdi容器,开启了Mdi容器的窗体里面,如果有点击事件打开新窗体,则这些新窗体会在此窗体内部的Mdi容器中打开 操作步骤: 1.首先先新 ...

  5. pipy国内镜像的网址

    pipy国内镜像目前有:豆瓣 http://pypi.douban.com/simple/阿里云 http://mirrors.aliyun.com/pypi/simple/中国科技大学 https: ...

  6. Error:Error: Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle) instead [ValidFragment]

    原文博客链接:https://blog.csdn.net/chniccs/article/details/51258972 在创建fragment时,你可能在打包时碰到如下错误 Error:Error ...

  7. PasteDeploy部署Pecan API 服务

    part 1:请求处理 使用PasteDeploy模块来实现 WSGI Services 时,都需要加载一个 paste.ini 文件,文件用来定义服务过滤和请求路由,类似于springMvc的拦截器 ...

  8. Dao层向sql语句传递多个参数

    手动封装: serviceImpl层 Map<String, Object> params = new HashMap<String, Object>(2);params.pu ...

  9. meta标签的使用

    meta标签是html标记head区的一个关键标签,它位于HTML文档的<head>和<title>之间(有些也不是在<head>和<title>之间) ...

  10. HibernateDaoSupport类的使用(转)

    看到一篇很好描述HibernateDaoSupport类使用的例子,特此在这和大家分享一下 核心提示:1. 继承了HibernateDaoSupport类的类获取session时,已不可用Sessio ...