zoukankan      html  css  js  c++  java
  • 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	" % (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)
    

      

      

     

  • 相关阅读:
    剑指offer 31.时间效率 整数中1出现的次数(从1到n整数中1出现的次数)
    剑指offer 30.时间效率 连续子数组的最大和
    ElasticSearch 数据路由原理+增删改查内部原理+写一致性原理以及quorum机制
    剑指offer 29.时间效率 最小的K个数
    剑指offer 28.时间效率 数组中出现次数超过一半的数字
    剑指offer 27.分解让复杂问题简单 字符串的排列
    ElasticSearch 并发冲突+悲观锁与乐观锁+基于_version和external version进行乐观锁并发控制
    剑指offer 26.分解让复杂问题简单 二叉搜索树与双向链表
    Spfa+DP【p2149】[SDOI2009]Elaxia的路线
    Dfs【bzoj3252】攻略
  • 原文地址:https://www.cnblogs.com/gyh412724/p/9305946.html
Copyright © 2011-2022 走看看