Python进阶-05-嵌套函数&函数编程基础

Python 函数的嵌套 函数的嵌套 嵌套: 至少2层函数,嵌套在外层的就是外函数,嵌套在内层的就是内函数 def outer(): inner() # error def inner(): print("我是内函数 ... ") inner() # success 内部函数可以直接在函数外部调用么 ? 不能 inner() 调用外部函数后,内部函数可以在函数外部调用吗 ? 不可以 outer 阅读详情

来源:《Python从小白到大牛》关东升

1、嵌套函数

前面定义的函数都是全局函数,并将他们定义在全局作用域中。函数还可定义在另外的函数体内,称作“嵌套函数”。

  def calculate(n1,n2,opr):
     multiple=2

     # 定义相加函数
     def add(a,b):
        return(a+b)*multiple

     # 定义相减函数
     def sub(a,b):
        return(a-b)*multiple

     if opr=='+':
        return add(n1,n2)
     else:
        return sub(n1,n2)

  print(calculate(10,5,'+'))      #输出结果是30
  # add(10,5)                      发生错误
  # sub(10,5)                      发生错误

上述代码中定义了两个嵌套函数add()和sub()。嵌套函数可以访问所在外部函数calculate()中的变量multiple,而外部函数不能访问嵌套函数局部变量。另外,嵌套函数的作用域在外部函数体内,因此在内部函数体之外直接访问嵌套函数会发生错误。

2、函数式编程基础

函数式编程(functional programming)与面向对象编程一样都是一种编程范式,函数式编程也称为面向函数的编程。
Python并不是彻底的函数式编程语言,但还是提供了一些函数式编程必备的技术,主要有函数类型和Lambda表达式,它们是实现函数式编程的基础。

2.1函数类型

Python提供了一种函数类型function,任何一个函数都有函数类型,函数调用时,就创建了函数类型实例,即函数对象。函数类型实例与其他类型实例一样,在使用场景上没有区别,它可以赋值给一个变量,也可以作为参数传递给一个函数,还可以作为函数返回值使用。

def calculate_fun(opr):
    # 定义相加函数
    def add(a,b):
        return a+b

    # 定义相减函数
    def sub(a,b):
        return a-b

    if opr=='+':
        return add
    else:
        return sub

f1=calculate_fun('+')
f2=calculate_fun('-')

print(type(f1))                        # <class 'function'>

print("10+5={0}".format(f1(10,5)))     10+5=15
print("10-5={0}".format(f2(10,5)))     10-5=5

该函数返回的是函数对象

2.2 Lambda表达式

理解了函数类型和函数对象,学习Lambda表达式就简单了。Lambda表达式本质上是一种匿名函数,匿名函数也是函数,有函数类型,也可以创建函数对象。
定义 Lambda 表达式语法如下:

lambda 参数列表: Lambda体

lambda是关键字声明,这是一个Lambda表达式,“参数列表”与函数的参数列表是一样的,但不需要小括号括起来,冒号后面是“Lambda体”,Lambda表达式的主要代码在此处编写,类似于函数体。

    注意:Lambda体部分不能是一个代码块,不能包含多条语句,只能有一条语句,语句会计算一个结果返回给Lambda表达式,但是与函数不同的是,不需要 使用return语句返回。与其它语言中的Lambda表达式相比,Python中提供的Lambda表达式只能处理一些简单的计算。

def calculate_fun(opr):
    if opr=='+':
        return lambda a,b:(a+b)
    else:
        return lambda a,b:(a-b)

f1 = calculate_fun('+')
f2 = calculate_fun('-')

print(type(f1))                          # <class 'function'>
print("10+5={0}".format(f1(10,5)))       # 10+5=15
print("10-5={0}".format(f2(10,5)))       # 10-5=5

2.3 三大基础函数

函数式编程的本质是通过函数处理数据、过滤、映射和聚合是处理数据的三大基本操作。针对其中三大基本操作,Python提供了三个基础的函数:

    filter()、map()和reduce()

2.3.1 filter()

过滤操作使用filter()函数,它可以对可迭代对象的元素进行过滤,filter()函数语法如下:

    filter(function,iterable)

其中参数function是一个函数,参数iterable是可迭代对象。filter()函数调用时iterable会被遍历,它的元素被逐一传入function函数返回布尔值。在function函数中编写过滤条件,如果为True的元素被保留,如果为False的元素被过滤掉。

