首页 > 代码库 > Python编程(四)函数

Python编程(四)函数

函数的返回值:

可以返回任意类型

没有return的话返回:None

return返回一次就终止函数的运行

函数的使用:

必须先定义,然后再调用

函数的定义:跟变量定义相似,如果没有事先定义就调用的话相当于在引用一个不存在的变量名

技术分享
# #定义阶段
# def foo():
#     print(‘from foo‘)
#     bar()
#
# def bar():
#     print(‘from bar‘)
#
# #调用阶段
# foo()


#定义阶段:只检测语法,不执行代码
# def func():
#    if 1>2
#        print(‘hahahahahahah‘)


def func(): #语法没问题,逻辑有问题,引用一个不存在的变量名
View Code

 

函数参数:

实参与形参(实际传入的参数叫做实参)

位置参数:按照从左到右的顺序依次定义的参数

技术分享
def foo(x,y):
    print(x)
    print(y)
#按位置定义的形参,必须被传值,多一个不行,少一个也不行,按位置对应传入
 foo(1,2)
View Code

关键字参数:实参在定义时,按照key=value形式定义

技术分享
def foo(x,y):
     print(x)
     print(y)
foo(y=10,x=1)
 foo(y=10,x=1) #关键字参数可以不用像位置实参一样与形参一一对应,需要指名道姓地传值
View Code

注意:

问题一:位置实参必须在关键字实参的前面
问题二:实参的形式既可以用位置实参又可以是关键字实参,但是一个形参不能重复传值

 

默认参数:在定义函数阶段,就已经为形参赋值,定义阶段有值,调用阶段可以不用传值

技术分享
def func(x,y=10):   #形参中给了默认值,实参中可以不用传值,那么会按照默认值运行
     print(x)             #传值的话就会按传入的值运行    
     print(y)


 func(1,20)
 func(1)
View Code

#形参的应用:值经常变化的需要定义成位置形参,
# 值大多数情况下都一样,需要定义成默认参数

默认参数注意问题:

  一、默认参数需要注意的问题一:必须放在位置形参后面
  二、默认参数需要注意的问题二:默认参数通常要定义成不可变类型
  三、默认参数需要注意的问题三:默认参数只在定义阶段被赋值一次

可变长参数:      可变长指的是实参的个数不固定
#按位置定义的可变长度的实参:*
#按关键字定义的可变长度的实参:**

技术分享
def func(x,y,*args): #x=1,y=2,args=(3,4,5,6)#*号接收x,y以外的参数,以元组的形式赋值给args
     print(x,y)
     print(args)

 func(1,2,3,4,5,6)




 def func(x,y,*args):  #args=(3,4,5,6)
     print(x,y)
     print(args)

 func(1,2,*(3,4,5,6)) #*号后拆开即为foo(1,2,3,4,5,6)


 def func(x,y,z):
     print(x,y,z)

 func(1,*(2,3)) #func(1,2,3)#同上
 func(*(2,3)) #func(2,3)



 def func(x,y,**kwargs): #x=1,y=2,kwargs={‘a‘:1,‘b‘:3,‘z‘:3}#**用来接收关键字参数,并以字典形式赋值给kwargs
     print(x,y)
     print(kwargs)

 func(1,y=2,z=3,a=1,b=3)#关键字参数必须放在位置参数后


 def func(x,y,**kwargs): #x=1,y=2,**kwargs=**{‘a‘:1,‘b‘:3,‘z‘:3}
     print(x,y)
     print(kwargs)

 func(1,y=2,**{a:1,b:3,z:3}) #**拆开即为func(1,y=2,z=3,b=3,a=1)


 def func(x,y=1,z=1):
     print(x,y,z)

 func(**{y:2,x:1,z:3}) #


 def wrapper(*args,**kwargs): #可以接受任意形式,任意长度的参数
     print(args)
     print(kwargs)


 wrapper(1,2,3,3,3,3,3,x=1,y=2,z=3)
View Code

 

命名关键字参数:定义在*后的形参,这类形参,必须被传值,而且要求实参必须是以关键字的形式来传值

函数的嵌套使用:

定义:

def f1():
    def f2():
        def f3():
            print(‘from f3‘)
        print(‘from f2‘)
        f3()
    print(‘from f1‘)
    f2()
# print(f1)
f1()

技术分享
 def max2(x,y):
     if x > y:
         return x
     else:
         return y

 def max4(a,b,c,d):
     res1=max2(a,b) #23
     res2=max2(res1,c) #23
     res3=max2(res2,d) #31
     return res3


 print(max4(11,23,-7,31))
View Code

 

函数是第一类对象: 指的是函数可以被当做数据传递

技术分享
def func():
    print(from func)

#可被引用
f=func

#可以当做函数的参数
def func():
    print(from func)
def foo(x):
    print(x)
    x()
foo(func)

#可以当做函数的返回值
def foo():
    print(from foo)
def bar():
    return foo
f=bar()
print(f)
print(foo)

x=0
def f1():
    x=1
    def f2():
        # x=2
        print(x)
    return f2
f=f1()
# print(f)
 f()



#可以当做容器类型的元素
def select():
    print(select function)
func_dic={
    select:select,
}

# print(func_dic[‘select‘])
# func_dic[‘select‘]()






#
# def select():
#     print(‘select func‘)
#
# def delete():
#     print(‘delete func‘)
#
# def change():
#     print(‘change func‘)
#
# def add():
#     print(‘add func‘)
#
#
# while 1:
#     cmd=input(‘>>: ‘).strip()
#     if not cmd:continue
#     if cmd == ‘select‘:
#         select()
#     elif cmd == ‘delete‘:
#         delete()
#     elif cmd == ‘change‘:
#         change()
#     elif cmd == ‘add‘:
#         add()
#     else:
#         print(‘无效的命令‘)
View Code

 

名称空间:存放名字与值的绑定关系

名称空间分为三种
内置名称空间:python解释器自带的名字,python解释器启动就会生成

全局名称空间:文件级别定义的名字都会存放与全局名称空间,执行python文件时会产生

局部名称空间:定义在函数内部的名字,局部名称空间只有在调用函数时才会生效,函数调用结束则失效

三者的加载顺序:内置名称空间->全局名称空间->局部名称空间

取值:局部名称空间->全局名称空间->内置名称空间

 

作用域:作用范围
    全局作用域:内置名称空间与全局名称空间的名字属于全局范围,
             在整个文件的任意位置都能被引用,全局有效
    局部作用域:局部名称空间的名字属于局部范围,
              只在函数内部可以被引用,局部有效

Python编程(四)函数