python之函数的基础用法

# 演示函数功能包括函数定义、传参、变量作用域、函数文档、类型注释、内省和闭包

# 函数可选参数举例,hoppy参数可传可不传
def gethoppy(name, age, hoppy=""):
    """
    功能:查询对象爱好(方法说明)
    参数:
    - name 名字
    - age 年龄
    返回:
    - 对象爱好
    """
    if hoppy:
        print("name:", name.title(), "age:", age, "hoppy:", hoppy)
    else:
        print("name:", name.title(), "age:", age)


gethoppy('mike', 25)  # name: Mike age: 25
gethoppy(name='mike', age=25)  # 同上
gethoppy('mike', age=25)  # 同上,位置参数要在前面
gethoppy('mike', 25, "游泳")  # name: Mike age: 25 hoppy: 游泳
help(gethoppy)  # 查询函数文档


######### 传递混合参数 #########
def getuser(name, age, *args, **kwargs):
    """
    传递混合参数,如位置参数、列表参数(*args)和字典参数(**kwargs)
    字典参数调用处传递键值对参数,函数将键值对参数当成一个数据字典来处理
    """
    print("入参:", name, age, args, kwargs)  # mike 26 ('男',) {'hoppy': 'swim', 'job': 'singer'}
    info = {'name': name.title(), 'age': age, 'sex': args[0]}
    for key, value in kwargs.items():
        info[key] = value
    print(info)


getuser('mike', 26, '', hoppy='swim', job='singer')


######### 参数解包、定义参数和返回值类型 #########
def sum_fn(a: int, b: int, c: int = 0) -> int:
    return a + b + c


# 参数解包:将整个list当做参数传给函数
listed = [1, 2, 4]
sumed = sum_fn(*listed)
print("参数解包:", sumed)  # 7

dd = {'a': 1, 'b': 2, 'c': 3}
print(sum_fn(**dd))  # 6 解包

######### 内省 #########
print("函数名称", sum_fn.__name__)  # sum_fn
print("函数参数",
      sum_fn.__annotations__)  # {'a': <class 'int'>, 'b': <class 'int'>, 'c': <class 'int'>, 'return': <class 'int'>}
print("函数文档", sum_fn.__doc__)  # 同help


######### 入参格式限制 #########
def sum_fn2(a, /, b, c):
    """
        左侧入参只能位置参数: /
    """
    return a + b + c


def sum_fn3(a, b, *, c):
    """
        右侧入参只能关键字参数: *
    """
    return a + b + c


sum_fn2(1, b=2, c=3)
sum_fn3(1, 2, c=3)


######### 作用域 #########
# 全局作用域(global)、嵌套函数的外层函数作用域(nonlocal)、局部作用域、内置作用域、
def myfun():
    global x  # 申明全局变量
    x = 20


x = 10
myfun()
print("作用域", x)  # 20 默认不修改全局变量,需要申明global


######### 嵌套函数 #########
def funA():
    x = 520

    def funB():
        nonlocal x  # 申明函数外部变量
        x = 880
        print("funB:", x)

    funB()
    print("funA:", x)


funA()
"""
funB: 880
funA: 880
"""


######### 闭包 #########
def funA():
    x = 520

    def funB():
        print("funB:", x)

    return funB


print("闭包:", funA())  # <function funA.<locals>.funB at 0x00000221787D3A30>
funA()()  # 520
myfun = funA()
myfun()  # 520


# 带参数(类似工厂,内层函数会记住外层函数作用域)
def funA(a):
    def funB(b):
        x = pow(b, a)
        print("funB:", x)

    return funB


square = funA(2)
square(3)  # 9
square(4)  # 16

 

posted @ 2017-07-23 17:13  星瑞  阅读(12389)  评论(0编辑  收藏  举报