# -*- coding: utf-8 -*-
"""
Created on Thu Jul 11 19:27:42 2019
@author: cheng
"""
####Python语言的高级特性
#函数式编程
-基于lambda演算的一种编程方式
-函数可以作为参数,同样可以作为返回值
-python函数式编程只是借鉴函数式编程的一种特点
-高阶函数
-返回函数
-匿名函数
-装饰器
-偏函数
#lambda表达式
-函数:最大程度复用代码
-存在问题:如果函数很小,很短,会啰嗦
-调用次数少,会造成浪费
-对于阅读者,造成流程被迫中断
-lambda表达式(匿名函数)
-一个表达式,函数体相对简单
-不是一个代码块,仅仅是一个表达式
-可以有参数
#lambda表达式的用法
-以lambda开头
-紧跟一定的参数
-参数后用冒号和表达式隔开
-只是一个表达式
stm = lambda x: 100*x
stm(85)
st = lambda x,y,z:x + y*10 +z*100
st(6,5,4)
-高阶函数
-把函数作为参数使用的函数
-变量可以赋值
a = 100
b = a
-函数名称就是一个变量
def funA():
print('In funA')
funB = funA
funB()
#高阶函数举例
#funA是普通函数,返回一个传入数字的100倍
def funA(n):
return n * 100
#再写一个函数,把传入参数乘以300倍
def funB(n):
return funA(n) * 3
print(funB(3))
#写一个高阶函数
def funC(n,f):
#假定函数把N放大100倍
return f(n) * 3
print(funC(3,funA))
def funD(n):
return n * 10
#需求变更,把N放大30倍
print(funC(3,funD))
####系统高阶函数-map
-把集合或者列表的元素,每一个都按照一定的规则进行操作
-map提供函数映射功能
l1 = [i for i in range(10)]
print(l1)
def my(n):
return n * 10
l3 = map(my,l1)
#map类型是可迭代的,可以使用for循环
for i in l3:
print(i,end = ' ')
#reduce
-归并,缩减
-把一个可迭代对象最后归并成一个结果
-对于作为参数的函数要求:必须由两个参数,必须由返回结果
-reduce([1,2,3,4,5]) == f(f(f(f(1,2),3),4),5)
-需要functools包
from functools import reduce
#定义一个操作函数
def m(x,y):
return x+y
r = reduce(m,[1,2,3,4,5])
print(r)
#filter函数
-过滤函数,对一组数据进行过滤,符合条件的留下
-跟map比较:
-相同:都对列表的每一个元素逐一进行操作
-不同:
-map会生成一个跟原来数据相对应的新队列
-filter不一样
-filter函数:
-利用给定函数进行判断
-返回值一定是布尔值
-对于一个列表,对其进行过滤,偶数组成一个列表
def isEven(a):
return a % 2 ==0
l = [1,2,3,4,5,6,9,8,7]
rst = filter(isEven,l)
print([i for i in rst])
####高阶函数-排序
-key:在排序前对每一个元素进行key函数运算
a = [4,5,6,89,55,23,45]
a1 = sorted(a)
a2 = sorted(a,reverse=True)
print(a1)
print(a2)
-按绝对值排序
a = [-43,56,-89,65,2,31]
a1 = sorted(a,key=abs)
print(a1)
a = ['cheng','Dddd','qwert','ASdf']
a1 = sorted(a)
a2 = sorted(a,key=str.lower)
print(a1)
print(a2)
####返回函数
def myF(a):
print('IN myF')
return None
a = myF(8)
print(a)
-函数作为返回值返回,被返回的函数在函数体内定义
def m2():
def m3():
print('in m3')
return 3
return m3
f3 = m2
print(f3)
f3()
#负责一点的返回函数的例子
def myf4( *args):
def myf5():
r = 0
for n in args:
r += n
return r
return myf5
f5 = myf4(1,2,3,4,5,6,7,8,9,0)
f5()
f6 = myf4(10,20,30,40,50)
f6()
####闭包(closur)
-当一个函数在内部定义函数,并且内部的函数应用外部函数的参数或者局部变量,当内部函数被当做返回值的时候,
相关参数和变量保存在返回的函数中
#闭包常见坑
#返回闭包时,返回函数不能引用任何循环变量
def count():
fs = []
for i in range(1,4):
#定义了一个函数f
def f():
return i * i
fs.append(f)
return fs
f1,f2,f3 = count()
print(f1())
print(f2())
print(f3())
-修改之后的函数
def count1():
def f(j):
def g():
return j * j
return g
fs = []
for i in range(1,4):
fs.append(f(i))
return fs
f1,f2,f3 = count1()
print(f1())
print(f2())
print(f3())
####装饰器
-在不改动函数代码的基础上无限制扩展函数功能
-一旦定义,则可以装饰任意函数
def hello():
print('hello world')
hello()
f = hello
f()
-对hello功能进行扩展,每次打印hello之前打印当前时间
import time
def printTime(f):
def wrapper(*args,**kwargs):
print('Time',time.ctime())
return f(*args,**kwargs)
return wrapper
-上面定义了装饰器,使用时用到@
@printTime
def hello():
print('Hello world')
hello()
@printTime
def hello2():
print('今天是个好日子')
hello2()
def hello3():
print('手动执行')
hello3()
hello3 = printTime(hello3)
hello3()
####偏函数
-把一个函数某些函数固定,返回一个新函数
#把字符串转化成十进制数字
int('12345')
-八进制的12345,转化为10进制
int('12345',base=8)
-新建一个函数,默认16进制返回10进制
def int16(x,base=16):
return int(x,base)
int16('12345')
import functools
int16 = functools.partial(int,base=16)
int16('12345')