可扩展性,可维护性
避免代码冗长
可读性
函数:
函数是具备某一特定功能的工具
使用原则:先定义后调用
函数的定义———函数的三种形式
def 函数名(arg1,arg2):
#注释
函数体
Return 返回值
1.定义无参函数:函数的执行不依赖于调用者传入的参数就能执行时,需要定义为无参函数
def main():
print_tag('*',20,3)
print_msg('hello world')
print_tag('*',20,3)
main()
2.有参函数:函数的执行需要依赖于调用者传入的参数才能执行时,需要定义为有参函数
def print_tag(tag,count,line_num):
for i in range(line_num):
print(tag*count)
3.空函数: 定义空函数:函数体为pass
def func(x,y,z):
pass
函数的调用:
- 语句形式:func()
- 表达式形式:res=func2()
- 函数调用当作参数传入 func2(funct2(10))
函数的定义:与变量的定义是相似的
定义阶段:只检测语法,不执行代码
返回值:可以返回任意类型
没有return:NONE
return val1,val2,val2:(val1,val2,val3)
return 只能返回一次值并终止函数
参数:
形参&实参
形参:变量名
实参:实际传入的数据
位置参数:按照从左到右的顺序依次定义的参数
按位置定义的实参,与形参一一定义
def foo(x,y) print(x) print(y) Foo(1,2) 1 2
关键字参数:形参=实参定义,key=value
def foo(x,y): print(x) print(y) foo(y=1,x=2)
注意:
1位置实参必须在关键字实参前面
2实参的形式可以是位置实参也可以是关键字参数,但是一个形参只能对赢一个实参
def foo(x,y,z): print(x) print(y) print(z) foo(1,z=2,y=5)
默认参数(形参):在定义参数阶段,就已经为形参赋值,调用阶段可以传值也可以不传值,不传值使用默认参数。
**默认参数必须放在位置形参后面
**值大多数情况下不变的使用默认参数
**默认参数通常定义成不可变型
**默认参数只在定义阶段被赋值一次
a=10 def foo(name,age=a) Print(name,age) a=20 foo('mona’) Mona,10
可变长参数:可变长指的是实参的个数不固定
按位置定义的可变长度的实参:*
按关键字定义的可变长度的参数:**
def func(x,y,*args):#可变的保存为tuple print(x,y,args) func(1,2,3,4) 1 2 (3, 4) def func(x,y,**args):#可变的元素保存为字典模式 print(x,y,args) func(x=1,y=2,z=3,a=1,b=1) 1 2 {'z': 3, 'a': 1, 'b': 1} def wrapper(*args,**kwargs): print(args) print(kwargs) wrapper(1,2,3,4,5,x=1,y=2,z=3) (1, 2, 3, 4, 5) {'x': 1, 'y': 2, 'z': 3}
命名关键字参数:定义在*后面的形参,必须被传值,并且必须以关键字的形式传值
def register(*rg,name,age): print(name) print(age) register(age=18,name='mona’) mona 18
总结:位置参宿--->默认参数---->*args---->命名关键字----->**kwargs
函数嵌套调用:
函数的嵌套定义:
def f1():
def f2():
函数体
f2()
函数是第一类对象:指的是函数可以被当作数据传递
- 可被引用
- 可当作函数参数
- 可以当做函数的返回值
- 可以当做容器类型元素
名称空间与作用域:
名称空间:存放变量名与值的绑定关系
名称空间分为三种:
- 内置名称空间:python解释器自带的变量,python解释器启动就会生成内置空间
- 全局名称空间:文件级别定义的名字都会存放到全局名称空间,执行python文件时会产生全局名称空间
- 局部名称空间:定义在函数内部的名字,局部名称空间只有在调用函数时才会生效,调用函数结束时失效
三者的加载顺序:内置—>全局—>局部
取值的顺序: 局部—>全局——>内置
局部作用域———>全局作用域
作用域:作用范围
- 全局作用域:内置名称空间和全局名称空间的名字属于全局范围;在整个文件的任意位置都能被引用,全局有效。
- 局部作用域:局部名称空间的名字属于局部范围,只在函数内部可以被引用,局部有效。
global: x=1 def foo(): global x x=1000 print(x) foo() print(x) 1000 1000
nonlocal : x=1 def foo(): def f2(): x=2 def f3(): nonlocal x x=10000 f3() print(x) f2() foo() print(x) 10000 1
闭包函数:函数内部定义的函数,称为内部函数。该内部函数包含对外部作用域而非全家作用域。
name='alex'
def func():
name='egon'
def bar():
print(name)
return bar
b=func()
b()
查看是否是闭包函数:none 就不是闭包函数
name='alex'
def func():
name='egon'
def bar():
print(name)
return bar
b=func()
print(b.__closure__)
闭包函数的特点:
- 自带作用域
- 延迟计算
定义闭包函数的基本形式:
def 外部函数:
内部函数变量
def 内部函数():
引用外部变量
return 内部函数