python第6课(函数,内置高阶函数,匿名函数,装饰器)笔记

文章目录

  • 一,函数(下)
    • 1.1变量的作用域
    • 1.2函数变量
    • 1.3偏函数
  • 二,python中内置的高阶函数
    • 2.1 map函数
    • 2.2 reduce函数
    • 2.3 filter函数
    • 2.4sorted函数
  • 三, 匿名函数
  • 四,装饰器
    • 4.1 闭包
    • 4.2 装饰器

一,函数(下)

1.1变量的作用域

变量名的查找规则;
在访问变量时,先查找本地变量,然后是包裹此函数的外部函数的内部变量,之后是全局变量,最后是内置变量
1 在函数内使用全局变量

v = 100
def function():
    global v    #声明全局变量v
    v = 200     #改变全局变量v
    print(v)
function()
print(v)

执行结果
200
200

2使用nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量

v = 100
def function():    
    v = 200     
    def inner():
        nonlocal v #指定v为外层嵌套的作用域
        print(v)
    inner()
function()
print(v)

执行结果
200
100

1.2函数变量

函数名是变量,它在创建函数时绑定一个函数对象

def fn():
    print(1)
f1 = fn
f1()
print(type(f1))

执行结果
1
<class 'function'>

1.3偏函数

函数有很多参数时,如果固定一些参数,可以利用functools模块Partial得到一个偏函数,方便以后的使用。

print(int('123'))
print(int('11001',base=2)) #2进制转换成整形

执行结果
123
25

可以设置偏函数

import functools
int2 = functools.partial(int,base=2)
print(int2('10110'))

执行结果
22

二,python中内置的高阶函数

python中内置的高阶函数map,reduce,filter,sorted可以用来结构的封装

2.1 map函数

map(func,*iterable)把迭代器内的n个元素都进行func运算

def power2(x):
    return x**2
mit = map(power2,range(1,5))
print(type(mit))
for i in mit:
    print(i)

执行结果
<class 'map'>
1
4
9
16

2.2 reduce函数

reduce()函数会对参数序列中的元素进行函数运算后累积

from functools import reduce  

def fun1(x,y):
    return x*y
a = reduce(fun1, range(1,5))
print(a)

执行结果
241*2*3*4

2.3 filter函数

筛选可迭代对象中的数据,返回一个课迭代对象

import functools

def fun1(x):
    return x%2 == 1
a = filter(fun1, range(1,5))
for i in a:
    print(i)

执行结果
1
3

2.4sorted函数

newlist = sorted(listname,key=None,reverse=False)
listname为目标列表,key表示指定一个从每个列表元素中提取一个比较的键,reverse为可选参数,当指定为True时为降序,如果为Flase则为升序。默认为升序。

my_list = [2,1,3,5,4,6,8,9,7,10]
my_list.sort()#这种格式是直接在列表后使用sort()函数
b = sorted(my_list)#这种方式是定义一个新列表来存放排序过的序列
print(b)
print(my_list)

执行结果
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

三, 匿名函数

lambda [参数1,参数2.。] : 表达式
作用:创建一个无名函数对象,通def类似,但不提供函数名
用途:在有些场合下不需要取名字,只要在这个地方用一下

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

可以改写成:

myadd = lambda x,y : x+y
print("20+30=",myadd(20,30))

执行结果
20+30= 50

四,装饰器

4.1 闭包

说明:如果一个内嵌函数访问函数外部作用域的变量,则这个函数就是闭包
例:

def make_power(x):
    def fn(arg):
        return arg ** x
    return fn
f2 = make_power(2)
print(f2(10))
f3 = make_power(3)
print(f3(10))

执行结果
100
1000

4.2 装饰器

目的:在不改变函数名的情况下,改变了包装函数(对象)的行为

def 装饰器函数名 (参数):
	函数块
	return 函数

例:

def msg_service(fn):
    def servemoney2(name,x):
        print("欢迎存钱")
        fn(name,x)
        print("存钱结束")
    return servemoney2
    
@msg_service
def servemoney(name,x):
    print(name,'存了',x,'元')
servemoney("小张",100)

#@msg_service的作用相当于servemoney = msg_service(servemoney)

执行结果
欢迎存钱
小张 存了 100 元
存钱结束

你可能感兴趣的:(python学习,python,笔记)