1 函数
特点:
- 方便使用,能重复使用
- 返回值后面的代码不会执行
- 不能调用外面的变量
# 要求:定义一个函数,函数功能是判断输入内容是否手机号(长度为11,都是数字)
def isPhone(phone):
if phone.isdigit() and len(phone)==11:
print('这是一个正确的手机号')
else:
print('这不是一个手机号')
>>> isPhone('11234567891')
这是一个正确的手机号
>>> isPhone('123')
这不是一个手机号
# 概念: 请看下面的代码,说说return在函数体的特征
def func(x,y):
print(x)
print(y)
return x+y
print(111) # return 后面的代码不会执行
res = func(1,2)
print(res)
# 结果:
# 1 -> print(x)
# 2 -> print(y)
# 3 -> res -> return x+y
# 答案:函数体返回的结果;唯一能从函数体出来的值;从函数体出来后需要由一个容器来容纳
查看函数体的返回值
def func(x,y=2,*args,**kwargs) -> str:
print(x)
print(y)
print(args)
print(kwargs)
return 'abc'
help(func)
# 结果:
Help on function func in module __main__:
func(x, y=2, *args, **kwargs) -> str
函数中的参数
优先级 | 类型 | 实例 | 备注 |
---|---|---|---|
1 | 必备参数 | def(x) | 必须传 |
2 | 默认参数 | def(y=2) | |
3 | 不定长参数 | ①*args(元组)②**kwargs(集合、字典) | ②需要赋值才能 |
def func(x,y=2,*args,**kwargs):
print(x) # 必备参数
print(y) # 默认参数
print(args) # 不定长参数
print(kwargs) #
>>> func(1,3,(1,2,3),[1,2,3],{'a':1,'b':1},a=1)
1 # x
3 # y=2
((1, 2, 3), [1, 2, 3], {'a': 1, 'b': 1}) # *args
{'a': 1} # **kwargs
全局变量和局部变量
在python,小范围不能打败大范围的
# 什么是全局变量? 什么是局部变量 ? 它们之前有什么关系?
x = 100 # 全局变量
def func():
# 在函数里面对外部定义的x进行#修改
y = 200 # 局部变量
x = x+1
prin
t(x)
>>> func()
Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
func()
File "C:\Users\William\Desktop\空文件 - 副本.py", line 5, in func
x = x+1
UnboundLocalError: local variable 'x' referenced before assignment
>>> x
100
# 答案:全局变量:范围是全py文件;局部变量:只限于函数体里流动;两者都存在在同一个.py 文件里
如何将全局变量的值给局部变量使用?
# global —— 在局部变量前声明
x = 100
def func():
global x # 声明全局变量
x = 200
print(x)
print(x) # 100
func() # 200
print(x) # 200
在嵌套函数体的非第一层,如何声明变量不是局部的?
# 答案:nonlocal
def func1():
x = 100
def func2():
nonlocal x # 声明局部变量
x = x+1
print(x)
return func2()
>>> func1()
101
闭包
定义:外层函数的RETURN返回外层函数的内层函数
闭包
def func():
lv = 5
# 增加血量
def func1():
nonlocal lv
lv += 1
print(lv)
# 减少血量
def func2():
nonlocal lv
lv -= 1
print(lv)
# 外层函数返回内层函数的函数体,这就是闭包
return func1,func2
func()
func()()
jia,jian = func()
jia()
>>>6
jian()
>>>5
def func():
lv = 5
# 增加血量
def func1():
nonlocal lv
lv += 1
print(lv)
# 减少血量
def func2():
nonlocal lv
lv -= 1
print(lv)
return func1(),func2()
>>> func()>>> func1()
101
def func():
lv = 5
# 增加血量
def func1():
nonlocal lv
lv += 1
print(lv)
# 减少血量
def func2():
nonlocal lv
lv -= 1
print(lv)
return func1,func2
# 以下打印结果为元组
>>> func()
(<function func.<locals>.func1 at 0x00000259461FC1E0>, <function func.<locals>.func2 at 0x0000025946BBDE18>)
# 元组方法将其分开
>>> jia, jian = func()
>>> jia
<function func.<locals>.func1 at 0x0000022F95CDC1E0>
>>> jia()
6
>>> jian()
5
2 递归函数
通过自身调用自身,实现循环
def func(n):
if n==1:
return 1
else:
return func(n-1)*n
func(n-1)*n
# func 的循环过程
func(5)
->【func(4)*5】
->【func(3)*4】*5
->【func(2)*3*4】*5
->【func(1)*2*3*4】*5
->【1*2*3*4】*5=120
3 匿名函数
以下的函数结果是一样的,只是运行结果不同
a = lambda x:x+1 # 会自动返回,x是参数
def a(x):
return x+1
什么时候用到匿名函数(lambda)。请对比一下表格:
li = [2,4,6,8,10]
def func(x):
if x>5:
return x
print(list(filter(func,li)))
print(list(filter(lambda x:x>5,li)))
4 其他函数
功能 | 函数 |
---|---|
过滤 | filter(函数体,可迭代对象) |
统一操作 | map(函数体,可迭代对象) |
合成字典,数据配对 | zip(可变对象,可变对象) |
li = [2,4,6,8,10]
print(list(filter(lambda x:x>5,li)))
print(list(map(lambda x:x-1,li)))
tu = ('a','b','c')
li = [2,4,6]
print(dict(zip(tu,li)))
print(list(zip(tu,li)))
科普
回调函数
定义:把一个函数体当作另一个函数体的参数
def func1(f):
f() # f = func2 -> f() = func2()
print(111)
def func2():
print(222)
func1(func2)
Bonus
1 空集合如何表示?
set1 = set()2 help(函数()) 查看返回类型
下载:练习题
https://www.jianguoyun.com/p/DZPZFOMQnei5CBjE3ewD