number_list=range(1,11)
number_filter=filter(lambda it : it % 2 =0,number_list)
print(list(number_filter))    # [2,4,6,8,10]

2.3.2 map()

映射操作使用map()函数,它可以对可迭代对象的元素进行变换,map()函数语法如下:

    map(function,iterable)

其中参数function是一个函数,参数iterable是可迭代对象。map()函数调用时iterable会被遍历,它的元素被逐一传入function函数,在function函数中对元素进行变换。

user=['Tony','Tom','Ben','Alex']
user_map=map(lambda u : u.lower(),users)    print(list(user_map))                      # ['tony','tom','ben','alex']

上述map()函数将user列表元素转换为小写字母,变换使用Lambda表达式lambda u : u.lower()。map()函数返回的还不是一个列表,需要使用list()函数将变换之后的数据转换为列表。
函数式编程时数据可以从一个函数“流”入另外一个函数,但遗憾的是Python并不支持"链式"API.例如,想获取user列表中T开头的名字,再将其转换为小写字母,
这样的需求需要使用filter()函数进行过滤,再使用map()函数进行映射变换。

users=['Tony','Tom','Ben','Alex']
users_filter=filter(lambda u:u.startswith('T'),users)

# users_map=map(lambda u:u.lower(),users_filter)
users_map=map(lambda u:u.lower(),filter(lambda u:u.startswith('T'),users))
print(list(users_map))

2.3.3 reduce()

聚合操作会将多个数据聚合起来输出单个数据,聚合操作中最基础的是归纳函数reduce(),reduce()函数会将多个数据按照指定的算法积累叠加起来,最后输出一个数据。
reduce()函数语法如下:

    reduce(function,iterable[,initializer])

参数function是聚合操作函数,该函数有两个参数,参数iterable是可迭代对象,参数initializer初始值。

from functools import reduce

a=(1,2,3,4)
a_reduce=reduce(lambda acc,i:acc+i,a)       # 10
# a_reduce=reduce(lambda acc,i:acc+i,a,2)   # 12
print(a_reduce)

reduce()函数是在functools模块中定义的,所以要使用reduce()函数需要导入functools模块。
调用的reduce()函数,其中lambda acc,i:acc+i是进行聚类操作的Lambda表达式,该Lambda表达式有两个参数,其中acc参数是上次累计计算结果,i是当前元素,acc+i表达式是进行累加。reduce()函数最后的计算结果是一个数值,可以直接通过reduce()函数返回。

90天玩转Python—10—基础知识篇:函数详解 在Python中,我们使用def"""Docstring: 函数的简短描述"""# 函数的实现代码return value # 可选,表示函数的返回值概念描述示例函数定义使用def关键字定义函数")函数调用使用函数名和括号调用函数函数参数包括位置参数、默认参数、可变参数和关键字参数返回值使用return语句返回函数的结果嵌套调用在一个函数内部调用另一个函数见上文示例模块中的函数函数可以定义在模块中,并可在其他模块中导入和使用见上文示例。 阅读详情

相关推荐

Python中的函数嵌套:深入理解函数的嵌套使用

函数嵌套指的是在一个函数内部定义另一个函数。内层函数只能在外层函数的作用域内使用,外部代码无法直接访问它。# 内部函数# 调用内部函数# 调用外部函数被定义在内部。只能在内部被调用,无法在外部访问。✅函数嵌套是指在一个函数内部定义另一个函数,提高代码封装性和复用性。✅常见应用包括辅助函数、闭包、动态函数返回、装饰器等。✅闭包是嵌套函数的重要概念,允许内部函数访问外部函数的变量,即使外部函数已经执行完毕。✅嵌套函数适合用于局部功能,但不宜嵌套过深,以免降低可读性。

m0_62599305的博客 1393

Python嵌套函数(Nested function)和闭包(closure)

Python嵌套函数(Nested function)和闭包(closure)

cnds123的专栏 3906

第六章(5):Python中的嵌套函数

嵌套函数,LEGB规则

狂小虎/Anthony Dave的博客 KuangXiaoHu's Blogs 416

【python】嵌套函数

在Python中,可以在一个函数内部定义另一个函数,这被称为嵌套函数(nested function)。嵌套函数可以访问其外部函数(也称为封闭函数或外部作用域)的变量,但外部函数不能直接访问嵌套函数的变量,除非这些变量被明确地返回或作为外部函数的输出。

MAOZI8的博客 2391

