1 函数

函数 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]()     #函数对象,调用函数 ..... 

 

 

 

 

 

 

 

 

 

 

 

 




 

 

 
posted @ 2017-09-06 16:16  eggtea  阅读(228)  评论(0)    收藏  举报