python函数

此生再无相见时 提交于 2019-12-10 10:28:01

1.可变长参数:在调用函数时,实参值得个数不固定

   实参的形式有:位置实参和关键字实参

   形参的解决方案为 *,**

   位置形参例子:

  def foo(x,y,*args):

            print(x,y)
            print(*args)

       foo(1,2,*[3,4,5,6,7])
       #先将位置打散(1,2,3,4,5,6,7)在一一对应
    关键字形参例子,会被**保存成字典的形式

       def foo(x,y,**kwargs):

             print(x,y)

             print(kwargs)

  foo(x=1,**{'y':2,'a':3,'b':4,'c':5})   #先将位置打散在一一对应   #foo(x=1,y=2,a=3,b=4,c=5)

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

      1.可以被引用 x=1,y=x

           def func(x,y):

                    print(x,y)

             f=func

             f(1,2)

      2.可以当做函数的参数传入

            def foo():

                  print('aaa')

            def  bar(func)

                  print(func)

            bar(foo)

      3.可以当做函数的返回值

            def foo():

                  print('aaa')

            def  bar():

                 return foo

           f=bar()

           f()

      4.可以当做容器类型的元素

         def foo():

               print('aaa')

        def bar():

               return foo

        l=[foo,bar]

        l[0]()

3.函数的嵌套调用:调用了一个函数的过程中又调用了另一个函数

def my_max(x,y):

       if x>=y:          return x       else:          return y   def max_max4(a,b,c,d):      res1=my_max(a,b)      res2=my_max(res1,c)      res3=my_max(res2,d)      return res3   a=max_max4(5,6,4,2)   print(a)1函数的嵌套定义:内部定义的函数还是要在内部调用      def fu1():          def fu2():          print(fu2)2.名称空间:存放名字的地方,通过名字拿到内存地址后调用方法   1.内置命名空间(解释器启动就有) python内置解释器内置的名字如len max min   2.全局名称空间(执行Python文件时生效)   3.局部名称空间(函数调用时生效,结束失效) 函数内部定义的名字    加载顺序 内置》》》》全局》》》》局部名称空间    访问名字的顺序:局部名称空间==》全局===》内置    

        

      #全局作用域:(全局范围)内置名称空间与全局名称空间的名字,全局有效(globals())

        globals将变量设置为全局变量

      #局部作用域:(局部范围)局部名称空间的名字,局部有效locals()

   nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量

      #打破函数层级限制来调用函数:通过对象的概念

           def outter():

                 def inner():

                      print('inner')

                 return inner

          f=outter()

          f()

 

      #函数的作用域关系是在函数定义阶段就已经固定了,与调用位置无关

         x=111

         def outter():

        def inner():           print('inner',x)       return inner   f = outter()   def bar():       f()   x=1111111111111111111111   bar()

4.闭包函数:1.定义在函数内部的函数2.该函数的函数体代码包含对外部作用域(而不是全局作用域)名字的引用

                     3.通常将闭包函数用return返回,然后可以在任意使用

5.无参装饰器

         1.开放封闭原则:对扩展开放,对修改是封闭的

         2.装饰它人的,器指的是任意可调用对象,现在的场景装饰器------>函数

            原则:1.不修改被装饰对象的源代码 2.不修改被装饰对象的调用方式

            装饰器的目的:在遵循1,2的前提下为被装饰对象添加上新功能

            在被装饰对象的正上方写上@装饰器名

     def timmer(func):        def inner():           start=time.time()           func()           end=time.time()           print('run time is %s'%(end-start))        return inner      '''当解释器读取到@时会将@下方的函数名当做参数         传递给timmer'''    @timmer #==index=timmer(index)    def index():       time.sleep(3)       print('welecome to index')   index()1.1inner函数带返回值

        import time
        def timmer(func):
              '''inner函数带返回值'''
             def inner():
                start=time.time()
                res=func()
                end=time.time()
                print('run time is %s'%(end-start))
             return res
        return inner
         '''当解释器读取到@时会将@下方的函数名当做参数
           传递给timmer'''
         @timmer #==index=timmer(index)
         def index():
               time.sleep(3)
               print('welecome to index')
              return 1111
       res=index()
       print(res)

  1.2inner函数传参
   import time
   def timmer(func):
      def inner(*args,**kwargs):
           '''inner函数传参'''
            start=time.time()
            res=func(*args,**kwargs)
            end=time.time()
            print('run time is %s'%(end-start))
       return res
    return inner
     '''当解释器读取到@时会将@下方的函数名当做参数
       传递给timmer'''
     @timmer #==index=timmer(index)
   def home(name):
         print('welecome %s to index'%name)
   home('aa')

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!