zoukankan      html  css  js  c++  java
  • python之路之函数

    一 为何要有函数?

      不加区分地将所有功能的代码垒到一起,问题是:
          代码可读性差
          代码冗余
          代码可扩展差
     如何解决?
      函数即工具,事先准备工具的过程是定义函数,拿来就用指的就是函数调用
     
      结论:函数使用必须是:先定义,后调用
     

    二:函数的分类

      1.内置函数:built-in
           2.自定义函数:
            def 函数名(参数1,参数2,...):
                '''注释'''
                函数体

    三:为何要定义函数

      函数即变量,变量必须先定义后使用,未定义而直接引用函数,就相当于在引用一个不存在的变量名
     

    四、定义函数的三种形式

      无参:应用场景仅仅只是执行一些操作,比如与用户交互,打印
      有参:语要根据外部传进来的参数,才能执行相应的逻辑,比如统计长度,求最大值最小值
      空函数:设计代码结构

    五、形参与实参

    形参与实参:
    def foo(x,y):     #形式参数
        return x+y
    
    foo(1,2)      #实际参数
    
    1.位置参数:按照从左到右的顺序依次定义的参数
    def foo(x,y):
        print(x)
        print(y)
    #安位置定义的形参,必须被传值,多一个不行
    foo(1,2)
    #安位置定义的实参,与形参一一对应,多一个少一个都不行
    
    2.关键字参数:实参在定义时,按照key=value形式定义
    def foo(x,y):
        print(x)
        print(y)
    
    foo(y=10,x=1)#关键字参数可以不用像位置实参一样与形参一一对应,指名道姓的传值
    注意的问题一:位置实参必须在关键字实参的前面
    注意的问题二:实参的形式既可以用位置实参又可以用关键字形参,但是一个形参不能重复传值
    
    3.默认参数:在定义函数阶段,就已经为形参赋值,定义阶段有值,调用阶段不用传值
    def func(x,y=10):
        print(x)
        print(y)
    
    func(1)
    默认参数(形参)需要注意的问题一:必须放在位置形参后面
    默认参数需要注意的问题二:默认参数通常要定义成不可变类型
    默认参数需要注意的问题三:默认参数只在定义阶段被赋值一次
    
    形参的应用:值经常变化的需要定义成位置形参,大多数情况下都一样需要定义成默认参数
    
    4.可变长参数:可变长指的是实参的个数不固定
    按位置定义的可变长度的实参:*
    def func(x,y,*args):    #x=1,y=2,args=(3,4,5)
        print(x,y)
        print(args)
    
    # func(1,2,3,4,5)
    func(1,2,3,4,5)
    
    按关键字定义的可变长度的实参:**
    def func(x,y,**kwargs):    #x=1,y=2,kwargs={'a':1,'b':3,'z'=3}
        print(x,y)
        print(kwargs)
    
    func(1,y=2,z=3,a=1,b=3)
    
    def func(*args,**kwargs):    #可以接收任何类型参数
        print(args)
        print(kwargs)
    
    func(1,y=2,z=3,a=1,b=3)
    
    5.命名关键字参数:定义在*后的形参,这类形参,必须被传值,而且要求实参必须是以关键字的形式来传值
    def register(name,age,*,group,**kwargs):
        print(name)
        print(age)
        print(group)
        print(kwargs)
    
    register(name='sam',age=18,z=10)
    顺序:位置,默认,*,命名关键字,**
    六、函数对象
    
    函数是第一类对象: 指的是函数可以被当做数据传递
    
    def func():
        print('from func')
    
    可被引用
    f=func
    
    可以当做函数的参数
    def func():
        print('from func')
    def foo(x):
        print(x)
        x()
    
    foo(func)
    
    可以当做函数的返回值
    def foo():
        print('from foo')
    def bar():
        return foo
    f=bar()
    print(f)
    print(foo)
    
    x=0
    def f1():
        x=1
        def f2():
            # x=2
            print(x)
        return f2
    f=f1()
    # print(f)
    f()
    
    
    
    可以当做容器类型的元素
    def select():
        print('select function')
    
    func_dic={
        'select':select,
    }
    
    # print(func_dic['select'])
    func_dic['select']()
     
    
    七、函数嵌套
    
    函数的嵌套调用
    
    def max2(x,y):
        if x > y:
            return x
        else:
            return y
    
    def max4(a,b,c,d):
        res1=max2(a,b) #23
        res2=max2(res1,c) #23
        res3=max2(res2,d) #31
        return res3
    
    
    print(max4(11,23,-7,31))
    
    
    #函数的嵌套定义
    def f1():
        def f2():
            def f3():
                print('from f3')
            print('from f2')
            f3()
        print('from f1')
        f2()
        
    f1()

    八、函数的返回值

      返回值:可以返回任意类型

      没有return:None

      return value: value

      return val1,val2,val3 :(val1,val2,val3)

      return的效果:只能返回一次值,终止函数的执行

    九、闭包函数

      1.闭包函数:1 内部函数  2 包含对外部作用域而非全局作用域的引用

      2.闭包函数的特点:

        1.自带作用域

        2.延迟计算

      3.定义闭包函数的基本形式

      def 外部函数名():
        内部函数需要的变量

        def 内部函数():
          引用外部变量
        return 内部函数

      4.print(b.__closure__)查看闭包函数

       print(b.__closure__[0].cell_contents)查看闭包函数上一级的值

    name='alex'
    def func():
        name='egon'
        def bar():
            print(name)
        return bar
    
    b=func()
    b()

    错误示范,拿到的是1000,因为作用域在定义时就绑定好了 money=1000 def tell_ino(name): print('%s have money %s' %(name,money)) tell_ino('sam') def f1(): money=10 tell_ino('sam') f1() 拿到的是10 money=1000 def f1(): money=10 def tell_ino(name): print('%s have money %s' %(name,money)) tell_ino('sam') f1()

    #定义固定的名字和固定的钱
    def aaa(): name='sam' def wrapper(): money=1000 def tell_info(): print('egon have money %s' %(money)) print('my name is %s' %(name)) return tell_info return wrapper w=aaa() #name='sam' tell_info=w() tell_info()

      5.读取网页

    from urllib.request import urlopen
    def index(url):
        def get():
            return urlopen(url).read()
        return get
    
    xiaohua=index('http://www.xiaohua100.cn')
    python=index('https://www.python.org')
    baidu=index('http://www.baidu.com')
    
    print(xiaohua())

     

     

     

     

      

  • 相关阅读:
    修改 MySQL 的 sql_mode 模式方法
    PHP 实现 Redis 连接池
    【转载】php解决高并发问题
    PHP 7 不适用函数:password_hash
    PDO 防止 SQL 注入示例
    记录一次 header 参数格式引发的错误
    Laravel 框架数据库查询构造器中 when 的易犯错误
    PHP 7.3.4 安装 Redis 4.0(Windows系统)
    汇编语言全梳理(精简版)
    Anaconda安装和使用
  • 原文地址:https://www.cnblogs.com/78pikaqiu/p/6995477.html
Copyright © 2011-2022 走看看