【python | linux05】函数用法详解(二)

局部变量,就是在函数内部定义的变量. 不同的函数,可以定义相同的名字的局部变量,但是各用个的不会产生影响.如果一个变量,既能在一个函数中使用,也能在其他的函数中使用,这样的变量就是全局变量............

小鹏linux的博客 4万+

day05-Python中的函数

所谓的函数就是一个被命名的独立的、完成特定功能的代码段(一段连续的代码),并可能给调用它的程序一个返回值。被命名的:在Python中,函数大多数是有名函数(普通函数)。当然Python中也存在没有名字的函数叫做匿名函数。独立的、完成特定功能的代码段:在实际项目开发中,定义函数前一定要先思考一下,这个函数是为了完成某个操作或某个功能而定义的。(函数的功能一定要专一)返回值:很多函数在执行完毕后,会通过return关键字返回一个结果给调用它的位置。

AGI爱好者_数仓&可视化&数据分析工程师_Vae’伯乐‘ 1116

Python函数(09函数嵌套&闭包&装饰器&匿名函数)

上述示例中的函数均定义在全局作用域,其实函数也可以定义在局部作用域,这样函数被局部作用域和其子作用于中调用(函数的嵌套)。print("沙河高晓松")print("昌平吴彦祖")print("朝阳大妈")inner()func()print("海淀网友")handler()# 昌平吴彦祖# 沙河高晓松# 海淀网友其实,大多数情况下我们都会将函数定义在全局,不会嵌套着定义函数。

weixin_45213849的博客 1131

10分钟训练你的AI歌手:RVC WebUI声音克隆保姆级教程

本文提供了一份详细的RVC WebUI声音克隆保姆级教程,指导用户如何在10分钟内利用Retrieval-based-Voice-Conversion技术训练专属AI歌手。教程涵盖从环境配置、数据准备、模型训练到最终推理应用的全流程,即使是新手也能快速上手,实现高质量的声音克隆与歌曲生成。

weixin_29073241的博客 821

Python基础05-函数

ddd

临渊-测试开发 1121

高效搭建微信公众号爬虫全流程

微信公众号爬虫系统成功完成功能测试验证。该系统具备完整的数据采集与管理能力,支持多公众号内容爬取、数据存储与统计分析。通过命令行界面可执行爬取操作(如量子位、新智元等公众号),查看最新文章列表和系统统计信息。测试显示SQLite数据库正常存储数据,所有核心功能(多源支持、文章检索、数据统计)均运行良好。系统采用模块化设计,扩展性强,为后续接入真实API或网页爬取奠定了坚实基础,是AI内容聚合的优质开发平台。🎉

weixin_44975687的博客 1556

ENVI新手避坑指南:手把手教你搞定遥感影像的坐标系转换(附ArcGIS对比)

本文详细解析ENVI与ArcGIS在遥感影像坐标系转换中的关键差异与实战技巧,特别针对新手常见问题提供避坑指南。从基础概念到高级操作,涵盖定义投影、UTM转换等核心步骤,并对比两种软件的处理精度与效率,帮助用户高效完成遥感影像处理任务。

weixin_42531925的博客 378

Python基础编程 day05

列表的操作、列表的排序以及操作、列表的嵌套、列表推导式、元组、set集合、字典、字典的操作、容器的公共运算、容器的公共函数

2201_75648520的博客 1497

ESP32实战:破解校园网WPA2-Enterprise认证的完整指南

本文详细介绍了如何使用ESP32开发板破解校园网WPA2-Enterprise认证的完整指南。通过硬件准备、环境搭建、核心代码实现及常见问题排查,帮助开发者解决企业级WiFi连接难题,特别适用于校园网环境下的物联网设备开发。

weixin_29194817的博客 457

Python基础到进阶

Python基础到进阶????????

Shawn派大星 4878

中科蓝讯(第一次使用指南)

中科蓝讯 新手指南

qq_48579018的博客 1万+

CAPL自动化测试

通过本文的学习,读者应该对CAPL自动化测试有了初步的了解,并能够编写复杂的CAPL脚本。在实际项目中,CAPL的应用非常广泛,希望读者能够通过不断的学习和实践,掌握更多的CAPL技巧,提高自己的开发能力。

闲人编程的博客 1528

python基础——05函数

def fun(a)

2303_76544787的博客 856

RAGFlow体验大提升:使用GPU加速

