函数进阶

简介: 作用域 print('in the test1') def test(): print('in the test') return test1 test() ---- in the test in the test in the test.

函数的作用域

def test1():
    print('in the test1')
def test():
    print('in the test')
    return test1
    
test()
----
in the test
in the test
in the test1

嵌套函数的执行方法

def foo():
    name='lhf'
    def bar():
        name='wupeiqi'
        def tt():
            print(name)
        return tt
    return bar

foo()()()
---
wupeiqi

匿名函数

lambda x:x+1
print(lambda x:x+1)
func=lambda x:x+1
print(func(10))
---
<function <lambda> at 0x100662e18>
11

name='alex'
func=lambda x:x+'_sb'
res=func(name)
print('匿名函数的运行结果',res)
---
匿名函数的运行结果 alex_sb

匿名函数传多个参数

lambda x,y,z:(x+1,y+1,z+1)
f=lambda x,y,z:(x+1,y+1,z+1)
v=f(1,2,3)
print(v)
---
(2,3,4)

函数式编程

高阶函数

满足俩个特性任意一个即为高阶函数
1.函数的传入参数是一个函数名
2.函数的返回值是一个函数名

什么是函数式编程

编程语言定义的函数+数学意义的函数

例一:不可变:不用变量保存状态,不修改变量
# 非函数式
a=1
def incr_test1():
    global a
    a+=1
    return a
incr_test1()
print(a)

# 函数式
n = 1
def incr_test2(n):
    return n+1
print(incr_test2(2))
print(n)

例二:第一类对象:函数即“变量”

1.函数名可以当做参数传递

  1. 返回值可以是函数名

例三:

尾调用: 在函数的最后一步调用另外一个函数(最后一行不一定是函数的最后一步)

def foo(n):
    print(n)

def bar(name):
    print('my name is %s' %name)

foo(bar('alex'))
---
my name is alex
None

返回值中包含函数。

def bar():
    print('from bar')
def foo():
    print('from foo')
    return bar
n=foo()
n()

map函数

num_l=[1,2,5,10]

def add_one(x):
    return x+1

def reduce_one(x):
    return x-1

def map_test(func,array):
    ret=[]
    for i in num_l:
        res=func(i)
        ret.append(res)

    return ret

print(map_test(add_one,num_l))
print()

终极版

def map_test(func,array):
    ret=[]
    for i in num_l:
        res=func(i)
        ret.append(res)
    return ret
map_test(lambda x:x+1,num_l)

内置函数

map

依次处理列表中的每一个元素,得到的结果还是一个列表
第一个参数为函数,第二个参数为可迭代对象

