zoukankan      html  css  js  c++  java
  • 第十一天-函数进阶

    # 动态传参:

    # * 表示接收所有 位置参数 的动态传参
    # 传参时自动把实参打包成 元祖 给形参
     1 def chi(*food):
     2     print(food)
     3     return food
     4 
     5 chi()  # 动态传参可以为空不传参
     6 # chi("紫菜汤",food="鸡蛋汤") # * args 不可接收关键字参数
     7 
     8 chi("鸡蛋汤","紫菜汤","疙瘩汤")
     9 chi("鸡蛋汤","紫菜汤","疙瘩汤","海带炖猪肉","小鸡炖蘑菇") # 返回一个元祖
    10 # ('鸡蛋汤', '紫菜汤', '疙瘩汤', '海带炖猪肉', '小鸡炖蘑菇')
    # ** 表示接收 关键字参数 的动态传参
    # 把实参打包成 字典 传给形参
    1 def chi1(**food):
    2     print(food)
    3 
    4 chi1(good_food="哈哈",junk_food="呵呵",drink="嘻嘻") # 返回一个字典
    5 # {'good_food': '哈哈', 'junk_food': '呵呵', 'drink': '嘻嘻'}
    6 # chi1("哈哈","呵呵","吼吼")  # TypeError  ** kwargs 不可接收位置参数
    # 参数顺序  位置》*args》默认值》**kwargs   可以任意组合


    # 无敌参数
    1 # 无敌参数
    2 def num(*args,**kwargs):
    3     print(args,kwargs)
    4 
    5 num(1,2,3,4,5,6,a="7",b="8",c="9")
    6 # (1, 2, 3, 4, 5, 6) {'a': '7', 'b': '8', 'c': '9'}
     1 lis = [1,2,3,4,5,6,7]
     2 def fun(*args): # 在形参表示聚合多个
     3     print(args)
     4 
     5 fun(lis[0],lis[1],lis[2],lis[3],lis[4],lis[5],lis[6])
     6 fun(*lis) # 省去多次输入完全等同于上面 把一个 列表/字符/元祖 打散成参数传给形参
     7 s = "2018年10月30日19:50:39"
     8 fun(*s)  # 在实参表示打散
     9 
    10 dic = {"张无忌":"倚天屠龙记", "乔峰":"天龙八部", "郭靖":"射雕"}
    11 def fun1(**kwargs):  # 聚合
    12     print(kwargs)
    13 
    14 # fun1(张无忌=dic['张无忌'],乔峰="天龙八部")
    15 fun1(**dic) # 把字典 打散 成关键字参数 传给形参 省去上面一个个输入
    16 
    17 # 可得出结论  *, ** : 在形参: 聚合, 实参: 打散
    # 命名空间  三种:
    # 定义:我们称存放名字和值的关系的空间叫做命名空间

    # 内置命名空间 —— python解释器
    # python解释器启动就可使用的名字 存储在内置命名空间 如:print() input() list tuple 等
    # 内置的名字在解释器启动的时候被加载进内存
    # 全局命令空间 —— 写的代码
    # 程序从上到下被执行的过程中依次加载进内存的
    # 放置了我们所色设置的变量名和函数名
    # 局部命名空间 —— 函数 类, 方法, 其他模块, 对象
    # 函数内部定义的名字
    # 调用函数的时候 才会产生空间 随着函数执行结束清空被回收

    # 在局部:可以使用全局、内置命名空间的名字
    # 在全局:可以使用内置,不可使用局部
    # 在内置:不可使用局部和全局的名字
     1 # 在全局调用:全局命名空间->内置命名空间
     2 def fun():
     3     a = 10
     4     print(a)
     5 
     6 fun()  # a随函数执行完毕已清空
     7 # print(a) # name 'a' is not defined 全局不可使用局部
     8 
     9 # 在局部调用:局部命名空间->全局命名空间->内置命名空间
    10 a = 1
    11 def func(x):
    12     x = a
    13     print(x)
    14 
    15 func(10) # 打印 1  局部可调用全局
    16 
    17 # 在内置命名空间:不可往下调用 因为运行前已经加载完成
    # 内置——》全局——》局部  (依赖倒置关系:可逆不可顺)


    # 加载顺序:内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)
    # 作用域:作用域就是作用范围,按照生效范围来看分:全局作用域和局部作用域

    # 全局作用域:
    # 包含内置命名空间和全局命名空间,在整个文件任何位置都可使用(遵循从上到下逐行执行)

    # 局部作用域:在函数内部可使用.

    # 作用域命名空间:
    # 全局作用域: 全局命名空间+内置命名空间
    # 局部作用域: 局部命名空间

    # 可通过globals()函数来查看全局作用域中的内容,也可以通过locals()来查看局部作用域中的变量和函数信息

     1 a = 10
     2 def func():
     3     a = 40
     4     b = 20
     5     def abc():
     6         print("哈哈")
     7     print(a,b)
     8     print(globals())  # 查看全局作用域(内置+全局)内容
     9     print(locals())  # 查看局部作用域(函数 模块 对象等内部)内容
    10 
    11 func()
    12 
    13 # 从局部找全局可以. 但是从全局找局部是不可以的
    1 # 实例
    2 def print(*args):  # 声明函数名 print 非内置print
    3     pass
    4     # print(args) # maximum recursion depth exceeded 自己调用自己 递归 这里会报错
    5 
    6 def func():
    7     print("呵呵")
    8 
    9 func()  # 无返回值  调用函数 func 但里面的print不是内置的,因此去上层找全局命名 print 自然是pass
    # 函数嵌套
    # 1.只要遇见了()就是函数的调用.如果没有()就不是函数的调用
    # 2.函数的执行顺序
     1 def fun2():
     2     print(222)
     3     def fun3():
     4         print(666)
     5     print(444)
     6     fun3()
     7     print(888)
     8 print(33)
     9 fun2()
    10 print(555)
    11 
    12 '''
    13 33
    14 222
    15 444
    16 666
    17 888
    18 555
    19 '''
    20 
    21 # 一个一个去套
    #  关键字global和nonlocal
    
    
    # 全局变量在局部, 可以用, 但是, 不能改
    1 # 全局变量在局部, 可以用, 但是, 不能改
    2 a = 10
    3 def func():
    4     # #a = 20  # 并没有改变全局变量,   创建了一个自己的变量
    5     # a = a + 10  # 报错 因为全局变量可能是公共的 改变之后影响其他调用
    6     print(a)
    7 
    8 func()
    9 print(a)

     

    #  global表示.把变量从全局引入进来
     1 a = 10
     2 def func():
     3     global a # 直接从全局把变量强制拉进来 可改了 后续调用 a 都是改变后的值
     4     a = a + 10
     5     print(a)
     6 func() # 20
     7 print(a) # 20
     8 
     9 
    10 
    11 # global 其他应用 (很少用)
    12 def func():
    13     global a  # 可以创建(升华)一个局部变量为全局变量
    14     a = 30
    15 
    16 func()
    17 print(a) # 30
    # nolocal 在局部,引入上一层名称空间中的名字. 如果上一层没有, 继续上一层 .....
     1 def outer():
     2     a = 10
     3     def inner():
     4         nonlocal a # 把上一层的a拉过来 改变 在局部内的后续调用也跟着改变
     5         a = 20
     6         print(a)
     7     print(a)  # 10
     8     inner()   # 20
     9     print(a)  # 20
    10 outer()
    11 
    12 
    13 # 例子
    14 a = 1
    15 def fun_1():
    16     a = 2
    17     def fun_2():
    18         nonlocal a
    19         a = 3
    20         def fun_3():
    21             a = 4
    22             print(a)
    23         print(a)
    24         fun_3()
    25         print(a)
    26     print(a)
    27     fun_2()
    28     print(a)
    29 print(a)
    30 fun_1()
    31 print(a)
    32 
    33 #  1234331





  • 相关阅读:
    迭代器
    逻辑量词
    How to distinguish between strings in heap or literals?
    Is the “*apply” family really not vectorized?
    power of the test
    The Most Simple Introduction to Hypothesis Testing
    析构函数允许重载吗?
    C++中析构函数的作用
    在C#中的构造函数和解析函数
    c++构造函数与析构函数
  • 原文地址:https://www.cnblogs.com/xi1419/p/9880178.html
Copyright © 2011-2022 走看看