zoukankan      html  css  js  c++  java
  • 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]()     #函数对象,调用函数 ..... 

     

     


    
    
    
     
    
    
     
  • 相关阅读:
    Python 之nmap模块问题解决
    phpstudy --mysql支持外联。
    Kali 更新
    Win 10 访问IPV6地址 问题。
    Macbookpro 使用Parallels Deskop安装kali Parallels Tools
    Windows 转 Mac 利用git继续管理github
    shell脚本移植问题(windwos移植到linux)
    APP测试项总结
    apktool 反编译
    微信小程序-服务器返回数据中包含有 换行符失效问题解决方案
  • 原文地址:https://www.cnblogs.com/liushubao/p/7485415.html
Copyright © 2011-2022 走看看