@TOC
一、全局变量与局部变量:
全局变量:作用为定义的模块,从定义位置开始直到模块结束,尽量少使用。用global进行声明。局部变全局。
局部变量:在函数体中声明,效率高。
二、参数传递:
本质是从实参到形参的赋值操作
形参与实参指向的同一个地方,故进行同一个操作,得到的实参为进行操作之后的参数。
当形参为可变参数(调用此参数时,系统不会生成新的堆,在原来的堆基础上进行改变,地址不做变动)
b=[10,20]
def f(m):
print("m:",id(m))
m.append(30)
f(b)
print('b为:{0}'.format(b))
print("id为:{0}".format(id(b)))
三、传递不可变对象:
当形参为不可变参数(调此参数地址会发生改变,系统会新生成一个堆,有新的地址,对于原来的堆没做改变)
不可变对象包括int、float、字符串、元祖、布尔值。
a=100
def f1(c):
print(id(c))
c=c+100
print(c)
print(id(c))
f1(a)
print(a,id(a))
在“赋值操作”时,由于不可变对象无法修改,系统会新创建一个对象。
四、参数类型:
位置参数:函数调用时
默认值参数:将函数参数设置好,一般在后面
def f2(a,b,c=10,d=20):
print(a,b,c,d)
f2(2,6)
命名参数:按照形参名字进行传递
#命名参数
def f3(a,b,c):
print(a,b,c)
f3(8,9,19) #位置参数
f3(c=10,a=20,b=30) #命名参数
可变参数:可变数量参数
1、*c(一个星号)将多个参数收集到一个“元祖”中
2、**c(两个星号),将多个参数收集到一个“字典”对象中
def f4(a,b,*c):
print(a,b,c)
f4(8,9,10,11)
def f5(a,b,c,**d):
print(a, b, c,d)
f5(8,9,10,name='gaoqi',age=15)
q=dict(name='gao',age=18)
print(q)
强制命名参数:在带星号的可变参数后增加的参数,必须为强制命名参数。
五、lambda表达式和匿名函数:
g = [lambda a:a*2,lambda b:b*3,lambda c:c*4]
print(g[0](6),g[1](7),g[2](8))
实际生成一个函数对象,计算结果是函数的返回值
基本语法:
lambda arg1,arg2,arg3,…:<表达式>
例子:
f=lambda a,b,c,d:abc*d
g=[lambda a:a2,lambda b:b3]
print(g0)
六、递归函数:
自己调用自己的函数
1、终止条件,一般用于返回值,不再调用自己
2、递归步骤:把第n步的值和第n-1步相关联