函数

函数

函数是对功能的封装

  语法:

    def 函数名(形参列表):

      函数体(代码块,return)

  调用

    函数名(实参列表)

返回值

1.return:在函数执行的时候,如果遇到return.直接返回

2.如果函数什么都不写,不写return.得到的是None.

3.在函数中写return 值.返回一个值.

4.在函数中可以返回多个返回值,return 值1, 值2,  值3......, 接收的是元组.

参数

函数执行的时候给函数传递消息.

*形参:函数声明的位置的变量

*实参:函数调用的时候给的具体的值

传参:把实参交给形参的过程

#单行注释
'''多行注释'''
# 函数注释
def func(a, b):
    """
    这个函数是用来计算a和b的和
    :param a: 第一个数据
    :param b: 第二个数据
    :return: 返回的是两个数的和
    """
    return a + b

print(func.__doc__) # document文档

  

 1.实参:

   1.位置参数,按照形参的参数位置,给形参传值

   2.关键字参数,按照形参的名字给形参传值

   3.混合参数.即用位置参数,也用关键参数

 2.形参:

   1.位置参数,按照形参的参数位置,给形参传值

   2.默认值参数  先位置后默认值

   3.动态传参 

    1).*args 位置参数动态传参

def chi(*li):
    print(li)
chi('米饭', '面条', '粥')
chi('馒头', '盖浇饭')
chi('馒头')               #返回的是一个元组
输出结果:
('米饭', '面条', '粥')
('馒头', '盖浇饭')
('馒头',)

    2).**kwargs 关键字参数动态传参

def chi1(**food):
    print(food)
chi1(good_food = '米饭', drink = '可乐')        #返回的是一个字典
输出结果:
{'good_food': '米饭', 'drink': '可乐'}

  位置参数动态传参和关键字参数动态传参一起使用的顺序: 

    顺序: 位置, *args, 默认值, **kwargs
def fun(a, *args, c="哈哈",  **kwargs):
    print(a, args, c, kwargs)
fun(1, 2, 3, 4,5, 6)
输出结果:
1 (2, 3, 4, 5, 6) 哈哈 {}

def func(*args, **kwargs):    #无敌传参
pass
 聚合:形参的位置*,**:聚合   聚合:把接收到的参数组合成一个元组

  打散:  实参的位置*,**: 打散   打散:把序列按顺序打散

  字典的打散和聚合需要两个**

def fun(*args):
    print(args)
lst = [1, 4, 7]
fun(lst)                        #直接输入列表,列表整体作为一个参数传入函数
fun(lst[0], lst[1], lst[2])     #输入列表的每一个元素,需要索引输入
fun(*lst)   # 可以使用*把一个列表按顺序打散
s = "臣妾做不到"
fun(*s)     # 字符串串也可以打散, (可迭代对象)
输出结果:
([1, 4, 7],)
(1, 4, 7)
(1, 4, 7)
('臣', '妾', '做', '不', '到')

 

def fun(*args, **kwargs):       #聚合
    print(args)
    print(kwargs)
list1 = [1, 2, 3, 4]
tuple1 = (1, 2, 3, 4)
list2 = ['alex', 'wusir', 1]
dic = {'name': 'alex', 'age': 18}
fun(*list1, *tuple1, *list2, **dic)     #打散
输出结果:
(1, 2, 3, 4, 1, 2, 3, 4, 'alex', 'wusir', 1)
{'name': 'alex', 'age': 18}

命名空间:

  1.内置名称空间

  2.全局名称空间

  3.局部名称空间

  作用域:

    1.全局作用域:内置名称空间+全局名称空间

    2.局部作用域: 局部(函数被调用)

    globals() 查看全局中的内容

    locals() 查看当前作用域中的内容

a = 110     # 全局
def fn():   #全局
    b = 20  # 局部
    def gn():   # 局部
        print(globals())  # 可以查看全局作用域中的内容
        print(locals())  # 查看当前作用域中的内容
    gn()
fn()
输出结果:
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0327DF50>, 
'__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>,
'__file__': 'C:/Users/Desktop/python.py', '__cached__': None, 'a': 110, 'fn': <function fn at 0x032507C8>} {}

  

 函数嵌套:函数可以互相嵌套

    global :在局部访问全局中的内容

def func():
    global a  # 1. 可以把全局中的内容引入到函数内部 , 2. 如果全局中没有这个内容,就在全局创建一个变量
    a = 20      #将20赋值给a,这个a是全局中的a,此时全局中的a为20
    a += 10     # a = a+10   此时a=30
    print(a)    #a=30
func()
print(a)
输出结果:
30
30

    nonlocal:在局部寻找外层函数中离它最近的那个变量

a = 10
def outer():
    a = 1
    def inner(): # 在inner中改变a的值
        nonlocal a # 寻找外层函数中离他最近的那个变量
        print(a)    #在outer()函数中找到a,此时a=1
        a = 20       #将20赋值给a 
        print(a)        #此时a=20
    inner()
outer()
输出结果:
1
20

  

a = 1
def fun_1():
    a = 2
    def fun_2():
        nonlocal a
        a = 3
        def fun_3():
            a = 4
            print(a)
        print(a)
        fun_3()
        print(a)
    print(a)
    fun_2()
    print(a)
print(a)
fun_1()
print(a)
输出结果:
1
2
3
4
3
3
1

  

  

原文地址:https://www.cnblogs.com/Virous1887/p/9442865.html