目录

1、函数的定义

2、函数的应用

3、函数使用



一、函数的定义

               定义函数,也就是创建一个函数,可以理解为创建一个具有某些用途的工具。定义函数需要用 def 关键字实现。

格式如下:

def 函数名(参数列表):
    #实现特定功能的多行代码
    [return [返回值]]

函数与方法的区别:

  • 直接调用的是函数
  • 通过对象点出来的是方法

例:

        nums = [1, 2, 3]
        print(len(nums))  # 函数
        nums.append(4)    # 方法



二、函数的应用

        1、input()

        2、print()

        3、range()

        4、len()

 这些都是 Python 的内置函数,可以直接使用

        除了可以直接使用的内置函数外,Python 还支持自定义函数,将一段有规律的、可重复使用的代码定义成函数,从而达到一次编写、多次调用的目的



三、函数使用

1、函数的参数传递

        定义:通常情况下,定义函数时都会选择有参数的函数形式

        作用:传递数据给函数,令其对接收的数据做具体的操作处理

        会用到的两种参数:形式参数 实际参数

 形参和实参区别:

        #定义函数时,这里的函数参数 obj 就是形式参数
        def demo(obj):
            print(obj)

        a = "Zking"
        #调用已经定义好的 demo 函数,此时传入的函数参数 a 就是实际参数
        demo(a)

2、传参的几种情况

        2.1 位置传参

        2.2 关键字传参

        2.3 缺省传参

        2.4 可变参数

示例:

# 位置传参
print(res(1, 2, 3))

# 缺省参数
def add(a: int, b: int = 10):
    return a + b

print(add(1))

# 关键字传参
print(add(a=1, b=2))

# 可变参数
def my_max(*nums):
    print(nums)
    val = nums[0]
    for i in nums[1:]:
        val = val if val > i else i
    return val


print(my_max(1, 2, 3))

3、函数的返回值

        Python中,用 def 语句创建函数时,可以用 return 语句指定应该返回的值,该返回值可以是任意类型

注意:return 语句在同一函数中可以出现多次,但只要有一个得到执行,就会直接结束函数的执行

示例:

# Python 函数可以返回多个值,多个值以元组的方式返回
def res(*nums: int):
    max = nums[0]
    min = nums[0]
    sum = nums[0]
    for i in nums[1:]:
        max = max if max > i else i
        min = min if min < i else i
        sum += i
    return {
        '总和': sum,
        '最大值': max,
        '最小值': min
    }


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

4、函数的注释

        函数的注释(说明文档),本质就是一段字符串,只不过作为说明文档,字符串的放置位置是有讲究的,函数的说明文档通常位于函数内部、所有代码的最前面

示例:

def add(a, b):
    """
    返回两个数相加的和
    :param a: 参数数字a
    :param b: 参数数字b
    :return: 和
    """
    return a + b

5、函数嵌套

示例:

def a(a, b):
    return a + b


def b(c, d):
    return a(c, d) / 2


print(b(4, 8))

6、变量作用域

        定义:所谓作用域(Scope),就是变量的有效范围,就是变量可以在哪个范围以内使用

        变量的作用域由变量的定义位置决定,在不同位置定义的变量,它的作用域是不一样的

变量分为局部变量和全局变量

示例:

# 局部变量
def add(a: int, b: int = 10):
    return a + b

def demo():
    add = "zking"
    print("函数内部 add =", add)


demo()
print("函数外部 add =", add)

# 全局变量
add = "zking"


def text():
    print("函数体内访问:", add)


text()
print('函数体外访问:', add)

7、递归调用

        定义:自己调用自己

示例:

# 计算n+1的和
def res(target: int):
    if target == 1:
        return 1
    return target + res(target - 1)


print(res(2))

# 斐波那契数列
# 1,1,2,3,5,8,13,21,34,55,...
def fb(target: int):
    if target == 1 or target == 2:
        return 1
    return fb(target - 1) + fb(target - 2)


print(fb(8))

8、lambda表达式

        定义:lambda 表达式,又称匿名函数,常用来表示内部仅包含 1 行表达式的函数

        语法格式:lambda  参数 : 执行操作/返回值

示例:

# 通过sort方法实现对列表的排序
nums=[1, 6, 5, 2, 3, 4]
nums.sort()
nums.sort(reverse=False)
print(nums)

# 使用 lambda 对字典数据进行排序
persons = [
    {"name": "张三", "age": 20},
    {"name": "李四", "age": 17},
    {"name": "王麻子", "age": 21}
]
persons.sort(key=lambda p:p["age"],reverse=True)
print(persons)

# 将一个元素中所有的值翻倍 map
nums=[1, 2, 3, 4, 5, 6, 7, 8]
m=map(lambda a: a*2,nums)
for i in m:
    print(i)


# 让列表中的对应位置进行相加
nums1=[1, 2, 3, 4, 5, 6, 7, 8]
nums2=[2, 3, 4, 5, 6, 7, 8, 9]
m1=map(lambda a, b: a+b, nums1, nums2)
for i in m1:
    print(i)


# 对列表进行筛选
nums3=[1, 2, 3, 4, 5, 6, 7, 8]
f=filter(lambda a: a > 5, nums3)
for i in f:
    print(i)


函数进阶

1、多参数解析

        使⽤ `*args`(元组) 和 `**kwargs` (字典)来调⽤函数

示例:

# 使用`*args`非关键字可变参数方式
# 元组
def res(*args):
    print(args)

# 使用普通参数方式
res(*(1, 2, 3, 4, 5, 6))


# 使用`**kwargs`关键字可变参数方式
# 字典
def nums(**kwargs):
    print(kwargs)

注意:func(fargs, *args, **kwargs) 必须要有fargs参数

2、闭包

        满足闭包条件:         在一个外函数中定义了一个内函数

                                        内函数里运用了外函数中声明的参数和变量

                                        外函数的返回值是内函数的引用

        优点:可以数据共享

  示例:

# 无返回值情况
def hello():
    def say():
        print("hello python")
# hello代表方法本身 hello()代表方法的返回值


# 有返回值情况
def hello():
    def say():
        print("hello python")
    return say
print(hello)
res = hello()
res()
# 此时可以发现hello()方法的返回值是say方法,也就是它的内部函数。

3、装饰器

        定义:装饰器是闭包的一种应用

        功能:装饰器就是用于拓展原来函数功能的一种函数

        特殊之处:在于它的返回值也是一个函数

        优点:在不用更改原函数的代码前提下给函数增加新的功能

        示例:

from functools import wraps

def Transaction(func):
    # wraps(func)`的作用: 不改变使用装饰器原有函数的结构
    @wraps(func)
    def wrapper():
        print("开启事务处理")
        func()
        print("提交事务处理")
    return wrapper


@Transaction
def hello():
    print("hello python")


hello()
print(hello.__name__)

  带参数的装饰器:

                定义:装饰器中可以传入参数,先形成一个完整的装饰器,然后再来装饰函数,当然函数如果需要传入参数也 是可以的,用不定长参数符号就可以接收

        示例:

import  datetime

def logging(level:str='debug'): #套壳
    def outer_wrapper(func):
        def inner_wrapper(*args, **kwargs):
            print(f"【{level}】: enter {func.__name__}()")
            return func(*args, **kwargs)
        return inner_wrapper
    return outer_wrapper


"""
@logging调用logging函数 返回outer_wrapper
@outer_wrapper 将hello函数传给func 返回到inner_wrapper
"""
@logging("info")
def hello():
    print("hello python")


hello()