第十章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
'''