python基础-函数

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')

posted @ 2019-12-10 10:09  birdfish  阅读(441)  评论(0编辑  收藏  举报