python3基础07函数(自定义)

作者: pythonic生物人 | 来源:发表于2020-07-25 13:00 被阅读0次

    本文介绍python中自定义函数的构建;
    参数传递;
    模块中调用函数。
    首发于本人公众号:pythonic生物人

    更好的阅读体验请戳:

    python3基础07函数(自定义)

    目录

    0、楔子
    1、自定义函数格式
    2、编写函数说明文档
    3、函数参数
      函数形参和实参区别
      位置实参
      关键字实参
      默认实参
      让实参可选
      传递任意数量的实参
      结合使用位置实参和任意数量实参
      使用任意数量的关键字实参
    
    4、函数返回值
      将函数存储在模块中并导入新程序中
    

    0、楔子

    函数可以理解为多条语句整合而成的代码块,指定特定的名称, 用于实现具体的功能。函数可以实现代码更好的复用,是结构化编程的核心。例如,已知圆的半径r求圆的面积,可以通过如下代码解决。

    import math
    r = 3
    S = math.pi*r*r
    print(S)
    

    28.274333882308138

    但是,当需要求多个圆的面积时,反复写上面代码就显得很繁琐,这时可以定义一个求圆面积的函数s_circle,每次只需传入不同圆的半径,即可计算不同圆面积。

    def s_circle(r):
        S = math.pi*r*r
        return S
    print(s_circle(3))
    print(s_circle(333))
    

    28.274333882308138
    348368.06776391855


    1、 自定义函数格式

    格式如下:

    def fun_name(args):
        fun_body
        return xx
    
    fun_name,自定义的函数名;
    args,传入函数的参数;
    fun_body,函数体,即函数想实现的功能;
    return xx,return结束函数,函数返回值 xx,不指定则返回None。
    

    举个栗子,定义一个计算圆面积的函数:

    def s_circle(r):#自定义函数s_circle,传入的参数r。
        S = math.pi*r*r#函数体
        return S    #返回圆的面积S
    print(s_circle(3))#函数名()调用函数,括号内为传入
    

    28.274333882308138
    当函数体只有一行时,可以置于def语句同一行。

    def for_multi(x,y): print(x*y)#函数定义
    for_multi(10,12)#调用函数
    

    120


    2、编写函数说明文档

    说明文档置于函数开头处,作为函数的一部分存储起来,通过函数名.__doc__可查看说明文档。

    def s_circle(r):
        "compute the circular area with radius"#函数说明文档内容
        S = math.pi*r*r
        return S
    s_circle.__doc__#函数__doc__属性存储函数说明文档
    

    'compute the circular area with radius'


    3、函数参数

    形参和实参区别

    • 形参:定义函数时,函数名称后面括号里的内容为形参;
    • 实参:调用函数时,括号里的内容为实参。
    def hello2sb(sb):#括号内为传入的参数,此处sb为形参。
         print("Hello %s!"%sb.title())
    hello2sb("jack") #此处jack为调用hello2sb的实参,是调用函数时传递给函数的信息。 
    

    Hello Jack!

    位置实参

    调用函数时按照形参的顺序关联实参。

    def des_sb(name,provice):
        """describe sb"""
        print("%s comes from %s."%(name.title(),provice.title()))
    #title函数返回标题化字符,单词的开头为大写,其余为小写
    des_sb("cao","anhui")
    

    Cao comes from Anhui.

    关键字实参

    形参=实参传递参数,无需考虑实参顺序。

    def des_sb(name,provice):
        """describe sb"""
        print("%s comes from %s."%(name.title(),provice.title()))
    #无需考虑输入实参顺序,以下两种输出一样
    des_sb(name = "cao",provice = "anhui")
    des_sb(provice = "anhui",name = "cao")#颠倒实参顺序
    

    Cao comes from Anhui.
    Cao comes from Anhui.

    默认实参

    定义函数时,给形参一个默认值,调用函数时若提供了实参则使用提供值,否则使用默认值。

    def des_sb(name,provice,dynasty="Three Kingdoms Era"):#定义时形参dynasty指定默认值
        """describe sb"""
        print("%s comes from %s of %s."%(name.title(),provice.title(),dynasty))
    des_sb(name = "cao",provice = "anhui")#形参此处未指定实参,调用默认值
    des_sb(name = "cao",provice = "anhui",dynasty = "Qin")#dynasty指定实参,使用实参
    

    Cao comes from Anhui of Three Kingdoms Era.
    Cao comes from Anhui of Qin.

    注意:以上三种参数传递方式可以混用,自己最容易理解的调用方式即可。

    让实参可选

    指定形参默认值为空字符串,放到所有形参最后,则该形参可空(可以提供实参也可以不用)。

    def return_fullname(firstname,lastname,middlename=""):
        """Show fullname"""
        if middlename:
            fullname = " ".join((middlename.title()+""+lastname,firstname.title()))
        else:
            fullname = " ".join((lastname.title(),firstname.title()))
        return fullname#返回fullname
    #调用函数
    fullname = return_fullname(firstname = "cao",lastname = "cao")#middlename形参为空
    fullname1 = return_fullname(firstname = "cao",middlename = "meng",lastname = "de")
    print(fullname)
    print(fullname1)
    

    Cao Cao
    Mengde Cao

    传递任意数量的实参

    定义函数时使用:*形参名称。

    def known_tangera(*heros):#星号(*)使得Python将所有实参存入heros元组中
        """show known heros in tang"""
        print(heros)
    known_tangera("yuanba li","shiming li")
    known_tangera("yuanba li","shiming li","cheng nuo")
    

    ('yuba li', 'shiming li')
    ('yuba li', 'shiming li', 'cheng nuo')

    结合使用位置实参和任意数量实参

    在函数定义中将接纳任意数量实参的形参(*形参名)放在最后.。

    def make_pizza(size, *toppings):
        """概述要制作的比萨"""
        print("\nMaking a " + str(size) + "-inch pizza with the following toppings:")
        for topping in toppings:#toppings元组存储任意数量的实参
            print("- " + topping)
    make_pizza(16, 'pepperoni')
    make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
    

    Making a 16-inch pizza with the following toppings:

    - pepperoni

    Making a 12-inch pizza with the following toppings:

    - mushrooms -

    - green peppers

    - extra cheese

    使用任意数量的关键字实参

    定义函数时使用: **形参名称。

    def build_profile(first, last, **user_info):
        #形参**user_info 中的两个星号让Python创建一个名为user_info 的空字典, 
        #并将收到的所有名称—值对都封装到这个字典中。
        """创建一个字典, 其中包含我们知道的有关用户的一切"""
        profile = {}
        profile['first_name'] = first
        profile['last_name'] = last
        for key, value in user_info.items():
            profile[key] = value
        return profile
    #传递
    user_profile = build_profile('albert', 'einstein',
                                 location='princeton',
                                 field='physics')
    print(user_profile)
    

    {'first_name': 'albert', 'last_name': 'einstein', 'location': 'princeton', 'field': 'physics'}


    4、函数返回值

    在函数中, 可使用return 语句将值返回到调用函数的代码行。

    将函数存储在模块中并导入新程序中

    将函数存储在被称为模块的独立文件(模块可以理解为以.py结尾的文件)中,再将模块导入到主程序中。 import 语句允许在当前运行的程序文件中使用模块中的代码。导入模块的方法有多种, 下面对每种都作简要的介绍

    • 导入整个模块

    下面创建pizza模块,pizza.py:

    def make_pizza(size, *toppings):
        """概述要制作的比萨"""
        print("\nMaking a " + str(size) +
              "-inch pizza with the following toppings:")
        for topping in toppings:
            print("- " + topping)
    
    • 在pizza.py所在的目录中创建另一个名为making_pizzas.py的模块:
    import pizza#导入pizza模块
    #让Python打开文件pizza.py,并将其中的所有函数都复制到这个程序中。
    #本程序可以使用pizza.py中定义的所有函数。
    pizza.make_pizza(16, 'pepperoni')#调用pizza模块中make_pizza函数
    pizza.make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
    

    Making a 16-inch pizza with the following toppings:

    - pepperoni

    Making a 12-inch pizza with the following toppings:

    - mushrooms

    - green peppers

    - extra cheese

    • 导入模块特定的函数

    从module_name模块中导入任意数量函数,函数之间逗号分割。

    from module_name import function_0, function_1, function_2

    making_pizzas.py

    from pizza import make_pizza#只导入pizza模块中的make_pizza函数
    make_pizza(16, 'pepperoni')#调用pizza模块中make_pizza函数
    make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
    
    • 导入模块中的所有函数

    使用星号(* ) 运算符可让Python导入模块中的所有函数。

    from pizza import *#导入pizza模块所有函数
    make_pizza(16, 'pepperoni')
    make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
    
    • 使用as 给函数指定别名
    from pizza import make_pizza as mp#函数别名mp
    mp(16, 'pepperoni')
    mp(12, 'mushrooms', 'green peppers', 'extra cheese')
    
    • 使用as 给模块指定别名
    import pizza as p#模块别名p
    p.make_pizza(16, 'pepperoni')
    p.make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese'
    
    

    参考资料

    Python编程:从入门到实践Python基础教程(第3版)


    欢迎关注公众号,干活不迷路:

    干货,真香

    相关文章

      网友评论

        本文标题:python3基础07函数(自定义)

        本文链接:https://www.haomeiwen.com/subject/mmwplktx.html