day12.txt
函数式编程
    函数式编程是用一系列函数解决问题

函数是一等公民
说明:
    用每一个函数完成细小的功能,一系列函数的任何组成可解决大问题
    函数仅接受输入并尝试输出,不包括任何可能影响输出的内部状态

函数的可重入性
    当一个函数没有访问除局部变量以外的变量,则此函数为可重入函数
示例:
    #可重入 函数
    def myadd1(x,y)
        return x+y
    #不可重入函数
    s=0
    def myadd2(x,y):
        global s
        s+=x+y
        return s
高阶函数 High Order Function
    什么是高阶函数
        满足下列调节中一个的函数即为高阶函数
            函数接受一个或多个函数作为参数传入
            函数返回一个函数
python 内建函数的高阶函数
    map ,filter,sorted
map 函数:
    map (func,*iterables) 返回可迭代对象,此可迭代对象用func对可迭代对象iterable中的每个元素作为
    参数计算后得到结果,再返回,当最短的一个可迭代对象不再提供数据时迭代结束
def power2(x):
    return x**2
#生成一个可迭代对岸死昂,此可迭代对象可以生成1~9的自然是的平方
for x in map(power2,range(1,10)):
    print(x)

#生成一个可迭代对象,此可迭代对象可以生成
# 1××4, 2**3, 3**2 ,
for  x in map(pow,range(1,5),range(4,0,-1),range(5,100)):
    print(x)
练习:
    求:1**2+2**2+3**2+...9**2的和
    求:1**3+2**3+3**3+...9**3的和
    求:1**9+2**8+...9**1的和
# def pow1(x):
#     return x**2
# s=0
# for x in map(pow1,range(1,10)):
#     s=s+x  
# print(i)
print(sum(map(pow2(x),range(1,10))))
print(sum(map(lambda x:x**3,range(1,10))))
print(sum(map(lambda x,y:x**y,range(1,10),range(9,0,-1)))) 
             <=>等价于 pow,

filter函数
    filter(func,iterable)返回一个可迭代对象,此可迭代对象将对iterable获取的数据用函数func进行筛选
    :func将iterable中的每个元素进行求值,返回false 则丢弃,返回true 则保留此数据
    示例:
def isodd(x):
    return x%2 ==1
#判断x是否是奇数,如果是奇数返回true,否则
#生成1~100的奇数
for x in filter(isodd,range(100)):
    print(x) 
#生成1~100以内的偶数放到列表内
even=[x for x in filter((lambda x:x%2),range(1,100))]
print(even)
练习:
1,把1~100之间的全部素数放在列表primes中
def isprime(x)
    if x<2:
     return False
    for i in range(2,x):
        if x%2==0:
            return False
        else:
            return True
prime=[x for x in filter(isprime,range(100))]
print(prime)

sorted函数
    作用:
    将原可迭代对象的数据进行排序,生成排序后的列表
    格式:
        sorted(iterable,key=None,reverse=False)
    说明:
        iterable 是可迭代对象
        key函数是用来提供比较值的函数,这个值将作用排序的依据
        reverse标志用来设置是否降序排列
此示例示意sorted函数的用法
l=[5,-2,-4,0,3,1]
l2=sorted(l)#[-4,-2,0,1,3,5]
print('l2=',l2)
l3=sorted(l,reverse=True)
print('l3=',l3)#[5,3,1,0,-2,-4]
l4=sorted(l,key=abs)    #[0,1,-2,3,-4,5]
练习
name=['Tom','Jerry','Spike','Tyke']
排序的依据是’moT 'yerrJ','ekipS' 'ekyT'
结果是:
name=['Tom','Jerry','Spike','Tyke']
def x(a):
    r=a[::-1]
    print('222222',r)
    return r
l=sorted(name,key=x)
print(l)

递归函数 recursion
示例:
    #函数直接调用子句
    def f1():
        f1()
递归说明:
    递归一定要空值递归的层数,当复合一定条件时要终止递归调用
    几乎所有的递归都能用while循环来代替
优缺点:
    优点是可以把问题简单化,让思路更为清晰,代码更简洁
    缺点是因系统环境影响大,当递归深度太大时,可能会得到不可预知的结果  #当递归次数多时,会崩溃
递归函数调用分为两个阶段:
    1,递推阶段
        从原问题除非,按递归公式递推从未知到已知,组中到达递归终止条件
    2.回归阶段
        按递归终止条件求出结果,逆向逐步代入递归公式,回归原问题求解
示例:
#此示例示意递归调用和根据条件结束递归
def fx(n):
    print("递归进入第",n,"层")
    if n==3:
        return
    print("递归退出第",n,"层")
fx(1)
print('程序结束')

def myfac(n):
    #如果
    if n==1:
        return 1
    return n*myfac(n-1)

print(myfac(50))

练习:用递归方式算1+2+3+4...n的和
def mysum(n):
    if n==1:
        return 1
    return n+mysum(n-1)
print(my(100))
思考题:
已知有5位朋友在一起
    第五位朋友说他比第四位朋友大两岁
第四位朋友说他比第三位朋友大两岁
第三位朋友说他比第二位朋友大两岁
第二位朋友说他比第一位朋友大两岁
第一位朋友说他10岁
def getage(n):  #求第n个人的 年级
    if n==1:
        return 10
    return getage(n-1)+2
print(getage(5))

闭包 closure
  什么是闭包


    闭包是指引用了此函数外部变量的函数
    如果一个内嵌函数访问了外部嵌套函数的变量,则这个内嵌函数就是闭包

  闭包必须满足三个条件:
    1. 必须有一个内嵌函数
    2. 内嵌函数必须引用外部函数中的变量
    3. 外部函数返回值必须是内嵌函数
示例:
    def make power(x)
Y用闭包创建的任意的
#   f(x)=a*x**2+b*x+c
def get_fx(a,b,c):
    def fx(x):
        return a*x**2+b*x+c
    return fx
f123=get_fx(1,2,3)
print(f123(20))
print(f123(50))

练习;
    1,编写程序求1~20的阶乘的和
    1!+...10!
def
  2. 改写之前的学生信息的程序,要求添加四个功能:
      | 5)  按学生成绩高-低显示学生信息 |
      | 6)  按学生成绩低-高显示学生信息 |
      | 7)  按学生年龄高-低显示学生信息 |
      | 8)  按学生年龄低-高显示学生信息 |
 3. 已知有列表:
        L = [[3, 5, 8], 10, [[13, 14], 15, 18], 20]
    1) 写一个函数 print_list(lst) 打印出所有的数字
        print_list(L)  # 3 5 8 10 13 ....
    2) 写一个函数 sum_list(lst) 返回列表中所有数字的和
        print(sum_list(L))  # 106
    注:
       type(x) 函数可以返一个对象的类型
       如:
          >>> type(20) is int  # True
          >>> type([3, 5, 8]) is list  # True
          >>> type(20) is list  # False
def print_list(list):
    for x in lsit:
        #当x是数字时,打印这个数字,
        if type(x) is int:
            print(x)
        #当x是列表,则打印列表
        else:
            print_list(x)
print_list(l)
def sum_list(list):
    s=0
    for x in list:
        if type(x) is list:
            s+=x
        else:
            s+=sum_list(x)
print(sum_list(l))