函数 function
为何用函数之不使用函数的问题
#组织结构不清晰 #代码冗余 #无法统一管理且维护难度大
函数分类:
1. 内置函数
2. 自定义函数
为何要定义函数
函数即变量,变量必须先定义后使用,未定义而直接引用函数,就相当于在引用一个不存在的变量名
#函数即变量,变量必须先定义后使用,未定义而直接引用函数,就相当于在引用一个不存在的变量名 >> name = 'tony' >>> name # 变量引用需要提前定义 'tony' >>> f1() # 调用函数,但没有提前定义,会报错 Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'f1' is not defined
定义函数都干了哪些事?
#只检测语法,不执行代码
#定义阶段 >>> def foo(): # 定义一个函数 def 关键字 ... print('from foo') # 函数体,具体干什么活 ... bar() # 函数内调用另外一个函数 ... >>> def bar(): # 即便上面有调用了 ... print('from bar') # 在下面定义也无妨 ... # 调用阶段 >>> foo() # 函数的调用,函数名() from foo from bar #函数在定义阶段发生了什么事情??? #只检测语法,不执行代码
函数的定义语法
#函数的定义语法 def 函数名(arg1,arg2,arg3): # arg1,arg3... 是函数需要的参数,即形参 "注释" # 函数体内要有注释,说明这个函数干什么活,怎么干,需要什么参数等信息。 函数体 return 返回值 # return 返回给调用者,不写等于写 return None,but return 整个函数结束。 ''' 函数名一般是动词 参数、、、 return:函数内部可以有多个return,但只能执行一次,函数就结束调用, 并且会把return后的值作为函数执行的结果返回 '''
函数定义的三种形式
#无参:应用场景仅仅只是执行一些操作,比如与用户交互,打印 # 有参:需要根据外部传进来的参数,才能执行相应的逻辑,比如统计长度,求最大值最小值 #空函数:设计代码结构 >>> def print_info(): # 定义无参函数 ... print('welcome to function') ... >>> print_info() welcome to function >>> # 定义有参函数, >>> def foo(x,y): ... if x > y: ... return x # 有返回值 ... else: ... return y ... >>> ret = foo(7,9) # 用一个变量接受返回值 >>> ret 9 # 定义空函数 >>> def foo(): ... pass # 占位 什么都不干,想干什么的时候在干 ... >>>
函数的调用
#!/usr/bin/env python3 # _*_ coding:utf-8 _*_ # @Author : tony # @Time : 2017/09/07 # @File : funciton_call # @Version : 1.0 ############################################################################# # 函数的返回值 ############################################################################# def func(): print('from func') return [1,2,3],'a',1,{'a':3} # 可返回任意类型的多个值 res=func() # 函数调用 print(res) # 返回多个值 会用一个tuple 包起来 ([1, 2, 3], 'a', 1, {'a': 3}) ''' 大前提:return的返回值没有类型限制 1. 没有return:返回None,等同于return None 2. return 一个值:返回该值 3. return val1,val2,val3:返回 (val1,val2,val3) ''' ############################################################################# # 函数的调用形式 ############################################################################# def my_max(x,y): if x > y: return x else: return y my_max(1,2) # 语句形式 res=my_max(1,2)*10 # 表达式形式 print(res) # 结果 20 # res1=my_max(1,2) # res2=my_max(res1,3) # 函数的返回值当作参数传入 res2=my_max(my_max(1,2),3) #函数调用可以当做另外一个函数的参数 print(res2) ''' 函数的调用 1 语句形式 直接传值调用 2 表达式形式 调用时参数计算 3 当作另为一个函数的参数 返回值当作参数传入 函数调用可以当作另外一个函数的参数 '''
函数的参数
#!/usr/bin/env python3 # _*_ coding:utf-8 _*_ # @Author : tony # @Version : 1.0 # @Time : 2017/09/07 # @File : function_argv ############################################################################# # 函数的参数 ############################################################################# # 形参:在定义函数时,括号内的参数成为形参 # 特点:形参就是变量名 def foo(x,y): #x=1,y=2 print(x) print(y) # 实参:在调用函数时,括号内的参数成为实参 # 特点:实参就是变量值 foo(1,2) # 1,2 # 在调用阶段实参(变量值)才会绑定形参(变量名) # 调用结束后,解除绑定 ############################################################################# # 参数的分类 ############################################################################# # 参数的分类 # 位置参数:按照从左到右的顺序依次定义的参数 # 位置形参:必须被传值,并且多一个不行,少一个也不行 # 位置实参:与形参按照位置一一对应 def foo(x,y): print(x) print(y) foo('egon',1) # egon , 1 # foo('egon',1,2) # 参数传多报错,TypeError ############################################################################# # 关键字实参:指的是按照name=value的形式,指名道姓地给name传值 ############################################################################# def foo(name,age): print(name) print(age) foo('egon',18) # 按位置传参数 egon , 18 foo(age=18,name='egon') # 关键字参数与位置无关 egon , 18 ############################################################################# # 关键字实参需要注意的问题是: ############################################################################# def foo(name,age,sex): print(name) print(age) print(sex) foo('egon',18,'male') print('======>') foo(sex='male',age=18,name='egon') foo('egon',sex='male',age=18) # 问题一:语法规定位置实参必须在关键字实参的前面 # foo('egon',sex='male',age=18) # 问题二:一定不要对同一个形参传多次值 # foo('egon',sex='male',age=18,name='egon1') # foo('male',age=18,name='egon1') # 默认形参:在定义阶段,就已经为形参赋值,意味在调用阶段可以不用传值 def foo(x,y=1111111): print(x) print(y) foo(1,'a') # 1,a ; foo(100) y 没有传使用默认参数 def register(name,age,sex='male'): print(name,age,sex) register('asb',73) # 最后一个参数使用默认参数 ,asb 73 male register('wsb',38) # 最后一个参数使用默认参数 , wsb 38 male register('ysb',84) # 最后一个参数使用默认参数 ,ysb 84 male register('yaya',28,'female') # 不使用默认参数 , yaya 28 female ############################################################################# # 默认参数需要注意的问题 ############################################################################# # 问题一:默认参数必须放在位置参数之后 ''' def foo(y=1,x): 默认参数应该放位置参数之后 print(x,y) ''' # 问题二:默认参数只在定义阶段赋值一次,而且仅一次 x=100 def foo(a,b=x): print(a,b) x=111111111111111111111111111111 # 定义阶段形参已被赋值,现在改变值,没有卵用 foo('egon') # egon , 100 # 问题三:默认参数的值应该定义成不可变类型
命名关键字参数
# 命名关键字参数 # 在*后面定义的参数称为命名关键字参数,必须以关键字实参传值。 def foo(name,age,*,sex,group): # * 后面的参数,实参必须以关键字形式给值 # * 就是来约束后面的参数要以关键字方式传值 print(name) print(age) print(sex) print(group) foo('tony',29,group='group1',sex='male') # sex 以关键字形式给值
高阶函数 函数对象
#!/usr/bin/env python3 # _*_ coding:utf-8 _*_ # @Author : tony # @Version : 1.0 # @Time : 2017/09/06 # @File : function_obj #函数是第一类的对象:指的是函数可以被当做数据传递 def foo(): print('from foo') # 被赋值 # # # # # # # # # # # # # # # # # # # # # # ## f=foo # 函数被赋值一个变量 print(f) # 返回一个函数对象 <function foo at 0x7f61c89e96a8> f() # from foo # 可以当做参数传入 # # # # # # # # # # # # # # # # # # # # # # ## def wrapper(func): # 函数参数接受 print(func) # 返回一个函数对象 <function foo at 0x7f61c89e96a8> func() # 函数内调用另一个函数 wrapper(foo) # 函数作为参数传入,如果第一个函数中有return 此时也要用变量接受返回值 # 可以当做函数的返回 # # # # # # # # # # # # # # # # # # # # # # ## def wrapper(func): return func res=wrapper(foo) print(res) # 返回一个函数对象 <function foo at 0x7f61c89e96a8> ret = res() # from foo # 可以当做容器类型的元素 # # # # # # # # # # # # # # # # # # # # # # ## cmd_dic={ 'func':foo } print(cmd_dic) cmd_dic['func']() def select(sql): '''select function''' print('select----->',sql) #sql=['select', '*', 'from', 'mysql.user;'] def insert(sql): '''insert function''' print('insert---->',sql) def update(sql): '''update function''' print('update----->',sql) def delete(sql): '''delete function''' print('delete---->',sql) def alter(sql): print('alter===>',sql) cmd_dic = { 'insert': insert, 'update': update, 'delete': delete, 'select': select, 'alter':alter, } #select * from mysql.user; def main(): while True: sql=input('>>: ').strip() if not sql:continue cmd_info=sql.split() cmd=cmd_info[0] if cmd in cmd_dic: cmd_dic[cmd](cmd_info) else: print('cmd not exists') #cmd_dic.get(cmd,'cmd not exists') main()
继续上货
#!/usr/bin/env python3 # _*_ coding:utf-8 _*_ # @Version : 1.0 # @Time : 2017/09/06 # @Author : tony # @File : func_oo #函数对象..... 函数可以当作参数传递数据..... def max(x,y): return x if x > y else y # 比较俩数返回一个最大的.... def max2(a,b,c,d): res = max(a,b) #根据名称空间,作用域的作用 找到max .... res1 = max(res,c) res2 = max(res1,d) return res2 print(max2(1,2,9,5)) #函数可以作为一个对象,进行参数传递。函数名(比如max)即该对象。比如说 def test(f,a,b): #f(a,b) 这个直接可以调用但是不会油返回值... return f(a,b) #每一个单独def函数都要有自己到返回值 .... print(test(max,23,324)) # 第一个参数是函数传递.... 不影响其函数本身的功能.. 就是重新赋值一个变量名而已... #利用该特性,优雅的取代多分支的if def foor(): print('from foor ... ') def bar(): print('from bar ... ') def rooj(): print('from rooj ... ') def roof(): print('from roof ... ') fun_dit = {'foor':foor,'bar':bar,'rooj':rooj,'roof':roof} # 函数对象.... fun_dit['bar']() while True: choice = input('Please input >>> ... ').strip() if choice in fun_dit: fun_dit[choice]() #函数对象,调用函数 .....