12函数进阶

函数进阶

函数的作用域

作用域又可以被称为命名空间,指变量起作用的范围。Python变量作用域可以分为四种,分别为局部作用域、嵌套作用域、全局作用域、内置作用域。

作用域 英文
局部作用域 Local
嵌套作用域 Enclosing
全局作用域 Global
内置作用域 Buiit-in

内建作用域是特质python api内置的一些操作,例如 len 、max等函数,无需声明就可使用。

变量作用域

一个程序的所有的变量并不是在哪个位置都可以访问的。访问权限决定于这个变量是在哪里赋值的。变量的作用域决定了在哪一部分程序你可以访问哪个特定的变量名称。两种最基本的变量作用域如下:

  • 全局变量:定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。
  • 局部变量:局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。
x = 2

def func():
    x = 3  # 局部变量    
    return x

result = func()
print(result)  # 3
print(x)  # 2

当我们在代码里使用变量时,Python创建对象,改变对象或查找对象都是在一个所谓命名空间下进行的(一个保存变量名的地方)。而函数除了打包代码之外,还定义了一个新的变量空间,一个函数所有的变量,都与函数的命名空间相关联:

  • def 内定义的变量名能够被 def内的代码使用,不能在函数外部引用这样的变量名
  • def之中的变量名与def之外的变量名并不冲突

也就是说:

  • 如果一个变量在def内被赋值,它就被定义在这个函数之内
  • 如果在def之外赋值,它就是整个文件全局的

回到上面的那个例子:

x = 2
def func(x):
    x = 3 
"""
尽管这两个变量名都是x,但是他们作用域(命名空间)可以把他们区别开。
作用域(命名空间)有助于防止程序之间变量名的冲突,而且,有助于函数成为更加独立的单元。
在Python中,函数定义了一个函数本地内的作用域,
而像x = 2这样赋值语句定义了一个全局作用域(模块级别的变量,使用范围仅限于单个文件)。
而像x = 3这样赋值语句定义了一个局部作用域(范围仅限于函数内部)。
"""

global关键字

函数中修改不了全局作用域的变量如需修改,加global关键字,声明变量为全局变量

y = 10
def func():
    global y
    y = 5
    print('y1 =', y)

func()	# y1 = 5
print('y2 =', y)  # y2 = 5
"""
函数体中使用了global关键字,声明y为全局变量,故在函数中就改变了y的值
若函数体中没有global y 语句,最后的结果就是y1 = 5,y2 = 10 4;这就跟上面的那个案例相同了
"""

nonlocal关键字

# E(enclosing):嵌套的父级函数的局部作用域
def mytest1():
    b = 6   # 局部变量    相对而言 我们的b是函数mytest2的全局变量
    def mytest2():
        #
        nonlocal b  # nonlocal 关键字用于在嵌套函数内部使用变量 了解即可 用的时候比较少
        b = 7  # 重新开辟了内存空间  注释掉直接打印b
        print(b, id(b))

    mytest2()
    print(b, id(b))

mytest1()
"""
7 1440395648
7 1440395648 
"""

函数作用域的优先级

12函数进阶

高阶函数

概念与调用

高阶函数:一个函数可以作为参数传给另外一个函数,或者一个函数的返回值为另外一个函数(若返回值为该函数本身,则为递归),满足其一则为高阶函数。

  • 一个函数的函数名作为参数传给另外一个函数
# 频繁的使用 需要其他的功能结合使用
def func():
    print("定义一个普通函数")

def high_level(func):
    print("定义一个高阶函数")  # 此函数的功能
    # 在函数内部,通过传入的函数参数调用
    func()  # 调用我传入的函数名的函数

high_level(func)
"""
定义一个高阶函数
定义一个普通函数
"""
  • 一个函数返回值(return)为另外一个函数(返回为自己,则为递归)
def func():
    print("定义一个普通函数")

def high_level(func):
    print("定义一个高阶函数")
    return func  # high_level
    #  return func() 这个是直接返回函数调用,递归函数就是如此

res = high_level(func)
# 高阶函数返回函数之后在调用func函数
res()
"""
定义一个高阶函数
定义一个普通函数
"""

