10 动态参数 命名空间和作用域 global.nonlocal

1. 动态参数

  位置参数的动态参数

def chi(*food):
    print("我要吃",food)
chi("小米粥","绿豆粥","八宝粥")                       #多个参数传递进去,收到的是元祖tuple
def func(a,b,c,*args,d=5):
    print(a,b,c,d,args)
func(1,2,3)
func(1,2,3,4,56,7)
func(1,2,3,4,5,6,7,"马大哈")

  关键字参数的动态参数

def func(**food):   # **food动态接收关键字参数
    print(food) # 接收到的是字典

func(good_food="盖浇饭", bad_food="辣条", drink="冰封")      #结果是我要吃 {'good_food': '火锅', 'bad_food': '快餐'}

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

  这个函数可以接受所有的参数(无敌)

可以接收所有的参数(无敌的)
def func(*args, **kwargs):
    print(args)
    print(kwargs)
func(1, 2, 5, 6, name="taibai",age=18, sex="不详")

  在形参上*聚合,**聚合;在实参上*打散,**打散.

# 把列表中的每一个元素作为参数, 传递给函数. 一次都传过去
def func(*args,**kwargs):                   #*表示聚合,所有的位置参数,聚合成元祖
    print(args)
    print(kwargs)
lst = ["马虎疼","大眼哥","小花生","毛尖妹妹"]
func(*lst)                                   #实参打散,迭代产生的.            #结果是('马虎疼', '大眼哥', '小花生', '毛尖妹妹')

  

def func(*args,**kwargs):                     #**表示聚合成字典
    print(args)
    print(kwargs)
dic={"name":"太白","alex":"wusir"}
func(**dic)                                   #将字典打散,以key:value的形式进行传参.

  给函数传递任意个整数,返回和.

#给函数传递任意个整数,返回和
# def func(*n):
#     s = 0
#     for i in n:
#         s = s + i
#     return s
# print(func(1,3,5,6,8))

注意点:

def func(*args, **kwargs):
    # args = (1,2,3)                    #接收的是元祖
    #kwargs = {'name':'alex,'age':23}   #接受的是字典
    print(*args)     # print(*(1,2,3))                         #print(函数中有*args对象)     打印1,2,3
    print(**kwargs)  # print(**{'name':'alex', 'age':1000})    #print(函数中没有**args对象)   报错
# 当定义一个函数的时候:* 代表 聚合.
# 当执行一个函数的时候:* 代表 打散.
func(1, 2, 3, name='alex', age=1000)

2. 命名空间和作用域:

  命名空间:

   1.内置命名空间:python解释器内部运行时的变量函数

   2.全局命名空间:我们在py文件中直接声明出来的变量,函数

   3.局部命名变量:在函数内部声明的变量和函数

  作用域:

    1.全局作用域:内置+全局

    2.局部作用域:局部

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

    locals()查看当前作用域中的名字

a = 10
def func():
    a = 20
    print(a)
    print(globals())  #globals()  获取到全局作用域(内置,全局)中的所有名字
    print(locals())   #locals()   查看当前作用域中的所有名字
func()

3. global和nonlocal

  glocal:把全局变量拿到局部来用

a = 20
def func():
    global a              #a不在是局部变量,是全局变量
    a = 30                #把全局中的a重新赋值成30
    print(a)             30
func()
print(a)          30

  nonlocal:把离他最近的一层变量拿过来,不会找全局.

a = 10
def fun1():
    a = 3
    def func2():
        nonlocal a              # 找局部作用域中 离他最近的那个变量引入进来
        a = 20
        print(a)          #结果是:20
    func2()
    print(a)              #结果是:20
fun1()

 接收n个参数,返回最大值和最小值

接收n个参数. 返回最大值和最小值(字典)
def func(*args):
    m = args[0] # 假设第0项就是最大值
    mi = args[0]
    for el in args:
        if el > m:
            m = el # 当前这个元素比假设的那个大. 记录当前这个比较大的数
        if el < mi:
            mi = el
    return {"最大值":m, "最小值":mi}

 如果默认值参数是一个可变的数据类型,如果有人调用的时候改变了他,其他的位置看到的也跟着改变了.

# 如果默认值参数是一个可变的数据类型, 如果有人调用的时候改变了他. 其他位置看到的也跟着改变了
def extendList(val, list=[]):
    list.append(val)
    return list
list1 = extendList(10)                       #列表[10],列表指向的内存地址中存有10
list2 = extendList(123, [])                  #给了一个空的列表,默认值参数改变了成[],此时向里加了[123]
list3 = extendList('a')                      #此时向列表中加a,列表指向的是同一个内存地址,所以是[10,a]
print('list1=%s' % list1)  [10,a]          #如果默认值参数是一个可变的数据类型, 如果有人调用的时候改变了他. 其他位置看到的也跟着改变了
print('list2=%s' % list2)  [123 ]
print('list3=%s' % list3)  [10,a]

 9*9乘法表

a = 1
while a <=9:
    b = 1
    while b <= a:
        print("%dx%d=%d\t" % (a, b, a*b), end="")
        b = b + 1
    print() # 换行
    a = a + 1

 考试题;

user_list=[
        {"name": "alex", "hobby": "抽烟"},
        {"name": "alex", "hobby": "喝酒"},
        {"name": "alex", "hobby": "烫头"},
        {"name": "wusir", "hobby": "喊麦"},
        {"name": "wusir", "hobby": "街舞"},
        {"name": "alex", "hobby": "泡吧"},
        {"name":"太白", "hobby":"开车"}
         ]
# [{"name": "alex", "hobby_list": ["抽烟","喝酒","烫头","泡吧"]},{"name": "wusir", "hobby_list": ["喊麦", "街舞"]},]

result = [] # {'name': 'alex', 'hobby_list': ['抽烟']}
for user in user_list:
    # 1.判断是否在result里面存在了这个人, 如果存在. 把hobby_list添加一个hobby
    # 2.不存在. 创建一个新字典
    for new_user in result:
        if user['name'] == new_user['name']:
            new_user['hobby_list'].append(user['hobby'])
            break
    else:
        dic = {}
        dic["name"] = user['name']
        dic['hobby_list'] = [user['hobby']]
        result.append(dic)
print(result)

  

  

 

 

posted @ 2018-07-13 16:51  ...绿茵  阅读(190)  评论(0编辑  收藏  举报
1