场景:在正常部署过程中,启动RAGFlow会用到docker-compose.yml文件来启动。但是在实际使用过程中,会发现RAGFlow极其的卡和笨重,给一一种很不好的用户体验,有没有一种可以让RAGFlow加速的呢?进入RAGFlow的docker目录下会有发现有很多docker的配置文件。方法一:选择docker-compose-gpu.yml这个来启动项目。两个方法选其一 ,就会让你的RAGFlow的使用起来非常的丝滑!方法二:在docker-compose.yml末尾加上。

Ven%的博客 3156

python嵌套函数return_python嵌套函数

Python装饰器的诞生过程Python中的装饰器是通过利用了函数特性的闭包实现的,所以在讲装饰器之前,我们需要先了解函数特性,以及闭包是怎么利用了函数特性的。一、函数特性Python中的函数特性总的来说有以下四点:1. 函数作为变量传递def add(x):return x + 1a = add...文章技术小能手2018-09-171131浏览量python中的闭包函数闭包函数初探通常我们定义...

weixin_39692557的博客 1380

第4-4课:状态压缩与动态规划

什么是状态压缩 动态规划问题中重要的一环就是确定状态的定义,在大多数情况下,状态中所包含的信息并不多,比如线性规划问题的状态一般表示为 d[i,j](i 表示状态的位置,j 表示状态的阶段),算法实现时可用二维数组保存计算过程中的状态。但是也有一些问题,它的状态中包含的信息很多,比如它的状态可能是一个集合中各个元素的情况,或者是像铺瓷砖问题这样,是某一行的覆盖状态。如果沿用简单的状态表示方法,则可...

oRbIt 的专栏 700

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Python函数式编程

介绍了函数式编程知识:函数式编程基本、函数式编程的三大基础函数和装饰器等内容

2302_76708905的博客 1957

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【Python】链式、嵌套调用、递归、函数栈帧、参数默认值和关键字参数

函数的链式调用、嵌套调用、函数栈帧、调用栈、函数递归、参数默认值和关键字参数

Yeeear的博客 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

python-基础篇-函数

def 函数名() : 函数封装的代码……def是英文define的缩写函数名称应该能够表达函数封装代码的功能,方便后续的调用函数名称的命名应该符合标识符的命名规则可以由字母下划线和数字组成不能以数字开头不能与关键字重名必须保证带有默认值的缺省参数在参数列表末尾所以,以下定义是错误的!有时可能需要一个函数能够处理的参数个数是不确定的,这个时候,就可以使用多值参数python中有两种参数名前增加一个可以接收元组参数名前增加两个可以接收字典一般在给多值参数命名时,习惯使用以下两个名字*args。

stqer的博客 1122

Python——嵌套函数、闭包、装饰器和lambda匿名函数

Python的装饰器是一个非常强大的工具,它提供了一种优雅的方式来增强或修改函数的功能,而无需修改函数本身的代码。ython的装饰器(Decorator)是一个非常强大且灵活的工具,它允许你在不修改原有函数或类定义的情况下,给函数或方法添加新的功能。装饰器本质上是一个函数,这个函数接收一个函数作为参数并返回一个新的函数。:嵌套函数提供了一种封装代码的方式,使得内部函数只能被外部函数访问(如果外部函数不返回内部函数的话)。函数经常与Python中的高阶函数(接受函数作为参数或返回函数的函数)一起使用,比如。

weixin_45720999的博客 1397

39_Python函数嵌套与参数

如何在函数中调用其他函数,以及如何定义和使用函数参数。函数嵌套可以调用其他函数,参数列表用于封装函数中的未知数据,参数在函数调用时被替换。形参和实参数量需一致,但名字可以相同。参数列表:如果函数要实现的功能涉及到一些未知项数据,此时可以将未知项设置为参数。需求:封装一个函数,传入两个数字,输出两个数字较大的值。格式:参数1, 参数2, 参数3......一个函数中可以调用别的函数。

在科技的浪潮中,我们寻找着创新的火种,在代码的海洋里,我们编织着智慧的网。腾飞开源,就是这样一个由技术精英汇聚而成的博客平台,我们致力于分享在Java、Python、IoT和人工智能等领域的最新研究成果和实战经验。 在腾飞开源的博客上,你会看到紧跟技术前 873
上一篇: Python进阶-04-函数返回值&函数变量作用域&生成器
下一篇: Python进阶-06-面向对象概述&基本特征&类的对象
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值