1.函数基础
def p(): # 定义
print("haha")
p() # 调用,输出haha
def max(a,b):
if a>b:
return a
else:
return b
c=max(7,5)
print(c) # 7
2.默认返回值为None
def f():
print("1") # 输出:1
# return None
a=f()
print(a) # 输出:None
print(type(a)) # 输出:<class 'NoneType'>
i=2
def f():
if i==1:
return 1
# else默认返回None
a=f()
print(a) # 输出None
i=2
def f():
if i==1:
return 1
else:
return # 可以只写return,同样返回None
# 不写(连同else)=return=return 0=return None,在判断语句均视为假
a=f() # 若return 0则a=0,其他为None
print(a) # 输出None
函数返回值为0或None在判断语句中表示假,其他表示真
i=2
def f():
if i==1:
return None
else:
return 5
a=f()
if a: # a为5,视为真,可进入if语句
print("1") # 输出:1
i=2
def f():
if i==1:
return 5
else:
return None
a=f() # a为None
if not a: # not a为真,可进入if语句
print("1") # 输出:1
None可用于声明无初始值的变量
a=None
3.通过函数修改全局变量的值
函数通常无法修改全局变量的值,因为在函数中修改此变量时又定义了新的局部变量,具有更高的优先级。但可以使用global声明为全局变量
a=1
def f():
global a #global声明这是全局变量
a=2
f()
print(a) # 输出:2
4.函数的规范化说明文档
在"“”“”"中
首行解释函数功能,其余解释各参数
:param 参数:解释
def max(a,b):
"""
max是求最大值的函数(函数功能说明)
:param a: a表示其中的一个参数(依次解释)
:param b: b表示其中的另一个参数(依次解释)
:return: 返回值为相加得到的结果(依次解释)
"""
if a>b:
return a
else:
return b
c=max(7,5)
print(c) # 7
鼠标停在调用处会显示说明文档
5.函数的嵌套
def a():
print(1)
def b():
print(2)
a()
print(3)
b()
"""
2
1
3
"""
6.形参和实参的内存地址
def f(a):
print(id(a)) # 全局变量a的地址,形参和实参指向的是同一个对象
a=10
print(id(a)) # 新定义的局部变量a的地址,指向新的内存地址
a=1
print(id(a)) # 全局变量a的地址
f(a)
print(a)
"""
2403095937264
2403095937264
2403095937552
1
"""
7.参数换序(关键字参数)
通过 键=值 的形式传递参数
def f(name,age):
print(f"name is {name}, age is {age}")
f("jack",18)
f(age=18,name="jack") # 换序需指定参数
"""
name is jack, age is 18
name is jack, age is 18
"""
未指明键的参数必须按序且必须在前(即位置参数必须在关键字参数前)
*位置参数:根据参数位置来传递参数(按序传入)
def f(name,age,word):
print(f"name is {name}, age is {age},word is {word}")
f("jack",word="hehe",age="18")
"""
name is jack, age is 18,word is hehe
"""
8.默认参数(缺省参数)
默认参数必须在最后,可以不止一个
def f(name,age=18): # 默认age=18,有传入就更新
print(f"name is {name}, age is {age}")
f(age=20,name="jack")
f(name="peter")
"""
name is jack, age is 20
name is peter, age is 18
"""
9.不定长参数(可变参数)
(1)位置传递
通过*以元组(后面讲到)形式导入,存放所有未命名的变量参数
def f(a,*b):
print(a)
print(b)
f(10,20,30,40)
"""
10
(20, 30, 40)
"""
(2)关键字传递
被传入数据当做字典(后面讲到)存在
必须通过 键=值 的形式传递参数
def f(**a):
print(a)
f(name="jack",age=18,id=20)
# 输出: {'name': 'jack', 'age': 18, 'id': 20}
10.函数的多返回值
多返回值类型也可不同
def f1():
return 1
return 2
a=f1()
print(a) #输出1,只接收到第一个return
def f1():
return 1,2
a,b=f1()
print(a,b) #输出1 2
11.函数作为参数传递
def f1(hanshu):
result=hanshu(1,2)
print(result)
def f2(x,y):
return x+y
f1(f2) #输出:3
12.匿名参数
lambda可以创建匿名函数
格式:lambda 参数:函数体(一行代码)
x=lambda a:a+10
# 对参数a,执行a+10操作,x相当于函数名
print(x(5)) # 对x,传入参数5(a=5)
# 输出:15
sum=lambda a,b:a+b
# 对参数a,b,执行a+b操作
c=sum(2,3)
d=sum(4,5)
print(c,d,end=" ") # 5 9
def f1(hanshu):
result=hanshu(1,2)
print(result)
def f2(x,y):
return x+y
f1(f2) #输出:3
#----------------------------
#可以将以上函数改为 ↓
def f1(hanshu):
result=hanshu(1,2)
print(result)
f1(lambda x,y:x+y) #输出:3
# 在此方法中,没有建立f2执行两数相加的函数,因此lambda一般用于临时使用一次的代码
可以将匿名函数封装在一个函数内,这样可以使用同样的代码来创建多个匿名函数
def f(n): #实现n倍的a
return lambda a: a*n
g1=f(2) # n=2, g1相当于通过计算得到的一个关于lambda的函数名g1,等待传入参数
g2=f(3) # n=3
print(g1(4)) # 8
print(g2(5)) # 15