zoukankan      html  css  js  c++  java
  • python核心内容-函数(Function)

    一、什么是函数?

    引入函数:

           需求:根据用户输入圆的半径来计算圆的周长

    #根据下面给出的圆的半径,计算圆的周长 r1=12.3 r2=5
    r1=int(input('请输入圆的周长:').strip())
    delimeter_circle=2*3.14*r1
    print(delimeter_circle)
    
    r2=int(input('请输入圆的周长:').strip())
    delimeter_circle2=2*3.14*r2
    print(delimeter_circle2)

    从上面代码可以看出来,除了输入的圆的半径不一样,实现的功能是一样的,都是为了计算圆的半径,但是代码重复太多,可读性差,那么如何解决?函数

    函数是组织好的,可重复使用的,用来实现单一,或复杂功能的代码段。

    函数能提高应用的模块性,和代码的重复利用率,增强代码的可读性。python有很多的内置函数,比如print(),len()等。但你也可以自己定义函数

    def deliemeter_circle(r):
        delimeter_circle = 2 * 3.14 * r
        print(delimeter_circle)
    deliemeter_circle(5)

     二、函数的定义与调用

    定义def 关键词开头,空格之后接函数名称和圆括号(),最后还有一个":"def 是固定的,不能变,它是定义函数的关键字。
    
            空格 为了将def关键字和函数名分开
    
            函数名:函数名只能包含字符串、下划线和数字且不能以数字开头。函数名应该见名知意
    
            括号:是必须加的,先别问为啥要有括号,总之加上括号就对了!
    
            注释:每一个函数都应该对功能和参数进行相应的说明,应该写在函数下面第一行。以增强代码的可读性。
    
            函数体:函数中进行一系列的具体操作。
    
            参数:为函数体提供数据。
    
            返回值:当函数执行完毕后,可以给调用者返回数据。
    def  printInfo(info):
        print(info)
        return info
    # 函数名字printInfo 参数info 函数体:print(info) 返回值:info
    函数的调用:就是 函数名() 要记得加上括号。调用上述函数:printInfo()

    三、详解函数参数

      函数参数的分类:

        实际参数:函数调用过程中传入的参数  #1,2就是实际参数

        形式参数:函数定义的时候传入的参数   #a,b就是形式参数

    def add(a,b):
        result=a+b
    add(1,2)

     下面从实参和形参的角度去研究函数的参数

      从实参的角度传参

        ①:按照位置传入参数:位置参数    

    def add(a,b):
        result=a+b
    add(1,2)

        ②:按照关键字进行传入参数:关键字参数

    def add(a,b):
        result=a+b
    add(a=1,b=2)

        ③:位置传参和关键字传参混合使用

         注意事项:两者混合使用的时候,必须先位置传参,后关键字传参

    def add(a,b):
        result=a+b
    add(1,b=2)

      从形参的角度传参

        ①:按照位置进行传入参数: 

    def add(a,b):
        result=a+b
    add(1,2)

        ②:默认参数:将变化很小的可以设置为默认参数,函数调用时,如果默认参数没有传值,那么会使用默认的值,如果传递了新的值,那么会使用新的

    def  printInfo(username,male=''):
        print('您的名字是:{},性别是{}'.format(username,male))
    printInfo('科比')  # 您的名字是:科比,性别是男
    printInfo('孙二娘','') #您的名字是:孙二娘,性别是女

    关于函数的默认参数的问题:

      如果一个函数的默认参数是可变的数据类型,在每一次函数进行调用的时候,如果不传递参数那么这个参数就是共有的资源

    def  func(i,list=[]):
        list.append(i)
        return list;
    print(func(1))
    print(func(2))
    print(func(3))
    print(func(4))
    '''
    运行结果:
        [1]
        [1, 2]
        [1, 2, 3]
        [1, 2, 3, 4]
    '''  

    ③:可接收所有的位置参数与关键字参数:动态参数。  

          动态参数有两种:
            ①:args : 接收的是按照位置传参的值,组织成一个元组

    def  func(*args):  #站在形参的角度上,给变量加上*,就是组合所有传来的值。
        print(args)
    func('str',2,3,4)  #('str', 2, 3, 4)
    func(*[1,2,3,4,5,6]) #(1, 2, 3, 4, 5, 6) #站在实参的角度上,给一个序列加上*,就是将这个序列按照顺序打散

            ②:**kwargs: 接受的是按照关键字传参的值,组织成一个字典

    def  func(**kwargs):
        print(kwargs)
    func(a=1,b=2,c=3)  #{'a': 1, 'b': 2, 'c': 3}

          ③:接收任意类型的参数

            args必须在kwargs之前

    def  func(*args,**kwargs):
        print(args,kwargs)
    func('str',1,2,3,[1,2,3,4,5],a=1,b=2,c=3) #('str', 1, 2, 3, [1, 2, 3, 4, 5]) {'a': 1, 'b': 2, 'c': 3}

     四、函数的返回值

      (1):没有返回值

        ①:直接return

    def  add(a,b):
        result=a+b
        return

        ②:显示的调用return  None(不常用,不推荐使用)

    def  add(a,b):
        result=a+b
        return None

        ③:默认返回None

       (2):只有一个返回值

    def  add(a,b):
        result=a+b
        return result
    res=add(1,2)
    print(res)  #3

      (3):有多个返回值,多个返回值可以使用多个参数进行接收,也可以使用一个参数接收,使用一个参数接收的时候将返回一个元组

    def  add(a,b):
        return a,b
    num=add(3,4) 
    num1,num2=add(3,4) 
    print(num1,num2)# 3 4
    print(num) #(3,4)

     四、函数的其他事儿

      ①:函数可以做参数进行传递

    import os
    from urllib.request import  urlopen
    
    def wrapper(func):
        def inner(*args,**kwargs):
            if os.path.getsize('cache_web.txt'):
                with open('cache_web.txt',mode='rb')as f:
                    return f.read()
            result = func(*args,**kwargs)
            with open('cache_web.txt',mode='wb') as f:
                f.write(b'******'+result)
            return result
        return inner
    @wrapper
    def getContent(url):
        code=urlopen(url).read()
        return code
    res=getContent('http://www.baidu.com')
    print(res)
    res=getContent('http://www.baidu.com')
    print(res)
    View Code

      ②:函数名 执行的是函数的内存地址空间

    def  func():
        print('hello python')
    print(func)  #<function func at 0x00000124BD053EA0>

      ③:global  和nolocal的使用

         对于不可变数据类型,在局部作用域中可以查看全局作用域中的变量但是不能直接修改,如果想要修改全局作用域中的值,需要在程序的一开始添加global声明,如果在一个局部(函数)内声明了一个global变量,那么这个变量在局部的所有操作将对全局的变量有效;

    a='hello world'
    def func():
        global  a
        a='hello python'
        return a
    result=func()
    print(result)  #hello python

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

    def countDemo():
        i = 0
        def inner():
            nonlocal i
            for  k in range(4):
                i +=k
            return i
        return inner
    res=countDemo()
    print(res())

      

  • 相关阅读:
    java语言基础1问题汇总
    java从命令行接受多个数字求和输出
    关于Django迁移出现问题
    python中在ubuntu中安装虚拟环境及环境配置
    MVC与MVT
    前端性能优化
    less、sass、stylus
    bootstrap
    Swiper4.x使用方法
    swiper
  • 原文地址:https://www.cnblogs.com/Yly-G/p/10517528.html
Copyright © 2011-2022 走看看