一、函数解析
1、变量的作用域(全局变量和局部变量)
a = 100 #原值为100
def AA():
global a #声明修改全局变量
print(a) #输出全局变量
a = 300 #改变全局变量的值
AA() #调用函数
print(a) #输出改变后的值
超出作用范围:
def AA(XZ):
XZ += 1 #此处的XZ为局部变量
print(XZ) #无法输出局部变量,超出作用范围。
2、参数传递
可变对象:
b = [1,2] #可变列表
d = b #赋值给d
def AA(d):
d.append("XX") #修改值,在后面追加"XX"
AA(d) #将d带入实参
print(b) #输出原有的b
print(id(b),id(d)) #输出俩变量的id
print(b is d) #检测b和d是否是一样
不可变对象:
a = 2 #int 不可变对象
b = a #将a的值赋值给b,由于不可变对象所以创建了一个新值
a -= 1 # a - 1
print(b) #输出b的值
print(a is b) #a和b不一样
3、深拷贝和浅拷贝
import copy #导入copy
def AA():
a = [1,2,3,4]
b = copy.copy(a) #浅拷贝
print("追加前:")
print("a",a)
print("b",b)
b.append(9) #追加内容9
print("追加后:")
print("a", a)
print("b",b)
AA()
import copy #导入copy
def AA():
a = [1,2,[3,4],4]
b = copy.copy(a) #浅拷贝
print("追加前:")
print("a",a)
print("b",b)
print(a is b)
b.append(9) #追加内容9
b[2].append(8) #对可变列表进行追加操作
b[2].remove(3) #对可变列表进行去除操作
print("追加后:")
print("a", a)
print("b",b)
def BB():
a = [1,2,[3,4],4]
b = copy.deepcopy(a) #深拷贝
print("追加前:")
print("a",a)
print("b",b)
print(a is b)
b.append(9) #追加内容9
b[2].append(8)
print("追加后:")
print("a", a)
print("b",b)
AA()
BB()
#总结:浅拷贝只拷贝原有数据,对不可变数据进行增减修改操作并不会影响被拷贝后的数值,但是对可变数据进行修改时会影响到拷贝后的对象。深拷贝则无论怎么修改原数据都不会对拷贝后的数据有影响
输出结果:
追加前:
a [1, 2, [3, 4], 4]
b [1, 2, [3, 4], 4]
False
追加后:
a [1, 2, [4, 8], 4]
b [1, 2, [4, 8], 4, 9]
追加前:
a [1, 2, [3, 4], 4]
b [1, 2, [3, 4], 4]
False
追加后:
a [1, 2, [3, 4], 4]
b [1, 2, [3, 4, 8], 4, 9]
Process finished with exit code 0
二、参数的几种类型
1、位置参数
2、默认值参数
###################################默认参数###################################
def AA(a,b,c = 10,d = 20):
print(a,b,c,d)
AA(1,2) #后面的参数可以不传,因为默认 c = 10, d = 20。输出结果为:1,2,10,20
AA(1,2,3) #虽然 c 默认值为10,但是这里带入了3,所以c的值为3。输出结果为:1,2,3,20
3、命名参数
def AA(a,b,c):
print(a,b,c)
AA(b = 10 , c = 20 , a = 30) #如果实参和形参用的是相同的标识符那么就会通过标识符来一一匹配。
4、可变参数
元组:
def AA(a,b,*c): # 一个*代表将多个元素收集到一个元组中
print(a,b,c)
AA(1,2,3,4) # 1和2分别对应a,b。3和4组成元组
字典:
def AA(a,b,**c): # 两个*代表将多个元素收集到一个字典中
print(a,b,c)
AA(1,2,name = "ABC",age = 18) # 1和2分别对应a,b。name = "ABC"和age = 18组成字典
5、强制命名参数
def AA(*a,b,c): # 一个*代表将多个元素收集到一个元组中
print(a,b,c)
# AA(1,2,3) #如果这里这么写的话会报错,因为 *a 为元组其元素可能为:(1,) , (2,) , (3) , (1,2) , (1,2,3) , (1,3) , (2,3)等。
AA(1, b = 2, c = 3) #给每个形参对应赋值就不会报错
三、lambda表达式和匿名函数
a = lambda a, b, c: a * b * c # lambda + 形参 : 表达式
print(a)
print(a(1, 2, 3)) # 带入实参输出结果
b = [lambda a, b, c : a + b + c, lambda a, b, c : a - b - c, lambda a, b, c : a* b* c] # 此处b为列表,里面有三个lambda匿名函数元素
print(b[1](1, 2, 3)) #列表中第二个元素(lambda a, b, c : a - b - c)将1, 2, 3 带入实参输出结果
四、eval()函数
b = 10
c = 20
a = eval("b + c") #读取b,c的值进行加法运算
print(a) #输出值
print(eval("11 + 12")) #直接输出 11 + 12 的值
五、迭代
第一种:
def AA(a):
if a < 999:
a += a
print(a)
return AA(a) #return返回本函数进行迭代
AA(1)
第二种:
def BB(a):
if a < 999:
a += a
print(a)
BB(a) #直接调用本函数
BB(1)
2、递归实现阶乘
a = int(input("请输入一个数进行阶乘:"))
def AA(a):
if a != 1: #避免 1 - 1 = 0 导致结果为 0
return a * AA(a - 1)
return a #如果a为1的时候就返回阶乘结果
print(AA(a)) #输出阶乘结果