016_Python知识点_认识函数及变量&匿名函数&递归函数

认识Python的函数

1. 概述

为了提高编写的效率以及代码的重用,把具有独立功能的代码块组织为一个小模块,这就是函数。
从实现函数的角度来看函数包括以下三点:

  • 如果函数需要几个关键的动态变化的数据,那么这些数据应该被定义为函数的参数
  • 如果函数需传出几个重要的数据(就是调用该函数的人希望得到的数据),那么这些数据应该被定义成返回值
  • 函数的内部实现过程,即需要函数完成的某个功能,因为函数的使用就是为了提高代码的效率,所以单个函数实现的功能应越是单一越好,以提高代码的重用率
2. 函数的创建与调用

定义函数,也就是创建一个函数,可以理解为创建一个具有某些用途的工具。定义函数需要用 def 关键字实现。调用函数即执行函数。如果把创建的函数理解为一个具有某种用途的工具,那么调用函数就相当于使用该工具。函数调用的基本语法格式: 函数名( [形参值] )。示例如下:

# ******函数的定义******
# 此处对num1、num2的参数检查,
# 当参数类型不对时,pycharm会检测到错误并提示,但运行过程中不会报错
# 当参数个数不对时,会直接报错
def my_max(num1: int, num2: int)->int:
    """
    返回传入参数的最大值
    :param num1: 传入的第一个数值
    :param num2: 传入的第二个数值
    :return: 最大值
    """
    max = num1 if num1 > num2 else num2
    return max

# ******函数的调用******
x = 13
y = 18
result = my_max(x, y)
print(result)
3. 变量的作用域

基于变量作用域 (命名空间,即 “名字” 生效的范围) 的不同可以将变量简单的分为:局部变量和全局变量。

  1. 局部变量:在函数内部定义的变量,仅在函数内部使用,所以:
    • 不同的函数,可以定义相同的名字的局部变量,各用个的不会产生影响
    • 局部变量的作用,为了临时保存数据需要在函数中定义变量来进行存储。
  2. 全局变量,一个变量既能在一个函数中使用,也能在其他的函数中使用,这样的变量就是全局变量。
    • 在函数外边定义的变量叫做全局变量
    • 全局变量能够在所有的函数中进行访问
    • 如果在函数中修改全局变量,那么就需要使用global进行声明,否则运行出错
    • 如果全局变量的名字和局部变量的名字相同,那么使用的将会是局部变量的 (小技巧: 强龙不压地头蛇 (就近原则))

【注意!】对global 声明的使用具体地进行说明

  1. 第一种情况,全局变量为不可变数据类型。代码示例:
# 在函数外部定义的变量即为全局变量。
# allmomey: 整型数据,且不可变数据类型
allMoney = 100
# 局部变量,就是在函数内部定义的变量, 只在函数内部生效
def save_money(money):
    """存钱"""
    # global  allMoney  # 首先 global 变量名声明
    allMoney += money  # 对全局变量allmoney进行修改
    print("存钱后: ", allMoney)

if __name__ == '__main__':
    save_money(100)

执行结果分析:当对allmoney进行修改时,解释器认为函数内部的allmoney与函数外部的不是同一个一个,而是认为其是一个定义在函数内部的局部变量,所以引发未定义错误。—> 结论:对于不可变数据类型的全局变量,在函数内部进行修改时,需要使用global 进行声明,否则会运行出错
在这里插入图片描述
2. 第二种情况,全局变量为可变数据类型。代码示例:

# 在函数外部定义的变量即为全局变量。
# allmomey: 列表,可变数据类型
allMoney = [100]
# 局部变量,就是在函数内部定义的变量, 只在函数内部生效
def save_money(money):
    """存钱"""
    allMoney[0] += money  # 对全局变量 allMoney 进行修改,无global声明
    print("存钱后: ", allMoney[0])

if __name__ == '__main__':
    save_money(100)

执行结果分析:运行成功。—> 结论:对于可变数据类型的全局变量,在函数内部进行修改时,无需使用global 进行声明即可
在这里插入图片描述
global使用及其性质总结论:
global的本质是声明可以修改全局变量的指向, 即变量可以指向新的数据。

  1. 不可变类型的全局变量::指向的数据不能修改, 不使用global时无法修改全局变量。
  2. 可变类型的全局变量:指向的数据可以修改, 不使用global时可以修改全局变量。

