python基础之函数式编程
一、定义:
函数作为参数作用:将核心逻辑传入方法体,使该方法的适用性更广,体现了面向对象的开闭原则;
函数作为返回值作用:逻辑连续,当内部函数被调用时,不脱离当前的逻辑。
二、高阶函数:
1、定义:将函数作为参数或返回值的函数。
2、常见内置高阶函数:
三、lambda表达式:
四、闭包:
五、函数装饰器(decorators):
六、基础代码:
代码1:
"""
函数式编程 -- 方法作为参数
""" def fun01():
print("fun01执行喽") # 调用fun01,将返回值赋值给变量a
# a = fun01() # 将函数值赋值给变量a(没有执行fun01)
a = fun01
# 调用变量a,间接执行函数fun01
a() # 将方法fun01作为方法的参数func进行传递
def fun02(func):
print("fun02执行喽")
# 对于fun02的定义者而言,不知道也不需要知道func的具体逻辑.
func() fun02(fun01) list01 = [1,2,33,4,45,6]
# def find_demo01(target):
# for item in target:
# if item> 5:
# yield item
#
# def find_demo02(target):
# for item in target:
# if item % 2 != 0:
# yield item
#
# def find_demo03(target):
# for item in target:
# if item < 3:
# yield item # --------------------------------------------
# 相同点:
def find_demo(target,func):
for item in target:
# 本行代码,又将不变的与变化的紧密相连
# if condition01(item):
# 本行代码,使用形参func将不变的与变化的隔离开.
if func(item):
yield item
# --------------------------------------------
# 提取不同点:
def condition01(item):
return item> 5 def condition02(item):
return item % 2 != 0 def condition03(item):
return item < 3 for item in find_demo(list01,condition03):
print(item)
代码2:
"""
lambda 表达式(匿名方法)
语法:
lambda 参数:方法体
练习:
exercise05.py
""" def fun01():
print("我是普通方法") fun01() def fun02(a):
print("我是普通方法,参数是,", a) fun02(500) def fun03():
return True print(fun03()) # -------------------------
a01 = lambda: print("我是lambda方法")
a01() a02 = lambda a: print("我是lambda方法,参数是,", a)
a02(500) a03 = lambda: True
print(a03())
#------------------------------------ from common.custom_list_tools import ListHelper
list01 = [1,2,33,4,45,6] for item in ListHelper.find_all(list01,lambda item:item > 5):
print(item) for item in ListHelper.find_all(list01,lambda item:item % 2 != 0):
print(item) # 提取不同点:
# def condition01(item):
# return item> 5
#
# def condition02(item):
# return item % 2 != 0
#
# def condition03(item):
# return item < 3 # for item in ListHelper.find_all(list01,condition01):
# print(item)
代码3:
"""
高阶函数 """
from day16.common.custom_list_tools import ListHelper # 敌人类(编号/姓名/攻击力/血量/攻击速度...)
class Enemy:
def __init__(self, id, name, hp, atk, atk_speed):
self.id = id
self.name = name
self.hp = hp
self.atk = atk
self.atk_speed = atk_speed list01 = [
Enemy(101, "玄冥大老", 200, 800, 5),
Enemy(102, "玄冥小老", 150, 700, 3),
Enemy(103, "qtx", 800, 1000, 50),
Enemy(104, "吕泽玛利亚", 0, 300, 2),
Enemy(105, "赵金多", 500, 900, 10),
] # 1. filter 过滤,类似于ListHelper.find_all.
# 过滤出编号大于102的敌人
# for item in filter(lambda e: e.id > 102, list01):
# print(item.id)
#
# for item in ListHelper.find_all(list01, lambda e: e.id > 102):
# print(item.id) # 2. map 映射,类似于ListHelper.select
# 映射出所有敌人的姓名
for item in map(lambda e:e.name,list01):
print(item) for item in ListHelper.select(list01,lambda e:e.name):
print(item) # # 按照血量升序排列,类似于ListHelper.order_by
# for item in sorted(list01,key = lambda e:e.hp ):
# print(item.hp)
#
# # 按照血量降叙排列
# for item in sorted(list01,key = lambda e:e.hp,reverse=True):
# print(item.hp) # ListHelper.order_by(list01,lambda e:e.hp)
# for item in list01:
# print(item.hp) # 获取攻击力最大的敌人
result = max(list01,key = lambda e:e.atk)
print(result.name) result = ListHelper.get_max(list01,lambda e:e.atk)
print(result.name)
代码4:
"""
Encolsing 外部嵌套作用域
""" # 全局变量G
g01 = 100 def fun01():
# fun01局部变量L
# E外部嵌套作用域
a = 1 def fun02():
b = 2 # fun02局部变量L
# print("fun02:", a) # 可以访问外部嵌套变量a
# a = 2222 # 没有修改外部嵌套变量a,而是创建了新的局部变量a
# print("fun02:",a)
nonlocal a # 声明外部嵌套变量a
a = 2222
print("fun02:",a) fun02()
print("fun01:",a) fun01()
代码5:
"""
闭包 """ def fun01():
print("fun01执行喽")
a = 1
def fun02():
print("fun02执行喽")
print("外部变量是:",a)
return fun02 # 得到的是内部函数
result = fun01()
# 调用内部函数,因为内部函数使用了外部变量,所以称之为闭包.
result()# 可以使用外部变量,说明外部函数在调用后没有释放. # 案例: def give_gift_money(money):
"""
获取压岁钱
"""
print("得到了%d压岁钱"%money)
def child_buy(target,price):
"""
孩子需要买东西
"""
nonlocal money
if money >= price:
money -= price
print("孩子花了%d钱,买了%s,还剩下%d钱."%(price,target,money))
else:
print("压岁钱不够了")
return child_buy action = give_gift_money(10000)
action("98k",3500)
action("小猪佩奇",300)
action("大黄蜂",8000) # 体会:闭包使得逻辑连续(因为内部函数可以使用外部变量).
代码6:
"""
装饰器
-- 闭包的应用
""" # def say_hello():
# print("hello")
#
#
# def say_goodbye():
# print("goodbye")
#
#
# say_hello()
# say_goodbye() # 需求:在两个方法实现的功能基础上,增加新功能(打印方法名称) # def say_hello():
# print(say_hello.__name__)
# print("hello")
#
#
# def say_goodbye():
# print(say_goodbye.__name__)
# print("goodbye")
#
#
# say_hello()
# say_goodbye() # 缺点:代码重复.
# 解决:提取打印方法名称的功能 # def print_func_name(func):
# print(func.__name__)
#
# def say_hello():
# # print(say_hello.__name__)
# print_func_name(say_hello)
# print("hello")
#
#
# def say_goodbye():
# # print(say_goodbye.__name__)
# print_func_name(say_goodbye)
# print("goodbye") # say_hello()
# say_goodbye()
# 缺点:在两个已有功能的内部,增加新功能,代码可读性差. # def say_hello():
# # print_func_name(say_hello)
# print("hello") # def say_goodbye():
# # print_func_name(say_goodbye)
# print("goodbye")
#
# def print_func_name(func):
# # 包装新旧功能
# def wrapper():
# # 增加的新功能
# print(func.__name__)
# # 旧功能
# func()
#
# return wrapper # 返回包装器
#
# say_hello = print_func_name(say_hello)
# say_goodbye = print_func_name(say_goodbye)
#
# say_hello()
# say_goodbye() # 缺点:调用者完成包装新旧方法的任务.
# 解决:应该有定义者完成. # def print_func_name(func):
# # 包装新旧功能
# def wrapper():
# # 增加的新功能
# print(func.__name__)
# # 旧功能
# func()
#
# return wrapper # 返回包装器
#
# @print_func_name # say_hello = print_func_name(say_hello)
# def say_hello():
# print("hello")
# return "哈哈"
#
# @print_func_name
# def say_goodbye():
# print("goodbye")
#
# #---------以上是定义者--以下是调用者-----------------
# say_hello()
# say_goodbye() # 缺点:旧功能的返回值不能被客户端代码接受到.
# 旧功能的参数,客户端代码也无法传入. # def print_func_name(func):
# # 包装新旧功能
# def wrapper(name):
# # 增加的新功能
# print(func.__name__)
# # 旧功能
# return func(name)
#
# return wrapper # 返回包装器 # 缺点:包装器不能适应所有的旧功能参数
def print_func_name(func):
# 包装新旧功能
def wrapper(*args,**kwargs):
# 增加的新功能
print(func.__name__)
# 旧功能
return func(*args,**kwargs) return wrapper # 返回包装器 @print_func_name # say_hello = print_func_name(say_hello)
def say_hello(name):
print(name,"hello")
return "哈哈" @print_func_name
def say_goodbye(name,age):
print(age,name,"goodbye") #---------以上是定义者--以下是调用者-----------------
print(say_hello("张无忌"))
say_goodbye("赵敏",25)
代码7:
"""
练习:使用装饰器实现:
为两个已有功能(进入后台,删除订单),增加新功能(验证权限).
""" # 1. 定义装饰器(新功能 + 旧功能) def verify_permissions(func):
def wrapper(*args, **kwargs):
print("验证权限")
return func(*args, **kwargs)
return wrapper # 2. 拦截调用
@verify_permissions
def enter_background(loginId,pwd):
print(loginId,pwd)
print("进入后台系统.....") @verify_permissions
def delete_order(order_id):
print("删除%d订单..."%order_id) enter_background("zs",123)
delete_order(101)
代码8:
"""
练习2:为两个已有功能(存款取款),添加新功能(验证账户) """
def verify_accont(func):
def wrapper(*args,**kwargs):
print("验证账户")
return func(*args,**kwargs)
return wrapper #deposit = verify_accont(deposit)
@verify_accont
def deposit(money):
print("存款:",money) @verify_accont
def withdraw():
print("取钱")
return 10000 deposit(5000)
print(withdraw())
代码9:
"""
练习:
为学生的学习方法,添加新功能(打印执行时间)
""" import time def print_execute_time(func):
def wrapper(*args, **kwargs):
# 记录执行前的时间
start_time = time.time()
result = func(*args, **kwargs)
# 统计执行时间
execute_time = time.time() - start_time
print("执行时间是:", execute_time)
return result return wrapper class Student:
def __init__(self, name):
self.name = name @print_execute_time
def study(self):
print("开始学习喽")
time.sleep(2) # 睡眠两秒 模拟学习了两秒 s01 = Student("无忌")
s01.study()
python基础之函数式编程的更多相关文章
- Python基础:函数式编程
一.概述 Python是一门多范式的编程语言,它同时支持过程式.面向对象和函数式的编程范式.因此,在Python中提供了很多符合 函数式编程 风格的特性和工具. 以下是对 Python中的函数式编程 ...
- python基础之函数式编程、匿名函数、内置函数
一 函数式编程 不修改外部状态. 模仿数学里得函数进行编程. 用函数编程写出得代码相当精简. 可读性比较差. 例子: y=2*x+1 x=1 def test(x): return 2*x+1 tes ...
- Python进阶:函数式编程实例(附代码)
Python进阶:函数式编程实例(附代码) 上篇文章"几个小例子告诉你, 一行Python代码能干哪些事 -- 知乎专栏"中用到了一些列表解析.生成器.map.filter.lam ...
- 可爱的 Python : Python中的函数式编程,第三部分
英文原文:Charming Python: Functional programming in Python, Part 3,翻译:开源中国 摘要: 作者David Mertz在其文章<可爱的 ...
- Python Decorator 和函数式编程
看到一篇翻译不错的文章,原文链接: Python Decorator 和函数式编程
- Python进阶之函数式编程(把函数作为参数)
什么是函数式编程? 什么是函数式编程? 函数:function 函数式:functional,一种编程范式 函数式编程是一种抽象计算的编程模式 函数≠函数式,比如:计算≠计算机 在计算机当中,计算机硬 ...
- Python 基础之socket编程(二)
Python 基础之socket编程(二) 昨天只是对socket编程做了简单的介绍,只是把socket通信的框架搭建起来,要对其中的功能进行进一步的扩充,就来看看今天的料哈! 一.基于tcp的套接字 ...
- python基础之socket编程 (转自林海峰老师)
python基础之socket编程 阅读目录 一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 ...
- Python之面向对象函数式编程
Python之面向对象函数式编程 函数式编程的根本就是用 def 去模拟数学式的编程逻辑. 类似与 y = 2*x + 1 ,当x = 3 时,函数的结果y就得7. def test(x): retu ...
随机推荐
- 资产信息之收集资产代码流程,API的一个认证,数据库表的设计
收集资产代码流程 1.起初我们些的代码是面条式的一堆的逻辑判断. 后来通过了不断的优化升级实现了一个3种方案都支持的CMDB系统,我们用哪种方案只需要在配置文件里修改一下设置就行了. 同时我们 ...
- 手把手教你写vue插件并发布(二)
前记:上一篇 https://www.cnblogs.com/adouwt/p/9211003.html, 说到了一个完整的vue插件开发.发布的流程,总结下来就讲了这么一个事,如何注入vue, 如果 ...
- [HTTP]POST报文中Content-Type对正文解析的影响
概述 在POST请求中,理论上请求端程序可以发送任意格式报文正文,但是最好在报文头Content-Type字段标明正文的格式,方便接收端根据Content-Type正确处理正文. 传统HTML-for ...
- oracle wallet使用与维护
oracle wallet使用与维护2015年05月26日 17:58:55 SilenceRiver 阅读数:1614oracle wallet使用与维护---oracle无密码登录分类: Orac ...
- apache http添加证书转成https
使用yum安装的apache. 第一步,需要把准备好的证书上传到服务器.具体位置:/app/cacerts/ 第二步,安装ssl. 命令:yum install mod_ssl openssl 安装完 ...
- jdbc连接数据库以及crud(简单易懂,本人亲测可用 有源代码和数据库)
今天呢!重新整理了一边jdbc的相关操作:现在来说对于很多框架都使用mybatis和hibernate来操作数据库 ,也有很多使用自己简单封装的ssm或者是其他的一些框架来操作数据库,但是无论使用哪一 ...
- WordPress 文章点赞
Installation 上传 wp-zan目录 到 /wp-content/plugins/ 目录 在后台插件菜单激活该插件 添加 <?php wp_zan();?> 到需要的位置 De ...
- mysql的if用法解决同一张数据表里面两个字段是否相等统计数据量。
MySQL的使用用法如下所示:格式:if(Condition,A,B)意义:当Condition为true时,返回A:当Condition为false时,返回B.作用:作为条件语句使用.mysql的i ...
- python序列化与反序列
python序列化与反序列 在python中提供了两个模块可进行序列化.分别是pickle和json.他们两者的功能都差不多,dumps和dump都是进行序列化,而loads和load则是反序列化. ...
- 563. Binary Tree Tilt
https://leetcode.com/problems/binary-tree-tilt/description/ 挺好的一个题目,审题不清的话很容易做错.主要是tilt of whole tre ...