print(map_test(lambda x:x+1,num_l))
res=map(lambda x:x+1,num_l)
print('内置函数map,处理结果',res)
print(list(res))
print(传的是有名的函数',list(map(reduce_one,num_l))

filter

把列表中的值都删选一遍,最后得一个列表出来

# 面向过程的写法
movie_people=['alex_sb','wupeiqi_sb','linhaifeng','yuanhao_sb']
def filter_test(func,array):
    ret=[]
    for p in array:
        if not func(p):
            ret.append(p)
    return ret
res=filter_test(lambda n:n.endswith('sb'),movie_people)
print(res)

reduce函数

把一个完整的序列最后合并到一块得到一个值。

# 
num_l=[1,2,3,100]
def reduce_test(func,array,init=None):
    if init is None:
        res=array.pop(0)
    else:
        res=init
    for num in array:
        res=func(res,num)
    return res
print(reduce_test(lambda x,y:x*y,num_l,100))

# 用reduce来实现的方法
from functools import reduce
num_l=[1,2,3,100]
print(reduce(lambda x,y:x+y,num_l,1))
print(reduce(lambda x,y:x+y,num_l))

内置函数总结

  • map(): 处理序列中的每个元素,得到的结果是一个列表,该列表元素个数及位置与原来一样
  • filter(): 遍历序列中的每个元素,判断每个元素得到bool值,如果是True则留下来。
people=[
    {'name':'alex','age':1000},
    {'name':'yuanhao','age':10000},
    {'name':'wupeiqi','age':9000},
    {'name':'linhaifeng','age':18},
]
print(list(filter(lambda p:p['age']<=18,people)))
---
[{'name': 'linhaifeng', 'age': 18}]
  • reduce(): 处理一个序列,然后把序列进行合并操作
目录
相关文章
|
JSON 机器人 API
如何快速在钉钉群接入私有大模型
利用阿里云计算巢Appflow,通过控制台配置即可顺利将您自己开发或微调的大模型接入钉钉或其他通信软件群聊,帮您解决以下各类场景的模型调用需求: 1. 在钉钉群接入自己微调的领域大模型做问答或智能答疑; 2. 微调后的大模型在钉钉群或其他群聊中共同测试效果 3. …
|
9月前
|
机器学习/深度学习 人工智能 自然语言处理
PAI Model Gallery 支持云上一键部署 DeepSeek-V3、DeepSeek-R1 系列模型
DeepSeek 系列模型以其卓越性能在全球范围内备受瞩目,多次评测中表现优异,性能接近甚至超越国际顶尖闭源模型(如OpenAI的GPT-4、Claude-3.5-Sonnet等)。企业用户和开发者可使用 PAI 平台一键部署 DeepSeek 系列模型,实现 DeepSeek 系列模型与现有业务的高效融合。
|
10月前
|
安全 Shell 数据处理
使用Python执行Shell命令并获取结果
在实际应用中,可以根据需要选择适当的参数和方法来执行Shell命令,并处理可能出现的各种情况。无论是系统管理、自动化任务还是数据处理,掌握这些技巧都将极大地提高工作效率。
360 12
|
11月前
|
人工智能 监控 Serverless
《主动式智能导购AI助手构建》解决方案部署测评
在数字化时代,智能导购AI助手已成为提升客户体验和销售效率的重要工具。本文将基于个人体验,对《主动式智能导购AI助手构建》解决方案的部署过程进行详细评测。
140 3
|
存储 数据管理 API
Harmony状态管理AppStorageV2和PersistenceV2
Harmony状态管理AppStorageV2和PersistenceV2
353 0
Harmony状态管理AppStorageV2和PersistenceV2
|
JSON 前端开发 JavaScript
java中post请求调用下载文件接口浏览器未弹窗而是返回一堆json,为啥
客户端调接口需要返回另存为弹窗,下载文件,但是遇到的问题是接口调用成功且不报错,浏览器F12查看居然返回一堆json,而没有另存为弹窗; > 正确的效果应该是:接口调用成功且浏览器F12不返回任何json,而是弹窗另存为窗口,直接保存文件即可。
485 2
|
存储 弹性计算 网络协议
阿里云ECS内存型实例规格族特点、适用场景、指标数据参考
阿里云ECS提供了多样化的内存型实例规格族,专为需要高性能内存资源的应用场景设计。从最新的r8a系列到经过优化的re6p系列,旨在提供稳定、高效且安全的计算环境。这些实例不仅具备强大的计算性能与内存配比,还通过支持ESSD云盘和高效网络协议,显著提升了存储I/O能力和网络带宽,适用于大数据分析、高性能数据库、内存密集型应用等多种场景,为用户带来卓越的计算体验。本文将详细解析阿里云ECS中的多个内存型实例规格族,包括它们的核心特点、适用场景、实例规格及具体指标数据,为用户在云计算资源选型时提供参考。
|
算法 Linux 调度
根基已筑!Anolis OS 23.1 预览版本搭载 Linux 6.6 内核和工具链升级完成
Anolis OS 23.1 对软件包的选择和组合进行了重新规划与决策,满足更为广泛的应用场景需求。