python基础之函数的进阶(基础八)

第十章python的函数进阶

10.1 函数的传参:形参角度:第三种传参方式

动态传参:*args ------(接受的位置参数)---------元组

agrs 将实参角度:定义一个函数时,所有的位置参数聚合到一个元组中.

def eat(food1,food2,food3):
    print(f'我请你吃:{food1},{food2},{food3}')
eat('蒸羊羔','蒸熊掌','蒸鹿尾')

当给函数传入的参数数目不定时,之前的传参方式解决不了问题。
万能参数,动态参数:*args

def eat(food1,food2,food3):
    print(f'我请你吃:{food1},{food2},{food3}')
eat('蒸羊羔','蒸熊掌','蒸鹿尾','烧花鸭','烧企鹅')

def eat(*args): #将实参角度:定义一个函数时,*所有的位置参数聚合到一个元组中
    print(args)
    print(f'我请你吃:{args}')
eat('蒸羊羔','蒸熊掌','蒸鹿尾','烧花鸭','烧企鹅')
#函数接受不定个数的数字实参,将最终的和返回出去。

练习:写一个函数,求传入函数中的不定个数的数字实现的和。

def sum1(*args):
    print(args)
    result = 0
    for i in args:
        result += i
    return result
print(sum1(300,100,20,10))

动态传参:**kwargs------(接受的关键字的参数)------字典

函数的定义时:**将实参角度所有的关键字参数聚合成一个字典,给了kwargs.

def func(**kwargs):
    print(kwargs)
func(name='alex',age='84',hobby='rap篮球')
*args,**kwargs万能参数
def func(*args,**kwargs):
    print(args,kwargs)
func(name='alex',age='84',hobby='rap篮球')

*的魔性用法:

def func(*args,**kwargs):
    print(args)  # (1, 2, 3,'太白', 'wusir', '景女神')
    print(kwargs)

l1 = [1, 2, 3]
l2 = ['太白', 'wusir', '景女神']
# func(l1,l2)
# func(*l1,*l2)  # 当函数的执行时:*iterable 代表打散。
func(*[1, 2, 3],*(11,22),*'fdsakl')  # 当函数的执行时:*iterable 代表打散。

def func(*args,**kwargs):
    print(args)
    print(kwargs)
func(**{'name':"alex"},**{'age': 73,'hobby': '吹'})
当函数的执行时:**dict 代表打散。

函数外:处理剩余元素

a,b,*c = [1,2,3,4,5]
a,*c,b, = [1,2,3,4,5]
a,*c = range(5)
a,*c,b = (1,2,3,4,5,6)
print(a,c,b)

函数形参角度的顺序:

优先级: 位置 > 动态位置> 默认 > 动态关键字

*args的位置:

*args不能放在位置参数前面,a,b取不到值
def func(*args,a,b,sex='man',):
    print(a)
    print(b)
    print(sex)
    print(args)
    # print(kwargs)
func(1,2,4,5,6)

args如果想要接收到值之前,肯定要改变sex默认参数。
def func(a,b,sex='man',*args):
    print(a)
    print(b)
    print(sex)
    print(args)
    # print(kwargs)
func(1,2,4,5,6)

def func(a,b,*args,sex='man'):
    print(a)
    print(b)
    print(sex)
    print(args)
    # print(kwargs)
func(1,2,4,5,6)
func(1,2,4,5,6,sex='women')

**kwargs
位置参数,*args,默认参数,**kwargs
def func(a,b,*args,sex='man',**kwargs,):
    print(a)
    print(b)
    print(sex)
    print(args)
    print(kwargs)
func(1,2,4,5,6,name='太白',age=18)
形参角度第四种传参方式:仅限关键字参数  (了解)
位置参数,*args,默认参数,仅限关键字参数,**kwargs
def func(a,b,*args,sex='man',c,**kwargs,):
    print(a)
    print(b)
    print(sex)
    print(c)
    print(args)
    print(kwargs)
func(1,2,4,5,6,67,c=666,name='太白',age=18,)

10.1.3补充内容

lst = [12,23,3,4,5,6]
def func(*args):
    print(*args)
func(lst[0],lst[1]) # 笨的办法
func(*lst)

dic = {"key":1,"key1":34}
def func(**kwargs):
    print(kwargs)
func(**dic)

10.2 空间角度研究函数

name = 'alex'
l1 = [1,2,3]

def func():
    name = '太白'
    print(666)

func()

def func1():
    age = 18

import time
# print(time.time())
print(111)
time.sleep(1)
age = 18

print(66)
input()

变量(函数名也叫变量)


