首页 > 代码库 > Day 18 函数之一

Day 18 函数之一

函数参数:

1.形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量

2.实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值

3.位置参数和关键字(标准调用:实参与形参位置一一对应;关键字调用:位置无需固定)

4.默认参数

5.参数组

局部变量和全局变量

在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。

全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
当全局变量与局部变量同名时:
在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。
 
技术分享
#函数的使用必须遵循:先定义后使用的原则#函数的定义,与变量的定义是相似的,如果没有事先定义函数而直接引用,就相当于在引用一个不存在变量名#函数分为:定义阶段(只检测语法不执行代码)和调用阶段# print(x) #NameError# x=1# def func():#     print(‘hello world‘)## print(func)# func()# def bar():#     print(‘from bar‘)## def foo():#     print(‘from foo‘)#     bar()## foo()# #定义阶段# def foo():#     print(‘from foo‘)#     bar()## def bar():#     print(‘from bar‘)# #调用阶段# foo()#定义阶段:只检测语法,不执行代码# def func():#    if 1>2#        print(‘hahahahahahah‘)# def func(): #语法没问题,逻辑有问题,引用一个不存在的变量名#    asdfasdfasdfasdfasdf
一、函数的使用原则
技术分享
‘‘‘返回值:可以返回任意类型没有return:Nonereturn value: valuereturn val1,val2,val3 :(val1,val2,val3)return的效果:只能返回一次值,终止函数的执行‘‘‘def foo():    return 1    print(=====>)    return 2    return 3    return 4print(foo())
二、函数的返回值
技术分享
#形参与实参:# def foo(x,y): #x=1,y=2#     return x+y## foo(1,2)#===================================part1#位置参数:按照从左到右的顺序依次定义的参数# def foo(x,y):#     print(x)#     print(y)#按位置定义的形参,必须被传值,多一个不行,少一个也不行# foo(1,2,3)#按位置定义的实参,与形参一一对应# foo(2,10)#===================================part2#关键字参数:实参在定义时,按照key=value形式定义# def foo(x,y):#     print(x)#     print(y)# foo(y=10,x=1) #关键字参数可以不用像位置实参一样与形参一一对应,指名道姓地传值def foo(x,y):    print(x)    print(y)# foo(1,10)# foo(x=1,y=10)# foo(1,y=10)# foo(y=10,1)     #所有是有误的!!!# foo(x=10,1)         #无所谓位置,原则:关键字参数必须在位置参数之后# foo(1,x=10,y=20)# def foo(x,y,z):#     print(x)#     print(y)#     print(z)# # foo(1,z=20,10)# foo(1,y=2,z=10)#注意的问题一:位置实参必须在关键字实参的前面#注意的问题二:实参的形式既可以用位置实参又可以是关键字实参,但是一个形参不能重复传值#===================================part3#默认参数:在定义函数阶段,就已经为形参赋值,定义阶段有值,调用阶段可以不用传值# def func(x,y=10):#     print(x)#     print(y)# func(1,20)# func(1)# def func(y=10,x):#     print(x)#     print(y)#位置实参#关键字实参#位置形参#默认参数(形参)#形参的应用:值经常变化的需要定义成位置形参,# 值大多数情况下都一样,需要定义成默认参数# def register(name,age,sex=‘male‘):#     print(name,age,sex)## register(‘alex‘,1000)# register(‘wupeiqi‘,9000)# register(‘yuanhao‘,10000)# register(‘王铁蛋‘,10000,‘female‘)#默认参数需要注意的问题一:必须放在位置形参后面#默认参数需要注意的问题二:默认参数通常要定义成不可变类型#默认参数需要注意的问题三:默认参数只在定义阶段被赋值一次# x=10# def func(name,age=x):#     print(name)#     print(age)# x=20## func(‘egon‘)# def func(name,age=10,sex=‘male‘,hobby=[‘play1‘,‘play2‘]):#     print(name)#     print(age)#     print(hobby)## func(‘egon‘)#===================================part4#可变长参数:可变长指的是实参的个数不固定#按位置定义的可变长度的实参:*#按关键字定义的可变长度的实参:**# def func(x,y,*args): #x=1,y=2,args=(3,4,5,6)#     print(x,y)#     print(args)## func(1,2,3,4,5,6)# def func(x,y,*a):  #args=(3,4,5,6)#     print(x,y)#     print(a)## 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=2,z=1):#     print(x,y,z)## func(*(‘a‘,‘b‘,‘c‘)) #func(‘a‘,‘b‘,‘c‘)# 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,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)# def index(name,group):#     print(‘welcome %s to index page,group is: %s‘ %(name,group))## def wrapper(*args,**kwargs): #可以接受任意形式,任意长度的参数#     # print(args) #args=(1,2,3)#     # print(kwargs) #kwargs={‘x‘:1,‘y‘:2,‘z‘:3}#     index(*args,**kwargs) #index(*(1,2,3),**{‘x‘:1,‘y‘:2,‘z‘:3}) #index(1,2,3,z=3,y=2,x=1)## wrapper(name=‘egon‘,group=‘group1‘)#命名关键字参数:定义在*后的形参,这类形参,必须被传值,而且要求实参必须是以关键字的形式来传值# def register(**kwargs):#     print(kwargs)#     if ‘name‘ in kwargs:#         print(kwargs[‘name‘])#     if ‘age‘ in kwargs:#         print(kwargs[‘age‘])## # register(name=‘egon‘,age=18)# register()# def register(*args,name=‘egon‘,age):#     print(args)#     print(name)#     print(age)## # register(name=‘egon‘,age=18)# register(1,2,2,3,age=10)# def register(name,age,*,group,**kwargs):#     print(name)#     print(age)#     print(kwargs)## # register(‘egon‘,18)# register(‘egon1‘,18,hobby=‘paly1‘,group=‘group1‘)# def func(x,y=1,*args,z,**kwargs):#     print(x)#     print(y)#     print(args)#     print(z)#     print(kwargs)## func(1,2,3,4,5,z=10,a=1,b=2)# def func(x,*args,z=1,**kwargs):#     print(x)#     print(args)#     print(z)#     print(kwargs)## func(1,2,3,4,5,a=1,b=2,c=3)#形参:位置形参,默认参数,*args,命名关键字参数,**kwargs
三、函数参数的使用
技术分享
#函数的嵌套调用## 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))#函数的嵌套定义def f1():    def f2():        def f3():            print(from f3)        print(from f2)        f3()    print(from f1)    f2()# print(f1)f1()‘‘‘from f1from f2from f3‘‘‘
四、函数的嵌套
技术分享
#名字空间:存放名字与值的绑定关系#名称空间分为三种#一、内置名称空间:python解释器自带的名字,python解释器启动就会生成#二、全局名称空间:文件级别定义的名字都会存放与全局名称空间,执行python文件时会产生# x=1# def func():#     pass## class Foo:#     pass## import os## if 1 > 2 :#     y=3#三、局部名称空间:定义在函数内部的名字,局部名称空间只有在调用函数时才会生效,函数调用结束则失效# def func(x,y): #x=1,y=2#     z=3# func(1,2)#三者的加载顺序:内置名称空间->全局名称空间->局部名称空间#取值:局部名称空间->全局名称空间->内置名称空间# # max=10# def func(): #x=1#     # max=20#     print(max)### func()# max=10## def func(): #x=1#     max=20#     # print(max)# func()### print(max)# # x=0# def f1():#     # x=1#     def f2():#         # x=2#         def f3():#             # x=3#             print(x)#         f3()#     f2()## f1()#作用域:作用范围#全局作用域:内置名称空间与全局名称空间的名字属于全局范围,            # 在整个文件的任意位置都能被引用,全局有效#局部作用域:局部名称空间的名字属于局部范围,            #只在函数内部可以被引用,局部有效# x=1# def foo():#     def f2():#         print(x)#     f2()# def bar():#     print(x)## foo()# bar()# def f1():#     x=1#     def f2(): #f2=value#         # x=2#         print(x)#     f2()# f1()x=1def func():    x=2    def f1():pass    # print(dir(globals()[‘__builtins__‘])) #全局作用域name    # print(locals()) #局部作用域namefunc()print(globals() is locals())#局部作用域----->全局作用域
五、名称空间与作用域
技术分享
#函数是第一类对象: 指的是函数可以被当做数据传递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(‘无效的命令‘)def select(cmd_l):    filename=cmd_l[-1]    pattern=cmd_l[1]    with open(filename,r,encoding=utf-8) as f:        for line in f:            if pattern in line:                print(line)def delete():    print(delete func)def change():    print(change func)def add():    print(add func)def check():    print(check func)func_dic={    select:select,    delete:delete,    change:change,    add:add,    check:check,}while 1:    inp=input(>>: ).strip()    if not inp:continue    cmd_l=inp.split()    # print(cmd_l)    cmd=cmd_l[0]    if cmd in func_dic:        func_dic[cmd](cmd_l)    else:        print(无效的命令)
六、函数对象

 

Day 18 函数之一