递归

  • 函数内部自己调用自己
  • 必须要有出口
# 打印1-9(range)
def func(start, end, step=1):
    print(start)
    if start >= end:
        return  # 结束函数运行,停止递归
    func(start + step, end, step)

func(1, 9)

3、内置高阶函数

1)lambda函数

  • 匿名函数
  • 优点:节省内存空间,优化代码
# lambda函数
# 当函数里面只有一行代码时,可以转换为匿名函数
# 实际中,只使用一次,不需要考虑函数的名字,只需要功能
# lambda 传入的参数:返回的数据
def add(a, b):
    return a + b

print(add(1, 2))

print((lambda a, b: a + b)(1, 2))
add1 = (lambda a, b: a + b)  # 定义名字,重复使用

print(add1(2, 2))
print(add1(2, 3))
  • lamada参数实例
import random

# 无参数
sdds = lambda: random.random()
sdds()

# 一个参数
fun1 = lambda x: x
print(fun1('hello python'))

# 默认参数 (缺省参数)
fun2 = lambda a, b, c=100: a + b + c
print(fun2(10,19,1000))

# 可变参数之args
fun3 = lambda *args: args
print(fun3((1,2,3,4,5)))

# 可变参数之kwargs
fun4 = lambda  **kwargs: kwargs
print(fun4(name='yueyue',age=18,height='178cm'))

# 带判断的lambda表达式
asd = lambda x: x if (x > 10) else 10
print(asd(5))
#### 它是以下带有def和return 关键字的普通函数的更简单版本:
def fun(x):
    if x > 10:
        return x
    else:
        return 10
print(fun(5))
  • 列表中字典数据排序
# 列表中的字典排序
# 需求:假设我们需要对字典中的年龄进行排序
user_list = [
    {"name": 'zhangsan1', 'age': 18},
    {"name": 'lisi1', "age": 19},
    {"name": 'wangwu1', "age": 17}
]

def getAge(element):
    return element['age']

# 传递给key参数的是一个函数,它指定可迭代对象中的每一个元素来按照该函数进行排序
user_list.sort(key=getAge,reverse=True)
print(user_list)


# 我们需要使用匿名函数,使用sort函数中的key这个参数,来指定字典比大小的方法
# reverse参数控制升序与降序排列
user_list.sort(key=lambda x:x['age'],reverse=True)
print(user_list)

2)map函数

  • 语法:map(function, iterable, ...)
  • 参数:function —— 函数;iterable —— 可迭代对象
  • 作用:通过将指定的function函数依次作用在给定序列iterable中的每一个元素上,得到一个新的list并返回。注意,map不改变原list,而是返回一个新list。
# map函数 映射
# 列表数据转为字符串
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(list(map(lambda i: str(i), list1)))   # ['1', '2', '3', '4', '5', '6', '7', '8', '9']

print(list(map(str, list1)))    # ['1', '2', '3', '4', '5', '6', '7', '8', '9']

3)reduce函数

  • reduce() 函数来自 functools 模块。使用 reduce() 函数,需要在代码开始时使用以下语句导入 functools 模块:
from functools import reduce

关于模块(module)的知识和使用方法后续会进行深入学习。

  • 作用:先从列表(或序列)中取出2个元素执行指定函数,并将输出结果与第3个元素传入函数,输出结果再与第4个元素传入函数,…,以此类推,直到列表每个元素都取完。
from functools import reduce  # 导入内置reduce函数

def fn(x, y):
    return x + y

res = reduce(fn, [1, 3, 5, 7, 9])
print(res)	# 25

4)filter函数

  • 语法:reduce(function, iterable)
  • 参数:function —— 函数;iterable —— 可迭代对象
  • 作用:filter函数也是接收一个函数和一个序列的高阶函数,其主要功能是过滤。
# 在一个list中,删掉偶数,只保留奇数
def is_odd(n):
    return n % 2 == 1

print(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))  # <filter object at 0x00000193E06AE860>
print(list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])))  # [1, 5, 9, 15]

学员管理系统

这个建议自行去写一下,除了这个系统,还有图书馆管理系统,宿舍管理系统等,网络上都有许多教程,换汤不换药的,有需要可以联系。

