1.匿名函数 ---- lambda ------ 针对简单函数 lambda 参数:代码表达式逻辑
# filter:过滤器
def func(x):
return x>5
list1 = [i for i in range(1,10)]
demo = filter(func,list1)
print(demo)#<filter object at 0x0000022E2382B4C8> 生成过滤器对象
demo1 = list(demo)
print(demo1)#[6, 7, 8, 9]
demo2 = list(filter(lambda x : x>5,list1))
print(demo2)#[6, 7, 8, 9]
2.函数作用域 --------------- a.函数外部不能直接访问函数内部的变量 --------------- b.函数内部能够访问函数外部的变量 --------------- c.函数内部不能修改函数外部变量,可变类型特殊 --------------- d.函数内部和函数外部,变量名相同, 但是id不同
def func():
a = 'songsang'
# print(a)#NameError: name 'a' is not defined a是函数内部的变量,在外面不能调用,会报错
# func()#没有返回值也会报错,如果要运用函数内部的变量,函数内部要用return返回,函数外部要用变量接收
b = 'yesyes'
def func1():
print(b)
func1()#yesyes 一般通过参数传入在函数内部调用
d = 2
e = [1,2,3]
def func2():
d = 1
e.append(4)
func2()
print(d)#2
print(e)#[1, 2, 3, 4] 可变类型改变的是原数据
f = '123'
print(id(f))#2129962547952
def func3():
f = '345'
print(id(f))
func3()#2129962757616
3.全局变量与局部变量 针对函数作用域 ------- 全局变量 --- global ------- 局部变量 --- nonlocal -- 嵌套函数
x = 123
def func():
global x#声明全局变量就可以直接改变它而不用一个新的变量接收改变后的值
x = x+1
print(x)
func()#124
print(x)#124
# a = 1
# def func2():
# nonlocal a
# a = 2
# func2()
# print(a)#SyntaxError: no binding for nonlocal 'a' found
# #局部变量使用在嵌套函数中
def func1():
b = 1
print('这是func1函数')
def func3():
print('这是func3函数')
b = 2
print(b)
func3()
print(b)
func1()
# 这是func1函数
# 这是func3函数
# 2
# 1
def func1():
b = 1
print('这是func1函数')
def func3():
nonlocal b
print('这是func3函数')
b = 2
print(b)
func3()
print(b)
func1()
# 这是func1函数
# 这是func3函数
# 2
# 2
------ 函数的特殊调用手段(方式)------- 6.闭包: 函数外部调用函数内部的函数
#-------内嵌函数---------
def demo1():
print('demo函数')
def demo2(): #内嵌函数只能在里面调用
print('demo2函数')
demo2()
demo1()
# demo函数
# demo2函数
print('-----'*25)
def demo1():
print('demo函数')
def demo2():
print('demo2函数')
return demo2
a = demo1()
print(a)
# demo函数
# <function demo1.<locals>.demo2 at 0x0000028C04C56B88> 将函数返回出来
a()#demo2函数 调用函数
print('-----'*25)
def demo1():
print('demo函数')
def demo2():
print('demo2函数')
def demo3():
print('demo3函数')
def demo4():
print('demo4函数')
return demo2,demo3,demo4
a = demo1()
print(a)
#(<function demo1.<locals>.demo2 at 0x00000221C787E438>,
# <function demo1.<locals>.demo3 at 0x00000221C7A97678>,
# <function demo1.<locals>.demo4 at 0x00000221C7A97708>)
#返回一个列表
a[1]()
#demo3函数
print('-----'*25)
def demo1():
print('demo函数')
def demo2():
print('demo2函数')
def demo3():
print('demo3函数')
def demo4():
print('demo4函数')
return demo2,demo3,demo4
f1,f2,f3 = demo1()
f1()
f2()
f3()
# demo函数
# demo2函数
# demo3函数
# demo4函数
def demo():
print('demo函数')
def func1():
print('func1函数')
def func2():
print('func2函数')
def func3():
print('func3函数')
return func1, func2, func3
f1, *f = demo()
print('*'*100)
f1()
print(f)#f并不是函数,剩余的都放在了f中
#func1函数
#[<function demo.<locals>.func2 at 0x000001D68779A168>,
# <function demo.<locals>.func3 at 0x000001D6877CFEE8>]
7.递归函数:自己调用自己
def func1(n):
if n == 1: #一定要设置一个结束条件
return 1
return n*func1(n-1)
a = func1(5)
print(a)#120
8.回调函数:在一个函数中调用另外一个函数
def func1(n):
if n == 1:
print('song')
else:
print('yes')
def func2(j):
print('func2函数')
j(1)
func2(func1)
# func2函数
# song