函数

函数:将一些代码进行封装,减少重复代码

结构:

def 函数名():

  函数体(代码块)

函数名+()         调用函数

函数的执行过程:

1.先定义 不会执行

2.调用 会执行定义好的语句

3.定义好的语句

return   

函数的返回值

不写return返回的是None

写了renturn不写值,返回的也是None

多个元素返回值都是元祖,可以返回任意数据

函数中当执行到return的时候就结束了,return以下代码全都不执行,并且终止函数

return的值返回给了调用者,想要查看的话直接打印调用者就可以

参数

定义的参数是形参   

调用的参数是实参

从实参到行参的过程叫传参

形参和实参的数量要一一对应

def func(addr,age)          #形参   addr是一个变量名 
    print(...)
    print(...)
func('北京',18)                #实参,和形参的变量名一一对应

实参划分:

位置参数       func('北京',18)                       和形参位置的顺序一一对应

关键字参数   func(addr='北京',age=18)      对关键字赋值,按照关键字进行传参,可以颠倒顺序

混合参数       func('北京',age=18)               顺序:位置参数要在关键字参数的前面

形参划分:

位置参数    def func(addr,age)                 和实参位置一一对应

默认参数    def func(age=18)                   相当于实参的关键字参数,按照关键字进行传参

混合参数    def func(addr,age=18)           顺序:位置参数在默认参数前面

动态参数

动态位置参数: *args

def func(*args)          聚合打包  获取到数据的是元祖的形式

def func(a,b,*args):
  print(a,b,args)
func(1,2,3,4,5,6,7)


结果:
1 2 (3, 4, 5, 6, 7)


#当位置参数和动态位置参数一起使用时,要注意位置参数在动态位置参数的前面,不然没有值传参给位置参数,全部打包在*args里

打散:

def func(a,b,*args):
    print(a,b,*args)            #打散打印args
func(1,2,3,4,5,6,7)


结果:
1 2 3 4 5 6 7

#打印的时候写 *args  是将本来打包的数据打散之后再打印
def func(*args):
    print(args) 
func(*[1,2,3,4,5])     #将列表打散之后再传参给*args

结果:
(1, 2, 3, 4, 5)

动态关键字参数: **kwargs     

def func(*args)  获取到数据的是字典的形式
def func(**kwargs):
    print(kwargs) 
func(a=1,b=2,c=3)

结果:
{'a': 1, 'b': 2, 'c': 3}

在写参数的时候也要注意顺序: 关键字参数>动态关键字参数

打散:

def func(**kwargs):
    print(*kwargs)        #打散字典的键再打印,只写一个*就可以,写print(**kwargs)会报错
func(a=1,b=2,c=3) 

结果:
a b c
def func(**kwargs):
    print(kwargs)
func(**{'a':1,'b':2,'c':3})    #将字典打散传参

结果:
{'a': 1, 'b': 2, 'c': 3}

如果将上述几种参数一起使用的话,要遵守一定的顺序:

位置参数>动态位置参数>默认参数>动态默认参数

将动态位置参数和动态默认参数放在一起的话,就会形成万能的函数定义结构,也是最经常用到的:

def func(*args,**kwargs) 

函数的注释:

def func(*args,**kwargs):

打出'''   然后回车 就可以给函数添加注释

def func(*args,**kwargs):
    '''
    
    :param args: ...
    :param kwargs: ...
    :return: ...
    '''

print(func.__doc__) 查看函数的注释


函数的名称空间

内置空间

全局空间

局部空间

找值顺序:局部空间--全局空间--内置空间

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


作用域名称空间:

内置空间+全局空间 == 全局空间

局部空间

python关键字是存在内置空间的

py文件中顶头写的内容存在全局空间

函数内写的变量存在局部空间 局部空间数据不能共享,是独立的

函数的嵌套:

def func():
    print(1)
def func1():
    print(2)
    func()
func1()           # 函数名+()不管在哪都是调用     调用的时候先定义后调用

结果:
2
1
def func():
    print(1):
    def func2():
        print(2)
    func2()
func()          #一层一层的找,同级也遵守从上到下的执行顺序

globals 查看全局作用域内容

locals 查看局部作用域内容 在哪个位置就查看哪个局部

global

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

结果:
10
10
a = 10
def func():
    global b      #全局内没有变量b,会直接创建一个b,赋值为10
    b = 10
    print(a)
func()
print(a)

结果:
10
10

nonlocal

n = 1
def func():
    n = 10
    def func1():
        nonlocal n     #修改上一层的变量值,上一层没有就继续找再上一层,找到最外层局部,不可以使用全局变量
        n = 100
        print(n)
    func1()
func()
print(n)

结果:
100
1

和global不一样的是,当nonlocal要修改的变量在局部变量当中找不到时,会直接报错

补充知识:

三元运算符:
return x if x > y else y

如果x>y条件成立,返回x,不然就返回y

原文地址:https://www.cnblogs.com/sandy-123/p/10251208.html