Python函数,深入了解迈向进阶

 一.函数目的

       Python中的函数是一种可重用的代码块,用于执行特定的任务或操作。函数的主要目的是为了使代码更加模块化、可读和可维护。

       函数最大的作用是减少代码的重复,增加代码的重用率,函数允许你编写一次代码,并在程序的多个地方重复使用。这可以大大减少重复的代码,使代码更加简洁和易于管理。

二.函数定义,声明,返回值

       函数是一段可以重复使用的代码块,它有一个明确的名称,可以接收输入参数,并在执行完毕后返回一个值(尽管并非所有函数都需要返回值)。函数的定义包含函数的名称、参数列表以及函数体。

def 函数名(参数列表):
    # 函数体:执行的代码块
    # 函数体中的代码会由系统调用执行
    # 返回值可以是任意类型的值,也可以没有返回值(None)
    # 可以通过return语句返回
    return 返回值

def add_numbers(num1, num2):
    # 这里是函数体,包含了执行代码的逻辑
    sum = num1 + num2
    return sum  # 返回计算结果,sum即为返回值

# 现在我们可以调用这个函数,并传递两个数字作为参数
result = add_numbers(3, 5)  # result 现在是 8

add_numbers 是函数名,num1 和 num2 是参数列表中的参数。当调用 add_numbers(3, 5) 时,系统会执行函数体中的代码,并将结果(两个数字的和)通过 return 语句返回给调用者。

三.函数调用,形参和实参

def my_fun(n,m):
    i = n + m
    return i

my_fun(1,2)

返回结果:3

       这里简单说明形参和实参,其中(n,m)为声明形参,调用时的my_fun(),括弧中的(1,2)为实参,当使用这一函数时,用my_fun进行函数的调用。

四.函数的参数类型

为形参添加注解

def greet(name: str) -> str:  # 这里的: str 和 -> str 是类型注解
    return f"Hello, {name}!"  # 返回一个字符串,与上面的注解相符

def add_numbers(num1: int, num2: int) -> int:  # 参数和返回值都是整数类型
    return num1 + num2

# 显式地指定参数类型(虽然Python不会强制执行)
def complex_calculation(a: float = 3.14, b: float = 2.71):
    # ... 函数体 ...
    pass  # 占位符,表示此处应有代码逻辑

# 在调用函数时,虽然不需要显式提供类型信息,但可以传递符合预期类型的值
greet("Alice")  # 正确调用,参数是字符串
add_numbers(5, 6)  # 正确调用,两个参数都是整数

五.递归函数

       递归函数,简单来说就是函数套自己,接下来简单以求一个1-5数字的和为例子来进行举例:

def num(n):
    if n == 1:   #递归函数必须有递归出口,具体几个要根据情况不同自己定
    return n     
    else:
    return n + num(n-1)   #函数套函数自己本身

num(5)

输出结果为:1+2+3+4+5 即 15

       递归函数必须要有递归出口,否则为死函数,无法出来,根据需求不同来具体制定函数出口的条件,当未满足该条件时,继续套,直到进入递归出口,在套时,我们必须让实参进行变化,直到满足条件才能进入出口。

六.闭包

       在学习变量的作用域时,先简单来认识一下闭包,闭包简单来说就是外部函数里套了一个内部函数,接下来进行一个实例操作:

def fun1():
    print("fun1")
    datas = []

    def fun2():
        print("fun2")
        i = random.randint(1,100)
        datas.append(i)
        print(datas)

    return fun2  #错误写法 return fun2(),不可以这样调用fun2,会报错
#return fun2:外部函数可以全局调用,这时我们可以外部函数返回内部函数,然后进行调用

fun2()  #闭包中内部函数只能在外部函数内调用,无法全局调用所以这会报错
r = fun1()  #将外部函数赋值,然后才可以调用
r()
r()

输出结果:
fun1
fun2
[74]
fun2
[74, 31]  #在这次输出中,datas为列表是可变类型,内部函数可以拿来使用

       在闭包中,我们可以利用外部函数返回内部函数,将外部函数赋值来进行调用内部函数,闭包不太常见,作用比较鸡肋,不过为接下来认识变量作用域提供一点帮助。

七.变量的作用域(global与nonlocal)

       global意为全球性的,在Python外部函数或者闭包中为声明一个变量为全域变量,在函数中如果不声明,函数默认生成一个同名局部变量,出了函数之后无法使用,global不仅可以在外部函数声明使用,在闭包中一样适用。

       nonlocal意为非局部的,非本地的,和global不同的是,nonlocal通常使用在闭包中即内部函数中声明,调用外部函数中的变量,不过在闭包中即使声明了nonlocal,出了外部函数在全域中也无法使用,这时就要用globa声明一个变量为全域变量。

接下来为实例证明global:

a = 10  # 全局变量

def my_fun():
    print(a)  # 可以访问全局变量x
my_fun()
输出结果:10

#================================================

a = 10

def my_fun():
    a = 20  #默认生成一个与全域a同名变量
    print(a)
my_fun()
print(a)
输出结果:20  10   #如果在a = 20前声明 global a,这时print(a)结果也为20

接下来说明nonlocal:

def outer_function():
    x = "I am from outer function"
    def inner_function():
        nonlocal x  # 声明x是外部函数的变量,不是全局的
        x = "I am modified in inner function"  
       # 这里修改的是外部函数的x,而不是创建一个新的局部变量x
    inner_function()
    print(x)  # 输出: I am modified in inner function

outer_function()  # 调用外部函数,并执行其内部的嵌套函数

       总结:变量的作用域决定了变量的可见性和生命周期。通过合理地使用全局、局部和nonlocal关键字,我们可以更好地管理和控制变量的访问和修改。

八.匿名函数

       Python 中,匿名函数也被称为 lambda 函数,它们通过使用 lambda 关键字定义一个小的匿名(无名)函数。这种匿名函数主要在一些简单的逻辑和临时的计算场景中特别有用。

下面是如何在 Python 中定义和使用 lambda 函数的示例:

# 定义一个匿名函数,返回输入的两倍
lambda_function = lambda x: x * 2

# 调用这个匿名函数
result = lambda_function(5)  # 结果为 10

# 另一个例子,返回两个数相加的结果
add_function = lambda a, b: a + b

# 使用这个匿名函数
sum_result = add_function(3, 4)  # 结果为 7

# 你甚至可以在调用的时候直接定义和使用它,而不需要先将其存储在一个变量中
x = 10
y = 20
sum_value = (lambda a, b: a + b)(x, y)  # 等同于直接写为: sum_value = x + y

九.装饰器

       在不修改原有函数或类的基础上,为其增加额外的功能。装饰器本质上是一个接受其他函数作为参数的函数,并返回一个新的函数对象。

实例:

import random
import time
datas = [random.randint(1,10000) for i in range(10000)]

datas_copy = datas.copy()

def time_coust(f):
    def clac():
        start = time.time()
        f()
        print(f"结束执行 {f.__name__} 消耗{time.time()-start}")
    return clac


@time_coust
def my_fun1():
    datas.sort()
    print(datas)

my_fun1()

@time_coust
def my_fun2():
    new_list = sorted(datas_copy)
    print(new_list)

my_fun2()

函数def time_coust()即为添加功能的函数

  • 19
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值