1.1 高级用法

目录

1.1 高级用法

1.函数可以被引用(可以赋值)

2.函数可以作为参数传入另外一个函数

3.可以将函数作为返回值

4.函数可以作为容器的元素

2.1 匿名函数(lambda)

3.1 高阶函数

3.1.1 高阶函数简介

3.1.2 map()

 3.1.3 reduce()

3.1.4 filter

3.1.5 sorted

4.1 递归函数

 5.1 练习

6.1 答案解析


1.函数可以被引用(可以赋值)

def fn():
    print('我是fn')

f = fn # 赋值函数
f()

2.函数可以作为参数传入另外一个函数

def fn():
    print('我是fn')

def fn2(x): # x = fn
    x() # fn()

fn2(fn)

3.可以将函数作为返回值

def fn():
    print('我是fn')


def fn2(x):  # x = fn
    return x
a = fn2(fn)
print(a)

4.函数可以作为容器的元素

list1 = [1, 2, 3, fn]
list1[3]() # fn()

2.1 匿名函数(lambda)

匿名函数:没有名字的函数

匿名函数用关键字lambda实现

lambda函数的语法,如下

lambda 参数列表:运算表达式

def fn(x):
    return x * x

f = lambda x: x * x
print(f(5))

总结
1.lambda并不会带来程序运行效率的提高,只会使代码更简洁
2.如果使用lambda,lambda内不要循环,有的话用标准函数完成
3.lambda只是为了减少单行函数的定义而存在

3.1 高阶函数

3.1.1 高阶函数简介

abs():对数字求绝对值计算
绝对值:就是将一个数变正数,0还是0


round():四舍五入 bug =》   奇数满足四舍五入,偶数 四舍大于5入
小数二进制。



def ab_sum(a, b, f):
    return f(a) + f(b)

print(ab_sum(-1, -4.5, lambda x:-x))
print(ab_sum(-1, -4.5, abs))
print(ab_sum(-1, -4.5, round))


python所提供的的内置高阶函数
map filter reduce sorted

3.1.2 map()

语法

map(func,seq):将传入的函数变量func作用到序列变量seq的每个元素中,并将结果组成新的迭代器返回
    
高阶内置函数 func的参数都是有固定含义

# 将列表中的各个数字+1
list1 = [-1, 2, -3, 4, -5]
# map 可以直接操作序列中的每个元素

print(list(map(lambda x:x+1, list1))) # 222

总结:
	1.map内置函数的作用是操作序列中的所有元素,并返回一个迭代器,迭代器要转列表
    2.lambda表达式可以专门配合高阶内置函数来简洁实现

 3.1.3 reduce()

语法

reduce(func,seq) :聚合
func 必须要有2个参数

注意:reduce() 传入的参数func必须有2个参数

reduce是将每次函数的结果继续和序列的下一个元素做累计计算(类似于累加法)

func(x,y)

reduce是需要导包,不是内置函数

from functools import reduce // 导入一个功能

def func(x, y):
    return x + y

a = reduce(func, list1)
print(a)
a = reduce(lambda x,y:x+y, list1)
print(a)

总结:

1.reduce就是平时遇见累积的都可以用

2.reduce返回一个值

3.reduce需要导入才能使用 from functools import reduce

3.1.4 filter

语法

filter(func,seq) : 用于过滤序列,过滤掉不符合条件的元素。结果要通过list转换---------(过滤)
    
def func(x): # x就代表每个元素,和map一样
    return 布尔值 # 如果布尔值为真,则保留,否则过滤
# 保留一个序列中所有的偶数

# 除了0和 空字符串 都为
# 常见的转换为False :  0,"",[],(),{},set(),None
# def o2x(x): # 最终版
#     return x % 2 == 0


print(list(filter(lambda x:x%2==0, list1)))
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]


def scy(x):
    if x % 2 == 0:
        return x


print(list(filter(scy,list1)))

3.1.5 sorted

返回一共排序后的序列。

sorted 默认的排序规则函数,参数key : key就是函数

