1. 匿名函数和有名函数 c1.py
# 匿名函数
# 1.lambda 关键字,
# 2.没有return;只能为一个表达式,不能为代码块(例如:a = x+y ,就会报错)
# 3.没有名字,
# 4.调用时赋值给一个变量,同过该变量来调用
# 5.由于匿名函数后只能接一个表达式,不能接代码,有了三元表达式就能实现简单的if else 的实现了
# 有名函数
def add_num(x,y):
return x+y
# 匿名函数
f = lambda x,y: x+y
# print(add_num(1,2))
# print(f(1,2))
# 三元表达式
# x,y x大于y x 否则 y
# 在js 中为 x > y ? x : y
# 在Python中 条件为真时返回结果 if 条件判断 else 条件为假时返回结果 ('x if x > y else y'这个只是一个表达式,结果需要用一个变量接收一下)
x = 2
y = 3
r = x if x > y else y
print(r)
2. map c2.py
# map
# 接收两个参数:第一个为一个函数,第二个是一个序列(可以传入多个列表)
# map 结合lambda使用,使某些问题更简单化了 (例如:下边的球平方)
# lambda 传入变量的个数和map第二个参数的列表个数须相同,内部个数可以不等,但最终结果取最小的个数
# 不论是map还是lambada都不能提高代码得运行效率,只能使代码更加简洁
# 问题:求一组数的平方
list_x = [1,2,3,4,5,6,7,8]
list_x1 = [1,2,3,4,5,6,7,8]
list_x11 = [1,2,3,4]
# list_y = [1, 4, 9, 16, 25, 36, 49, 64] 铜鼓map获得的,相当于list_x的每一项的映射
def square(x):
return x*x
# 思路一:通过for in
# for x in list_x:
# square(x)
# 思路二:通过map实现
r = map(square,list_x)
print(r)
print(list(r))
# 利用map对其进行简化
r_lambda = map(lambda x: x*x, list_x)
print(list(r_lambda))
# 传入多个参数
r_lambda1 = map(lambda x,y: x*x + y, list_x,list_x1)
print(list(r_lambda1))
# 传入多个参数(内部个数不等,取最少的展示)
r_lambda11 = map(lambda x,y: x*x + y, list_x,list_x11)
print(list(r_lambda11))
3. reduce c3.py
from functools import reduce
# reduce
# 不是全局的,须要从functools中引入
# 第三个参数是初始值
# 连续计算,连续调用lambda
# (第一次会将x传为1,y传为2;每次lambda表达式的计算结果作为下一次的lambda的x参与计算,一直到计算结束)
list_x = [1,2,3,4,5,6,7,8]
r = reduce(lambda x,y: x+y,list_x)
print(r)
# 还可以像这样传入两个,并不只是能计算加法其它别的运算也可
a = (0,0)
ar = reduce(lambda x,y: (x,x*x+y),(1,2))
print(ar)
4. filter c4.py
# filter 过滤
# filter 返回必须能是真和假
list_x = [1,0,1,0,0,1]
r = filter(lambda x: True if x == 1 else False,list_x)
# 简化写法
# r = filter(lambda x: x,list_x)
print(r)
print(list(r))
5. c5.py
# 命令式编程
# def(函数);if else(条件判断);for(循环)
# 用的比较多
# 函数式编程
# map ,reduce ,filter ,lambda (算子) ,
# 不太建议全盘使用函数式编程,可以在命令式编程中穿插使用,简化代码
6. 装饰器 c6.py
import time
# 装饰器
# 打印的时间戳,单位是秒
def say1():
print('hello1')
def say2():
print('hello2')
# 对修改时封闭的,对扩展是开放的
# 通过将函数作为参数传入一个函数的方式
# 现在这种方式不太好,相当远新增加了一个函数
# 打印时间这个函数本来就属于每个函数自己的方法
# 更优雅的方式,就得通过装饰器来实现了
def print_time(func):
print(time.time())
func()
print_time(say1)
print_time(say2)
7. 封装 c7.py
import time
# @ AOP思想
# 封装的基本原则:可以定义复杂,调用简单;不能接受调用复杂 (定义只一遍就好,复杂点没关系,但调用一定得简单)
# 通过@语法糖,来实现原来的调用方式不变,将新扩展的功能也能执行
# 多个函数调用一个装饰器,但每个函数可以接收不同个数的参数
# 关键字参数
def decorator(func):
def wrapper():
print(time.time())
func()
return wrapper
@decorator
def f():
print('hello')
# 不用装饰器时,感觉挺麻烦的,先把函数当参数传入,再用一个变量接收返回的函数,再将这个函数执行
# f1 = decorator(f)
# f1()
# 用了装饰器,原来的执行代码不变
f()
def decorator11(func):
def wrapper11(param):
print(time.time())
func(param)
return wrapper11
@decorator11
def f11(param):
print('hello ' + param)
# 如果需要传入一个参数
f11('world')
print('~~~不同个数参数~~~')
# 可以通过 *arg 传入多个参数
def decorator22(func):
def wrapper22(*arg,**kw):
print(time.time())
func(*arg,**kw)
return wrapper22
@decorator22
def f21(param):
print('hello ' + param)
@decorator22
def f22(param1,param2):
print('hello ' + param1)
print('hello ' + param2)
@decorator22
def f23(param1,param2,**kw):
# 不过还是比较推荐使用明确参数;但当不知道有哪些参数使,可以使用这种模糊的方式
print('hello ' + param1)
print('hello ' + param2)
# 这里print的是kw而不是**kw
print(kw)
f21('world')
f22('你好','you')
f23('sky','sun',a=1,b='flower',c='tree',d='air')
(备注:以上内容来自七月老师的学习笔记,仅作为学习使用)