一、语法
def 函数名称(参数1, 参数2, ...):
<代码块>
return <表达式>
二、传递参数
2.1.传递一组参数,保存到元组里,对参数个数未知
def func1(*args):
print(type(args))
print(args)
func1(1, 2, 3)
2.2.传递一组参数,保存到字典里,对参数个数未知
def func1(**kwargs):
print(type(kwargs))
print(kwargs)
func1(name = 'aqx', like = 'python')
三、递归函数,求阶乘
def calc(n):
if n == 1:
return n
return n * calc(n - 1)
print(calc(5))
四、lambda匿名函数(不需要指定函数名称)
>>> myadd = lambda x, y: x + y
>>> myadd(10, 20)
30
t = lambda x: '偶数' if x % 2 == 0 else '奇数'
print(t(9))
五、作用域
查找顺序从局部变量到内置
• Local(局部作用域):在函数中定义的变量。
• Enclosed(嵌套作用域):一般出现在函数中嵌套一个函数时,在外部函数中的作用域称为嵌套作用域(闭包常见)。
• Global(全局作用域):文件顶层定义的变量。
• Built-in(内置作用域):系统内解释器定义的变量,例如关键字。
global a = 3 #定义全局变量,在函数里用
六、闭包
可以简单粗暴地理解为闭包就是一个定义在函数内部的函数,闭包使得变量即使脱离了该函数的作用域范围也依然能被访问到。
6.1.满足闭包的三个条件
• 两层以上嵌套关系
• 内部函数调用外部函数定义的变量
• 外部函数返回内部函数体对象,而不是函数体结果(加括号)
6.2.示例
def outer():
x = 1
def inner():
print(x)
return inner # 不加括号,表示返回函数体
sf = outer()
sf() # 调用,等同于outer()()
七、函数装饰器
作用:装饰器本质上是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。装饰器里面封装公共的部分,类似于Docker镜像。
应用场景:记录日志、性能测试、权限效验等
7.1.示例一,无参数
# 定义一个装饰器
def decorator(func):
def f():
print('开始......')
func()
print('结束......')
return f
# 使用语法糖“@”调用装饰器
@decorator
def hello():
print('正在检测......')
hello()
7.2.示例二,有参数
调用过程:执行hello(1,2,3)→装饰器decorator→f(*args)→func(*args)→hello(*args)
# 定义一个装饰器
def decorator(func):
def f(*args):
print('开始......')
func(*args)
print('结束......')
return f
# 使用语法糖“@”调用装饰器
@decorator
def hello(*args):
print(args)
print('正在检测......')
hello(1,2,3)
八、内建函数
8.1.高阶函数
高阶函数至少满足以下任意的一个条件:
• 能接收一个或多个函数作为输入
• 输出一个函数
8.1.1.map()
根据提供的函数处理序列中的元素,处理完后返回一个迭代器对象。
语法:map(function, iterable, …)
示例:
def f(n):
return n * 2
alist = range(1, 11)
result = map(f, alist) # 得到的是一个对象
print(list(result))
或者使用匿名函数:
result = map(lambda n:n * 2, alist)
print(list(result))
8.1.2.filter()
用于过滤序列,过滤掉不符合条件的元素,处理完后返回一个迭代器对象。
语法:filter(function, iterable)
示例:
num = range(1,11)
def handle(n):
if n % 2 == 0:
return n
result = filter(handle, num)
print(list(result))
或者使用匿名函数:
result = filter(lambda n:n % 2 == 0, num)
print(list(result))
8.2.排序函数sorted()
sorted()函数:对所有可迭代的对象进行排序操作。
语法:sorted(iterable, *, key=None, reverse=False)
• key:指定带有单个参数的函数,用于从interable的每个元素取出比较的键,默认为None(直接比较元素)
• reverse 排序规则,True降序, False升序(默认)
示例1:对列表排序
n = [5, 3, 10, 2]
s = ['s', 'd', 'a', 'y']
print(sorted(n))
print(sorted(s))
示例2:对字典中的值排序
会把dict.items()的元素依次传递给匿名函数
dict = {'a':86, 'b':23, 'c':45}
result = sorted(dict.items(), key=lambda x:x[1])
print(result)
8.3.反转函数reversed()
reversed()函数:返回一个反转的迭代器。
语法:reversed(seq)
示例:列表反向
n = [1, 2, 3]
print(list(reversed(n)))
8.4.多迭代对象聚合
zip()函数:对多个可迭代对象创建一个聚合,返回一个元组的迭代器。
应用场景:同时遍历两个列表
x = ['a', 'b', 'c']
y = [1, 2, 3]
print(list(zip(x, y)))
for x, y in zip(x, y):
print(x, y)
8.5.获取当前所有变量
• globals():字典格式返回当前范围的全局变量
• locals():字典格式返回当前范围的局部变量
a = 1
def f():
b = 2
print("局部变量: %s" % locals())
print("全局变量: %s" %globals())
f()
九、偏函数
偏函数是指通过fuctools.partial进行改造现有函数,生成新函数
>>> int('1010', base=2) # 通过base=2说明1010是2进制数
10 # 输出为10进制数
# 改造int函数,把base=2固定下来,生成名为int2的新函数
>>> from functools import partial
>>> int2 = partial(int, base=2)
>>> int2('1010')
10
# 改造函数,将参数固定下来
>>> def add(a, b, c, d, e):
... return a + b + c + d + e
...
>>> add(10, 20, 30, 40, 1) # 每次调用函数,前4项的值都是一样的
101
>>> myadd = partial(add, 10, 20, 30, 40) # 改造add函数,固定前4个参数值
>>> myadd(1)
101
十、生成器
# 与列表解析语法一样,只是把[]换成()
>>> ips = ('192.168.1.%s' % i for i in range(1, 255))
>>> for ip in ips:
... print(ip)
与普通的函数有所区别。一般来说,函数通过return返回一个值;生成器函数可以通过yield关键字返回很多中间结果。