list2 = ["小明:69", "大明:79", "小美:59", "小芳:89", '小娟:100', "马可波罗:99"]


def f(x):  # x 代表每个值,和map,filter是一样的
    # return : 返回排序要比较的值
    arr = x.split(":")  # ["木槿",'69']
    # arr[0] 名字
    # arr[1] 分数    字符串
    return int(arr[1])


print(sorted(list2, key=f))  # 编码
print(sorted(list2,key=f,reverse=True))
print(sorted(list2,key=lambda x: int(x.split(":")[1]),reverse=True))
list2 = ["小明:69", "大明:79", "小美:59", "小芳:89", '小娟:100', "马可波罗:99"]


def scy1(x):
 yyds = x.split(":")
 return int(yyds[1])


print(sorted(list2,key=scy1))

4.1 递归函数

递归:函数的内部调用了自己这个就叫递归

def func():
    print('你好,我是天天')
    func() # 函数的代码执行完就结束


func()
# 函数的作用域生命周期:调用时产生,调用结束时销毁

递归的原则

1.如果要定义递归函数,不想让它报错的话,必须要有出口


2.设计一个出口,不断的向出口接近


> 接近出口(参数变化)一般是写在递归调

# 1*2*3*4*......*9
# 阶乘
def f(n):  # n 是 1*2*3* .。。。9 # 1*......100
    if n == 1:
        return 1  # 返回1
    return n * f(n - 1)  # 变化都在递归调用里面写 jc(8)  jc(7) jc(6) jc(5) .... jc(2) jc(1)


print(f(10))  # f(10)  <=> 10*9 * 8*7*6*5*4*3*2*1

 5.1 练习

# 1 . 对于序列 [-1,3,-5,-4] 的每个元素求绝对值

# 2 . 用map来处理字符串列表啊,把列表中所有人都变成sb,比方lucy_sb
name=['lucy','lilei','hanmeimei']

# 3 . 将一串数字‘1 3 5 7 8’转化为整型,并以列表形式输出

# 4.  用【递归】实现阶乘,定义一共函数有一个参数n
# 	  返回值是 1*2*3*....*n


# 5 . 
要求用递归实现
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……(从第3位开始,每一位数字都是前两位数字之和)
在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用。
要求输入N,输出第N位数字。如:
输入:8
输出:21

6.1 答案解析

# 1 . 对于序列 [-1,3,-5,-4] 的每个元素求绝对值
list1=[-1,3,-5,-4]
print(list(map(abs,list1)))
# 2 . 用map来处理字符串列表啊,把列表中所有人都变成sb,比方lucy_sb
'第一种方法'
name=['lucy','lilei','hanmeimei']
def scy1(x):
    c=x+'_sb'
    return c
print(list(map(scy1,name)))
'第二种方法'
def scy2(y):
    return y+'_sb'
print(list(map(scy2,name)))
'第三种方法'
print(list(map(lambda x:x+'_sb',name)))
# 3 . 将一串数字‘1 3 5 7 8’转化为整型,并以列表形式输出
l1='1 3 5 7 8'
'第一种方法'
def scy3(m):
    return int(m)
print(list(map(scy3,l1.split(' '))))
'第二种方法'
print(list(map(lambda g:int(g),l1.split(' '))))
# 4.  用【递归】实现阶乘,定义一共函数有一个参数n
# 	  返回值是 1*2*3*....*n
def scy1(n):
    if n==1:
        return 1
    else:
        return n*scy1(n-1)

numbers=int(input("请输入一个正整数: "))
res=scy1(numbers)
print("%d的阶乘是: %d"%(numbers,res))

# 5
# 要求用递归实现
# 斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,
# 指的是这样一个数列:1、1、2、3、5、8、13、21、34、……
# (从第3位开始,每一位数字都是前两位数字之和)
# 在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用。
# 要求输入N,输出第N位数字。如:
# 输入:8
# 输出:21
def yyds(n):
    if n == 1 or n == 2:
        return 1
    else:
        return yyds(n - 1) + yyds(n - 2)


n = int(input("请输入数列的项数为: "))
print(yyds(n))