一、函数特性
减少重复
方便修改、易扩展
保持代码一致性
二、函数的参数类型
必须参数
关键字参数
默认参数
不定长参数
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))