1. 函数和过程
过程:就是没有返回值的函数
在python中函数和过程是一样的,没有区别,如果没有返回值,python会自动赋值为None
2. 总结:
返回值=0:返回None(即没有写返回值时,python自动赋值为None)
返回值=1:返回object(即返回一个值时,其类型为object)
返回值>1:返回tuple(即有多个返回值时,其类型为tuple)
3. 形参和实参
形参:形参只有在被调用时才能分配内存单元,调用结束后,即刻释放所分配的内存单元
实参:可以是常量、变量、表达式、函数等
混搭传值:位置参数必须要在关键字参数左边,且不能重复赋值
def test(x,y,z):
print(x,y,z)
v=test(1,2,z=3)
默认参数
参数组:(非固定长度的参数)**字典 *列表
def test(x, *args):
print(x)
print(args)
v = test(1, 2, 3, 4, 5, 6)
print的args=(2,3,4,5,6)当作元组来处理,但是传入的时候args将多传入的值当作列表处理
def test(x, **kwargs):
print(x)
print(kwargs)
v = test(1, y=2, z=3)
# print结果kwargs,为字典
output:
1
{'y': 2, 'z': 3}
4. 全局变量与局部变量
函数中可以使用global来表示以下使用和改变的是全局变量
NAME="ALEC"
def TEST():
global NAME
NAME='sky'
print("change name",NAME)
output:
change name ALEC
如果函数的内容中无global关键字,优先读取局部变量,能读取全局变量,无法对全局变量进行赋值,NAME=“fff”
但是对于可变类型,可以对内部元素进行操作如append等
如果函数中有global关键字,便来那个本质上就是全局的那个变量,可读取可赋值
执行顺序:(需要补一个)
全局变量练习:
name="佩奇"
def weihou():
name="乔治"
def weiweihou():
global name
# nonlocal name #nonlocal代指上一级的name
name = "苏茜"
weihou()
print(name)
weiweihou()
print(name)
output:
佩奇
苏茜
5. 风湿理论之函数即变量
在执行过程中,函数即变量
def test():
pass
name="wendy"
意思是,创建函数和创建变量name一样,在内存中都是相当于门牌号是test、name,然后房间内是函数体、字符串wendy
6. 递归
def calc(n):
print(n)
if int(n/2)==0:
return n
return calc(int(n/2))
calc(10)
递归:如上即为递归,自己调用自己
递归的特点:
1)必须要有一个明确的结束条件;
2)每次进入更深一层递归时,问题规模相比上次递归都应有所减少;
3)递归效率不高,递归层次过多会导致栈溢出(在计算机中,函调用是通过栈(stack)这种数据结构实现的;每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。)
7. 函数的作用域
def test():
pass
print(test) # test 代表函数名称,代表内存中的门牌号,即函数体的内存地址
test() # 加上()代表执行该函数
output:<function test at 0x000000000205C268>
def test1():
print('in the test1')
def test():
print('in the test')
return test1
print(test) # 打印test函数的地址
res = test() # 运行test返回test1函数的地址
print(res()) # 运行test1,返回print:in the test1
name = 'peiqi'
def foo():
name = "qiaozhi"
def bar():
print(name)
return bar
a = foo() # 运行foo,返回bar这个函数的地址
print(a) # 相当于打印bar这个函数的地址
a() # 相当于运行bar这个函数,print name,但是这里虽然在全局作用域中调用,但是print的name是“qiaozhi”
# 因为这个函数在foo内部,所以要运行bar,肯定得先运行foo,所以离它最近的name应该是qiaozhi,而不是peiqi