函数也是对象
蓝色框是栈帧,存放变量信息,调用结束就消失,外面无法访问里面,里面可以访问外面
参数传递
传递可变参数和不可变参数
浅拷贝copy():拷贝子对象的引用,不拷贝内容
深拷贝deepcopy():连子对象的内存也全拷贝一份,子对象的修改不影响源对象
#测试浅拷贝、深拷贝
import copy
def testCopy():
'''测试浅拷贝'''
a = [10, 20, [5, 6]]
b = copy.copy(a)
print("a:", a)
print("b:", b)
b.append(30)
b[2].append(7)
print("浅拷贝.....")
print("a:", a)
print("b:", b)
def testDeepCopy():
'''测试深拷贝'''
a = [10, 20, [5, 6]]
b = copy.deepcopy(a)
print("a:", a)
print("b:", b)
b.append(30)
b[2].append(7)
print("深拷贝.....")
print("a:", a)
print("b:", b)
testDeepCopy()
运行结果
传递不可变对象是浅拷贝,不可变对象里包含了子对象是可变的,则方法内修改了这个可变对象,源对象也发生了改变。
默认值参数必须位于普通位置参数后面
位置参数,如:f1(8,9,10)
命名参数,如:f1(a=8,b=9,c=10)
可变参数 *param:将多个参数收集到一个”元组“中
**param:将多个参数收集到一个“字典”中
强制命名参数 :在带星号可变参数后面添新参数,在调用时必须是强制命名参数
lambda声明匿名函数
lambda arg1,arg2.... : <函数体>
例子:
运行结果
eval()函数
s = "print('abcde')"
eval(s)
a = 10
b = 20
c = eval("a+b")
print(c)
dict1 = dict(a=100,b=200)
d = eval("a+b",dict1) #取ddict1中的ab
print(d)
递归函数 自己调自己
利用递归计算阶乘
def factorial(n):
if n==1:
return 1
else:
return n*factorial(n-1)
result = factorial(5)
print(result)