2.函数初级知识

1. 函数参数--动态传参 

 之前我们说过了传参, 如果我们需要给一个函数传参, 而参数又是不确定的. 或者我给一个 函数传很多参数, 我的形参就要写很多, 很麻烦, 怎么办呢. 我们可以考虑使用动态参数.

动态参数分成两种: 

1. 动态接收位置参数 

def chi(*food): #在形参这里把传过来的参数进行聚合,聚合成元组
    print(food)
chi("小白菜")
chi("小白菜","咸鸭蛋")
chi("爆米花","咸鸭蛋","辣白菜")
chi("小米粥","花生米","咸鸭蛋","辣白菜")

2. 动态接收关键字参数 

def func(**kwargs):  # ** 聚合返回字典
    print(kwargs)
func(1, 2, 3, "呵呵")  # 报错 TypeError: func() takes 0 positional arguments but 4 were given
func(a = 1, b = 2, c = 3,haha = "呵呵") 

最终顺序

位置参数 >  *args > 默认值参数 > **kwargs 

无敌传参

def func(*args, **kwargs): #arguments参数 keyword-arguments关键字参数
pass

2. 作用域和名称空间

名称空间

用来存放名字(变量, 函数名, 类名, 引入的模块名)的

def fun():
    a = 10
    print(a) 
fun() 
print(a) # a不存在了已经.. 

1. 全局命名空间--> 我们直接在py文件中, 函数外声明的变量都属于全局命名空间

2. 局部命名空间--> 在函数中声明的变量会放在局部命名空间

3. 内置命名空间--> 存放python解释器为我们提供的名字, list, tuple, str, int这些都是内置命名空间

名称空间可能会有无数个, 局部名称空间而言. 相对是独立的一般互不干扰

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

3.作用域:

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

globals() 查看全局作用域
locals() 查看当前作用域

def chi():
     a = 20
     b = 30
     print(locals()) # 打印局部作用域中的内容 
     print(globals()) # 打印全局作用域中的内容 
chi()

 4.函数的嵌套

在函数中声明函数
在内部函数中使用变量的时候, 查找顺序: 先找自己 -> 上一层 -> 上一层..全局 -> 内置

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

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

nonlocal和global关键字(重点)

global: 在局部引入全局变量
nonlocal: 在局部...内层函数引入外层离他最近的那个变量.

a = 100 
def func():
    global a    # 加了个global表示不再局部创建这个变量了. 而是直接使用全局的a
    a = 28
    print(a) 
func() 
print(a)

global表示不再使⽤局部作用域中的内容了. 而改用全局作用域中的变量 

nonlocal 表示在局部作用域中, 调用父级命名空间中的变量.

a = 10 
def func1():
    a = 20
    def func2():
        nonlocal a 
        a = 30
        print(a) #30
    func2()
    print(a)#30
func1()

 

一. 昨日内容回顾
    初识函数
        定义: 对动作或者功能的封装.
        语法:
            def 函数名(形参):
                函数体(return)

            函数名(实参)

            形参: 在函数声明的位置写的变量
                1. 位置参数
                2. 默认值参数.
            实参: 在函数调用的位置给出的具体的值
                1. 位置参数
                2. 关键字参数
                3. 混合   位置, 关键字
            传参: 把实参传递给形参的过程

            return: 返回, 程序如果运行到return, 函数结束运行.
                1. 当我的函数不写return, 表示默认返回None
                2. 函数中写return, 返回None
                3. return 值, 有一个返回值
                4. return 值1, 值2, 值3   多个返回值, 返回的是元组

二. 作业讲解
三. 今日主要内容
    1. 动态传参(重点)  *, **
        *, ** :
            形参: 聚合
                位置参数* -> 元组
                关键字** -> 字典
            实参: 打散
                列表, 字符串, 元素 -> *
                字典 -> **
        形参顺序(重点):
            位置, *args, 默认值, **kwargs

        无敌传参
        def func(*args, **kwargs): arguments参数  keyword-arguments关键字参数
            pass

    2. 作用域和名称空间
        名称空间: 用来存放名字(变量, 函数名, 类名, 引入的模块名)的

        1. 全局名称空间: 我们在py文件中自己写的变量, 函数.....
        2. 内置名称空间: 我们python解释器提供好的一些内置内容(print, input....)
        3. 局部名称空间: 在我们执行函数的时候.会产生一个局部名称空间. 放的是: 函数内部的内容(变量, 函数,类...)

        名称空间可能会有无数个, 局部名称空间而言. 相对是独立的.一般互不干扰

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

        globals() 查看全局作用域
        locals() 查看当前作用域

    3. 函数的嵌套
        在函数中声明函数
        在内部函数中使用变量的时候, 查找顺序: 先找自己 -> 上一层 -> 上一层..全局 -> 内置

    4. nonlocal和global关键字(重点)
        global: 在局部引入全局变量
        nonlocal: 在局部...内层函数引入外层离他最近的那个变量.
大概内容

 

posted @ 2019-02-24 14:25  等待の喵  阅读(371)  评论(0编辑  收藏  举报