原文链接:https://www.cnblogs.com/daguo118/p/17314962.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:12函数进阶 - Python技术站

(0)
上一篇 2023年4月17日
下一篇 2023年4月17日

相关文章

  • python导入其他目录下模块的四种情况

    当我们在编写Python项目时,经常需要导入其他目录下的模块。这里介绍四种情况下Python导入其他目录下模块的方法。 1. 直接导入 当你需要导入一个和当前文件在同一级目录下的Python模块时,可以使用直接导入的方式。例如,如果你需要导入一个名为module.py的模块,该模块和当前文件在同一级目录下,那么可以使用以下的代码: import module…

    python 2023年6月3日
    00
  • python实现括号匹配的思路详解

    以下是“Python实现括号匹配的思路详解”的完整攻略: 一、问题描述 在编程中,括号匹配是一个常见的问题。给定一个字符串,判断其中的括号是否匹配。本文将详细讲解如何使用Python实现括号匹配,并提供两个示例说明。 二、解决方案 2.1 栈 在Python中,我们可以使用栈来实现括号匹配。我们可以遍历字符串中的每个字符,如果是左括号,则将其压入栈中;如果是…

    python 2023年5月14日
    00
  • Python中函数的基本定义与调用及内置函数详解

    Python中函数的基本定义与调用 在Python中,函数是一段预先定义的可重用代码块,可以把一些常用的操作封装到函数中,以此来简化代码的复杂度和重复性。 Python中定义函数非常简单,用def关键词,后面紧跟函数名和圆括号,即可定义一个函数。下面是一个简单的函数定义示例: def greet(name): print(f"Hello, {nam…

    python 2023年6月5日
    00
  • Python提取特定时间段内数据的方法实例

    为了提取特定时间段内的数据,我们可以使用Python中的多种时间日期处理模块。以下是一些常用的模块和方法: datetime模块:Python内置的日期时间处理模块,提供了多种日期时间对象和计算方式。 pandas模块:提供了一系列有用的日期时间处理方法,尤其适合处理时间序列数据。 程序实现步骤如下: 步骤1:读取数据 使用pandas.read_csv()…

    python 2023年6月2日
    00
  • Python多线程和队列操作实例

    Python多线程和队列操作实例 什么是多线程和队列 在单线程Python中,每个任务都必须等上一个任务结束后才能执行下一个任务。当任务的处理过程中存在大量I/O操作时,这种方式就会非常慢。而多线程和队列机制可以在保证数据安全的同时将任务交替执行,提高程序处理效率。 多线程是指程序中同时运行多个线程,每个线程可以处理不同的任务。而队列则是一种数据结构,可以实…

    python 2023年6月6日
    00
  • Pandas读取csv时如何设置列名

    当使用Pandas库读取CSV文件时,默认第一行会被当作列名。但是,有些情况下,CSV文件并不包含列名,或者列名并不符合我们的要求。这时候需要手动设置列名。 下面是Pandas读取CSV文件并设置列名的完整攻略,包括两个示例说明: 1. 安装和导入Pandas库 首先需要通过pip安装Pandas库,命令如下: pip install pandas 安装完成…

    python 2023年6月3日
    00
  • python实现自动化报表功能(Oracle/plsql/Excel/多线程)

    当然,我很乐意为您讲解Python实现自动化报表功能的完整实例教程。以下是教程的详细步骤: 1. 准备工作 在开始学习和实现自动化报表功能之前,有几个准备工作需要完成。首先,需要安装Oracle数据库和PL/SQLDeveloper。其次,还需要Python编程语言的基本知识,以及对Excel文件格式的了解和掌握。 2. 连接Oracle数据库 在PL/SQ…

    python 2023年5月13日
    00
  • python 魔法函数实例及解析

    Python 魔法函数实例及解析 Python 中的魔法函数(Magic Function)是指以双下划线__开头和结尾的函数,例如__init__、__len__、__str__等。这些魔法函数可以让Python对象拥有上下文感知能力,并使对象的行为更像Python内置类型。Python 内部的实现也大量使用了魔法函数。在本篇文章中,我们将详细讲解 Pyt…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部