python之函数、生成器、迭代器、装饰器

一、函数特性

减少重复

方便修改、易扩展

保持代码一致性

二、函数的参数类型

必须参数

关键字参数

默认参数

不定长参数

def print_info (name,age,sex='man'):
    print("Name: %s" % name)
    print("Age: %d" % age)
    print("Sex: %s" % sex)

1、必须参数

print_info('changwei', 18)

2、关键字参数

print_info(age = 18,name = 'changwei')

3、默认参数

在函数参数不传入值时,使用的默认值

注意:sex='man',默认参数必须放在必须参数后面,在不定长参数前面

4、不定长参数

def add (*args):                                   
    sum = 0
    for i in args:
        sum +=i
    print(sum)
add(2,3,5,67,2)

args会以元组的形式在函数内部体现出来

def delete (**kwargs):                         
    print(kwargs)
delete(Name='ss',Job='IT')

kwargs会以字典的形式在函数内部体现出来

三、函数的作用域

函数的作用域通俗点说就是函数中变量的生效范围,或引用规则

L(local),局部作用域

E(enclosing),内嵌作用域

G(global),全局作用域

B(built-in),python内置作用域

优先级:

L>E>G>B

特殊用法:

出现以下两种情况需要提前声明作用域

a = 1
def args():
    global a
    print(a)
    a = 2
def args2():
    b = 2
    def args3():
        nonlocal b
        print(b)
        b = 5

四、常用内置函数

filter()
map()
from functools import reduce
reduce()

五、高级用法

1、装饰器

我有一些功能函数类似Time_List,其功能如下:

def Time_List(List):
    for i in List:
        print(i)
        time.sleep(1)

现在有个需求,需要在每次运行完这类函数之后打印出函数运行所消耗的时间

def Show_Time(args,List):
    Start_Time = time.time()
    args(List)
    End_Time = time.time()
    Run_time = End_Time - Start_Time
    print('The function run time is %d' %Run_time)

这样我们新函数Show_Time虽然实现了需求,但是又有个新问题,如果之前我们有100多个模块都引用了之前的Time_List函数,那现在我就需要改100多个模块,这显然不是很科学,所以我们要想办法让函数名不变,并且不是直接修改原来的函数

def Show_Time_v2(args):
    def Show_Time(List):
        Start_Time = time.time()
        args(List)
        End_Time = time.time()
        Run_time = End_Time - Start_Time
        print('The function run time is %d' %Run_time)
    return Show_Time
Time_List=Show_Time_v2(Time_List)

结论:那么这里的Show_Time_v2就被成为装饰器

除用Time_List=Show_Time_v2(Time_List)的方法还有另外一种方法

def Show_Time_v2(args):
    def Show_Time(List):
        Start_Time = time.time()
        args(List)
        End_Time = time.time()
        Run_time = End_Time - Start_Time
        print('The function run time is %d' %Run_time)
    return Show_Time

@Show_Time_v2
def Time_List(List):
    for i in List:
        print(i)
        time.sleep(1)

此时的@Show_Time_v2和Time_List=Show_Time_v2(Time_List)是一样的效果

思考:如果此时我们在需要给装饰器传入一个参数该怎么实现呢?

def Show_Time_v3(args3):
    def Show_Time_v2(args):
        def Show_Time(List):
            Start_Time = time.time()
            args(List)
            End_Time = time.time()
            Run_time = End_Time - Start_Time
            print('The function run time is %d' %Run_time)
        return Show_Time
    return Show_Time_v2

@Show_Time_v3('给你参数')
def Time_List(List):
    for i in List:
        print(i)
        time.sleep(1)

那么此时Show_Time_v3('给你参数')的返回值即Show_Time_v2,所以@Show_Time_v3('给你参数')和@Show_Time_v2是一样的效果。

2、列表生成器

List = [i for i in range(10)]
print(List)
List2 = [i*2 for i in range(10)]
print(List2)
def f(n):
    return n*2
List3 =[f(i) for i in range(10) ]
print(List3)

3、生成器

第一种生成生成器方式

s = (i*2 for i in range(10))
print(next(s))
print(next(s))
print(next(s))
第二种生成生成器方式
def foo():
    print('ok')
    yield 1
    print('on')
    yield 2
g = foo()
print(next(g))
print(next(g))

给yield前面的变量传入值

def foo2():
    print('OK')
    args = yield 111111111111111111111111111111
    print(args)
    aa = yield 22222222222222222222222222
g2 = foo2()
print(g2.send(None))
print(g2.send('1111'))

注意:第一次调用生成器对象时send必须传入为空值

4、迭代器

生成器都是迭代器,迭代器不一定是生成器

迭代器:既有iter方法,也有next方法

a = [1,2,3,4]
print(type(a))
b = iter(a)
print(type(b))
print(next(b))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值