input = 666
print(input)
从全局寻找input ————> 全局名称空间 ——————> 内置

input = '太白'
def func():
    # input = 666
    print(input)

func()

从局部寻找input ——————> 局部名称空间 ————> 全局名称空间 ——————> 内置
取值顺序:单向不可逆

def func():
    name = 'alex'

func()
print(name)

name = '太白'
def func():
    # name = 'alex'
    def inner():
        print(name)
    inner()
func()

内置空间,全局空间,局部空间总结:

print(11)
a = 10

def func():
    b = 20
    print(b)


内置空间 : print input len
全局空间 : 当前py文件需要开辟的空间存放在全局空间
局部空间 : 函数中开辟的空间就是局部空间

加载顺序:
    内置空间 > 全局空间 > 局部空间

取值顺序:
    局部空间 > 全局空间 > 内置空间(找不到就报错了!)

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

10.2.1函数注释

def func(a,b):
    """
    逻辑判断...
    :param a: str
    :param b: int
    :return: bool
    """
    print(a,b)

def func1(user,password):
    """
    密码加密
    :param user: 用户名 str
    :param password: 密码 str
    :return: 加密的密码 MD5
    """
    print(user,password)

print(func.__doc__)
print(func1.__doc__)
print(func.__name__)

10.3 内置函数globals ,nonlocals ,locals

global : 修改全局空间的变量对应的值
nonlocal :在外层的函数中,修改局部空间的变量值.完全不涉及全局变量,
只修改离它最近的一层,最近的一层没有变量继续向上找,直到找到最外层函数

def func():
    global a  # 声明修改全局变量的值
    a += 1
    print(a)
func()
print(a)

a = 10
def f1():
    a = 10
    def f2():
        a = 15
        def f3():
            global a
            a += 1
            print(a)  # 11
        print(a)  # 15
        f3()
    print(a)  # 10
    f2()
f1()

a = 10
def func():
    def f1():
        global a
        a += 1
        def foo():
            nonlocal a
            a += 1
            print(a)   # 31
        foo()
        print(a) # 31
    f1()
func()
print(a)   # 10
name = 'alex'
l1 = [1, 2, 3]

def func():
    age = '18'

print(globals()) # 全局作用域所有的内容
print(locals())  # 当前位置

name = 'alex'
l1 = [1, 2, 3]

def func():
    age = '18'
    oldboy = '老男孩教育'
    print(globals()) # 全局作用域所有的内容
    print(locals())  # 当前位置的变量与值的对应关系

func()

name = 'alex'
l1 = [1, 2, 3]

def func():
    age = '18'
    oldboy = '老男孩教育'
    def inner():
        name_class = 'python23期'
        print(globals()) # 全局作用域所有的内容
        print(locals())  # 当前位置的变量与值的对应关系
    inner()
func()

10.4函数的嵌套

def func():
    print(1)
    def f1():
        print(2)
    return f1()
func()

不管在什么位置,只要是函数名+() 就是在调用此函数
函数调用执行后,函数体中开辟的空间就自动销毁了

def func():
    a = 1
    def foo():
        b = 2
        print(b)  # 2
        print(a)  # 1
        def f1():
            print(b) # 2
        return f1()
    return foo()
print(func())

函数互相引用

def func():
    a = 1
    foo()
    print(a)

def foo():
    b = 2
    print(b)
func()

def a():
    a1 = 1
    c()
    print(c)
def b():
    b1 = 2
    print(b1)
def c():
    c1 = 3
    print(a)
def run():
    a()
run()


def func():
    a = 1
    def b():
        print(a)

def foo():
    b = 1
    def z():
        print(func)
        print(b)
    ret = z()
    func()
    return ret

def run():
    foo()
print(run())


def func(a):
    foo(a) #10

def foo(e):
    b(e) # return 10

def b(c):
    print(c)
    return 10

print(func(5))
 例1:

def func1():
    print('in func1')
    print(3)

def func2():
    print('in func2')
    print(4)

func1()
print(1)
func2()
print(2)
'''
in func1
3
1
in func2'
4
2

'''


例2:
def func1():
    print('in func1')
    print(3)

def func2():
    print('in func2')
    func1()
    print(4)

print(1)
func2()
print(2)

'''
1
in func2
in func1
3
4
2
'''


例3:

def fun2():
    print(2)
    def func3():
        print(6)
    print(4)
    func3()
    print(8)

print(3)
fun2()
print(5)

'''
3 2 4 6 8 5


'''
posted @ 2019-07-25 20:12  wushe  阅读(121)  评论(0编辑  收藏  举报