函数的进阶,打散聚合

def func(): # 形参
pass

func() # 实参

def func(a,b,c,*args): # 在形参位置*叫做聚合
print(a,b,c)
print(args) # 元组形式

func(1,2,3,4,5,9,6,7,8)

位置参数 > 动态的位置参数
def func(**kwargs): # 动态默认参数 #形参的时候**聚合
print(kwargs) # 字典

func(a=1,b=2,c=3) # 关键字的形式传参

def func(a,b,c,*args,x=1,y=1,z=1,**kwargs):
print(a,b,c)
print(args,kwargs)
print(x, y, z)
# 1 2 3
# (1,2,3,4,5)
# 1 1 1
# {'a': 1, 'b': 1, 'c': 1}
func(1,2,3,4,e=1,f=2,g=3)


def func(a,b,c,*args,x=1,y=1,z=1,**kwargs):
print(a,b,c) # 123# print(args,kwargs) # () {}
print(x, y, z) #1 1 1
# 1 2 3
# (1,2,3,4,5)
# 1 1 1
# {'a': 1, 'b': 1, 'c': 1}
func(1,2,3,4,a=1,b=2,c=3)


def func(*args,**kwargs):
print(args,kwargs) # args = () kwargs = {}
func(1,2,3,a=4,b=5)

def func(*args,**kwargs):
print(args,kwargs) # args = () kwargs = {'a':4,'b':5}
func(a=4,b=5)
def func(*args,**kwargs):
print(args,kwargs) # args = (1,2,3) kwargs = {}
func(1,2,3)


def func(*args,**kwargs): # * 聚合
print(*args) # args = () *args = 1 2 3 *打散
print(*kwargs) # args = () **kwargs = 1 2 3 *打散 字典的键
func(1,2,3,a=4,b=5)


li = [1,2,3,5,4]

def func(*args): # 聚合 (1,2,3,5,4)
print(args)
print(*args) # 打散 1,2,3,5,4
func(*li) # 1,2,3,5,4


def func(*args,**kwargs): # 聚合 (1,2,3,5,4)
print(args,*kwargs) # print('a','b')
func(**dic) # 1,2,3,5,4

dic = {'a':1,'b':2}
def func(*args,**kwargs): # 聚合 (1,2,3,5,4)
print(args,*kwargs) # a=1,b=2
func(*[1,2,3]) # func(a=1,b=2)


print('a','b')
print(a=1,b=2)
li = [1,2,3,4]


args和 kwargs 是可以更换的,但是程序员约定都用它
用途:在不明确接受参数,数量时使用*args和**kwargs
动态位置参数 > 动态关键字参数
形参: 位置 > 动态位置 > 默认参数 > 动态默认参数
实参: 位置 > 关键字参数
在实参调用的时候 *将可迭代的对象打散,字典是将键取出
在形参处出现*就是在聚合
在实参调用的时候 **将字典打散成 关键字参数(键=值)
在形参处出现**就是将关键字参数聚合成一个字典

def func(a,**kwargs):
print(a)
# **kwargs # a=1,b=2
b = **kwargs
func(**{'a':1}) # func(a=1)

def aaa(user,pwd):
"""
登录函数
:param user: 用户名
:param pwd: 密码
:return: 校验后的账号和密码
"""
print(111)

print(aaa.__doc__)简单了解

1.内置空间中所有代码 -- 内置空间
2.自己写的py文件 -- 全局空间
3.函数中的代码 -- 局部空间

a = 10

def func():
print(a)
func()


加载顺序:
'''
1.内置空间
2.全局空间
3.局部空间
'''

取值顺序:
'''
1.局部空间
2.全局空间
3.内置空间
4.找不到就报错
'''

作用域:
'''
1.全局作用域 内置+全局 = 全局作用域
2.局部作用域 函数内的就是局部作用域
'''

a = 10
def func():
global a # (声明)我要修改a 找到要a
a+=1 # 修改
func()
print(a)

def func():
global a #(声明我要修改a,找不到a的时候在全局创建一个 a=0)
a = 1 # a = 1
func()
print(a)

第一种函数嵌套 在函数func内
def func():
print(3)
def f():
print(1)
print(2)
f()
func()


第二种函数嵌套 多个函数嵌套调用
def func2():
print(1)
log()

def func1():
print(3)

def log():
func1()
print(6)
def fun():
print(7)

def func():
a = 1
def log():
a = 5
def info():
a = 10
print(a)
print(a)
print(a)
func()


def func():
a = 1
def log():
a = 5 # a = 15
def info():
nonlocal a # 声明修改log函数下边的变量a
a += 10 # a = a + 10 a = 15
print(a) # 15
info()
print(a) # 15
log()
print(a) # 1
func()


在一个局部空间内,nonlocal会修改离他最近的那个变量,如果上一层
没有就继续向上找,直到走到局部空间头部

def f():
def a1():
def l():
nonlocal a
a = 8
print(a)
l()
print(a1())
f()

global : 在局部修改全部变量,如果没有就创建一个新的
nonlocal : 在局部空间内,修改离自己最近的变量,如果上一层没有就继续向上找,
直到找到局部变量的顶层,局部空间内没有可以修改的变量,就报错

函数的进阶:
1.1 动态参数
位置参数 > 动态位置参数 > 默认参数 > 动态(关键字)默认参数
1.2 *,**
在实参位置是打散
在形参位置是聚合
1.3 *args,**kwargs 可以修改,但是不建议修改
1.4 将(列表,元组,字符串,字典,集合)打散传入

2.1 函数的注释:
""" """ 官方推荐
查看注释: func名.__doc__
查看注释: func名.__name__

3.1 名称空间
# 加载顺序:
# 1.内置空间
# 2.全局空间
# 3.局部空间
# 取值顺序:
# 1.局部空间
# 2.全局空间
# 3.内置空间

# 作用域;

# 全局作用域 内置 + 全局
# 局部作用域 局部

# global : 在局部修改全部变量,如果没有就创建一个新的
# nonlocal : 在局部空间内,修改离自己最近的变量,如果上一层没有就继续向上找,
# 直到找到局部变量的顶层,局部空间内没有可以修改的变量,就报错

4.1 函数的嵌套
看文件06 函数的嵌套

4.2:
函数嵌套内,从最里层返回一个任意字符串,在外部接受打印


print(aaa.__name__) # 反射

猜你喜欢

转载自www.cnblogs.com/guoqiming/p/10539068.html