传参,命名空间,作用域

传参(动态传参,关键字传参,无敌传参,以及传参的顺序)   ,     命名空间     ,     作用域的问题    ,    函数的嵌套   ,   关键字global和nonlocal

 

动态传参, 可以接收任意的参数
顺序: 位置参数 *args 默认值参数 **kwargs

位置参数的动态传参 写法: *参数名 例如: *args
接收的参数是tuple类型

def eat(*food):
    print(food)
eat("盖浇饭", "麻辣烫", "冰封")
#结果:('盖浇饭', '麻辣烫', '冰封')

 




位置参数要放在前面,默认值参数要放在动态参数后面
def func(a, b, c, *args, d=110):
    print(a, b, c,args,d)
func(1, 4, 7, 3, 6, 9,12,3,3)
#结果:1 4 7 (3, 6, 9, 12, 3, 3) 110

 







关键字参数
# 关键字参数           接出来是字典
def eat(**kwargs):
    print (kwargs)
eat(a="大树林",b="小树林",c="小路")
#结果:{'a': '大树林', 'b': '小树林', 'c': '小路'}

 






无敌传参,什么都能接
def yu(*args,**kwargs):
    print (args,kwargs)
yu(1,2,3,4,a="we",b="bn")

 





*打散
def eat(*fruit):    # 聚合成元组
    print(fruit)

lst = ["香蕉", "茄子", "黄瓜", "辣椒", "大白梨"]
eat(*lst)   # 这里的*表示的是把lst打散
#结果:('香蕉', '茄子', '黄瓜', '辣椒', '大白梨')
# 打散后形成元组

 




**打散
def eat(**kwargs):  #  把所有的关键字参数聚合成字典
    print(kwargs)
dic = {"a":1, "b":2, "c":3}
eat(**dic)  # 打散字典,依次传参
# 结果:{'a': 1, 'b': 2, 'c': 3}

 





命名空间

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

加载顺序:
1. 内置命名空间

2. 全局命名空间
3. 局部命名空间(函数被执⾏行行的时候)

 

取值顺序:
1. 局部命名空间
2. 全局命名空间
3. 内置命名空间

#
a = 10
def func():
    a = 20
    print(a)
func()
#结果:20

 






作用域的问题
1. globals() 获取全局作用域中的内容

2. locals() 获取局部作用域中的内容

global: 寻找全局作用域中的内容
nonlocal: 寻找上一级作用域中的内容, 但不能是全局的


a = 10  # 全局
def func(): # 全局
    a = 40  # 局部
    b = 20  # 局部
    def abc():  # 局部
        d = 30 # 是局部
        print("哈哈")
        print(a, b) # 这⾥使⽤的是局部作⽤域
        print(locals())
    abc()

    # print(globals()) # 打印全局作用域中的内容
    # print(locals()) # 打印局部作用域中的内容,locals()打印当前这个函数局部作用与中的内容
func()

print(globals())
# print(globals()) # 打印全局作用域中的内容

 





函数的嵌套

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

def fun2():
    print(222)
    def fun3():
        print(666)
    print(444)
    fun3()
    print(888)
print(33)
fun2()
print(555)
#结果:
# 33
# 222
# 444
# 666
# 888
# 555

 

 

关键字global和nonlocal

首先我们写这样一个代码, 首先在全局声明一个变量, 然后再局部调用这个变量, 并改变这
个变量的值

global

a=10
def func():
    global a      # 加了个global表示不再局部创建这个变量了. 而是直接使用全局的a
func()
print (a)
nonlocal调用上一级,且不能是全局
a = 10
def func1():
    a = 20
    def func2():
        nonlocal a          #nonlocal调用上一级,且不能是全局
        a = 30
        print(a)
    func2()
    print(a)
func1()
#结果:30
     #30

 

 

#求最大值和最小值的其中一种写法

# 求最大值和最小值的另一种写法
def func(*args):
    m=args[0]   #假设args里面第0项就是最大值
    mi=args[0]  #假设args里面第0项就是最小值
    for i in args:
        if i > m:
            m = i       #循环出来当前的元素比假设的元素大,就记录当前这个元素,以此类推,最后得到的是最大的值
        if i < mi:
            mi = i      #循环出来当前的元素比假设的元素小,就记录当前这个元素,以此类推,最后得到的是最小的值
    return m,mi
print(func(1,2,3,4,5,45,6,7,78))

 

 

知识点补充

def extendList(val, list=[]):      #这里的定义的一个空列表其实是一个指向,指向内存中的这个列表,而不是每次添加都创建一个新列表
    list.append(val)
    return list
list1 = extendList(10)      #第一次传进去val等于10,然后append添加到列表中,列表里面装的就是10
print('list1=%s' % list1)   # list = [10]

list2 = extendList(123, [])     #第二次传进去123,[],传进去的有一个空列表123就被添加到自己这个空列表中了
print('list2=%s' % list2)   #

list3 = extendList('a') # list = [10, 'a']      #最后传入一个a,因为列表中已经有一个10 了 ,所以a就被追加到10后面了
print('list3=%s' % list3)

 

posted @ 2018-06-12 15:18  惊世风情  阅读(220)  评论(0编辑  收藏  举报