函数----模块化的程序设计

时间:2021-04-19 22:24:40
可扩展性,可维护性
避免代码冗长
可读性
 
函数:
  函数是具备某一特定功能的工具
使用原则:先定义后调用
 
函数的定义———函数的三种形式
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 内部函数