Python 中提供如下三个工具函数来获取指定范围内的 “变量字典”:

  • globals():全局范围内所有变量组成的 “变量字典”。
  • locals(): 当前局部范围内所有变量组成的 “变量字典”。
  • vars(object):获取在指定对象范围内所有变量组成的 “变量字典”。如果不传入object 参数,vars() 和 locals() 的作用完全相同。

代码示例:

def my_max(num1: int, num2: int)->int:
    max = num1 if num1 > num2 else num2
    print("在函数内部".center(35, "*"))  # 函数内部分界线
    print(locals().get("max", "没有变量max..."))  # 尝试获得局部变量 max
    print(globals().get("x", "没有变量x..."))  # 尝试获得全局变量 x
    return max


x = 13
y = 18
result = my_max(x, y) # 仅调用函数,对返回结果啥也不做
print("在函数外部".center(35, "*"))  # 函数外部分界线
print(locals().get("max", "没有变量max..."))  # 尝试获得局部变量 max
print(globals().get("x", "没有变量x..."))  # 尝试获得全局变量 x

执行结果表明:在函数外部,无法获取局部变量max,变量已被释放,而对于全局变量x 即使是在函数内部也可以进行调用。
在这里插入图片描述

4. 函数参数传递

在这里插入图片描述
对不同参数类型的使用及其示例如下所示:

# num1、num2为必选参数,args为可变参数,kwargs为关键字参数
def my_max(num1, num2, *args, **kwargs):
    max = num1 if num1 > num2 else num2
    print("num1=%d,num2=%d,最大值:%d" % (num1, num2, max))
    print("可变参数:", args)
    print("关键字参数:", kwargs)

# num1为必选参数,num2为默认值参数,放在参数的最后
def my_min(num1, num2=100):
    min = num1 if num1 < num2 else num2
    print("num1=%d,num2=%d,最小值:%d" % (num1, num2, min))



my_max(13, 18, 11, 22, "haha", nn=100, mm=200)
print("分界线".center(30, "-"))
my_min(99)  # 没有传入第二个参数,所以默认num2为100
my_min(99, 1)  # 有第二个参数传入,此时 num2 = 1

执行结果:
在这里插入图片描述
【注意】:参数定义的顺序必须是:必选参数、 默认参数、可变参数和关键字参数。默认参数一定要用不可变数据类型,避免出现意想不到的麻烦 (๑•ᴗ•๑)

匿名函数 lambda

匿名函数指无须定义标识符的函数或子程序。Python用lambda语法定义匿名函数,只需用表达式而无需申明(省略了用def声明函数的标准步骤)。lambda函数能接收任何数量的参数但只能返回一个表达式的值

  1. 应用场合1:匿名函数作为参数传入
  2. 应用场合2:作为内置函数的参数

代码示例如下:

# 应用场合1: 匿名函数作为参数传递
def fun(num1, num2, operator_fun=pow):
    return  operator_fun(num1, num2)

print(fun(2, 3))  # 2**3 = 8
print(fun(2, 3, lambda  x, y: x+y))  # 2+3 = 5
# 应用场合2: 作为内置函数的参数
from prettytable import PrettyTable
def show(goods):
    """友好的以表格的方式打印商品信息"""
    table = PrettyTable(field_names=['Name', 'Count', 'Price'])
    for good in goods:
        table.add_row(good)
    print(table)

goods = [
    ("Python核心编程", 200, 378.9),
    ("Java核心编程", 300, 278.9),
    ("Php核心编程", 100, 78.9),
    ("Ruby核心编程", 260, 178.9),
]

print("按照数量进行排序".center(30, '*'))
goods.sort(key=lambda x:x[1])  # x = goods,作为内置函数的参数
show(goods)

print("按照价格进行排序".center(30, '*'))
goods.sort(key=lambda x:x[2])  # x = goods,作为内置函数的参数
show(goods)

执行结果:
在这里插入图片描述

递归函数

函数是可以调用函数的,所以当 一个函数在内部调用自己本身时,这个函数就是递归函数。
利用递归函数求阶乘,代码示例:

def factorial(num):
    """通过递归的方式求num的阶乘"""
    # 递归退出的条件: num <= 1
    # 阶乘循环的内容: num! = num * (num-1)!

    if num > 1:
        result = num * factorial(num-1)
    else:
        result = 1
    return  result


if __name__ == '__main__':
    print("2的阶乘: ", factorial(2))
    print("3的阶乘: ", factorial(3))
    print("4的阶乘: ", factorial(4))

执行结果:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值