开发者

Python中如何自定义函数

开发者 https://www.devze.com 2023-01-05 09:23 出处:网络 作者: 棉猴
目录python自定义函数自定义函数的语法自定义函数的实现自定义函数的调用Python自定义函数基础概念函数定义语法函数文档字符串函数定义规则形参定义方式函数调用函数调用时参数的传递形式全局变量与局部变量函数的功
目录
  • python自定义函数
    • 自定义函数的语法
    • 自定义函数的实现
    • 自定义函数的调用
  • Python自定义函数基础概念
    • 函数定义语法
    • 函数文档字符串
    • 函数定义规则
    • 形参定义方式
    • 函数调用
    • 函数调用时参数的传递形式
    • 全局变量与局部变量
    • 函数的功能性
    • 函数式编程
    • 函数的 可重入性(结果唯一性)
  • 总结

    Python自定义函数

    在Python编程中,可以使用已经定义好的函数,也可以自定义函数实现某些特殊的功能。

    自定义函数的语法

    在Python中,自定义函数的语法如下所示

    def 函数名(参数):

     

      函数体

    其中,def是关键字;之后跟的是函数名,通过函数名来调用该函数;函数名之后是一个python圆括号,圆括号内部是函数的参数,通过参数可以将数据传递到函数内部;函数体是函数实现的功能。

    需要注意的是(1)在圆括号之后有冒号(2)函数体要有缩进。

    自定义函数的实现

    图1的代码中代码自定义了一个名为func的函数。

    Python中如何自定义函数

    图1 自定义函数func

    其中,该自定义函数的函数名是func,i是func的参数。func()函数的功能是打印出从0到i-1的数字,i的值由外部传递到函数内部。

    自定义函数的调用

    通过图2中的代码调用自定义函数func()。

    Python中如何自定义函数

    图2 调用func()函数

    其中,func()函数的参数设置为3,此时输出的是0-2的数字;修改func()的参数值,如图3所示。

    Python中如何自定义函数

    图3 修改func()函数的参数值

    此时输出的是0-4的数字。

    Python自定义函数基础概念

    函数定义语法

    def 函数名(形参列表):

    语句块

    函数定义语句(def 语句) 的完整语法:

    [@装饰器1] [@装饰器2] [...]

    def 函数名([位置形参], [*元组形参], [命名关键字形参], [**字典形参]):

    '''文档字符串'''

    语句块

    注: [] 中括号代表其内部可以省略

    函数文档字符串

    函数内第一次未被赋值给任何变量的字符串是此函数的文档字符串。

    说明:

    1. 文档字符串通常用来说明本函数的功能和使用方法

    2. 在交互模式下输入: help(函数名) 可以查看函数的'文档字符串'

    3. 函数的文档字符串绑定在函数的 __doc__ 属性上

    函数定义规则

    1. 函数的名字就是语句块的名称 

    2. 函数名的命名规则python与变量名相同(函数名必须是标识符) android;

    3. 函数名是一个变量(不要轻易对其赋值)

    4. 函数有自己的名字空间,在函数外部不可以访问函数内部的变量,在函数内可以访问函数外部的变量,但不能修改此变量。

    5. 函数如果不需要传入参数,形参列表可以为空

    6. 语句块部分,内容不能为空,如果为空需要填充pass 

    形参定义方式

    形参:函数调用时,接收调用时传递的数据

    【1】位置形参

    【2】关键字形参

    【3】缺省参数

    def 函数名(形参名=默认实参1, 形参名2=默认实参2, ...):

    pass

    缺省参数必须自右至左依次存在,如果一个参数是缺省参数,则其右侧的所有参数都必须是缺省参数。

    【4】*args

    星号元组形参,收集多余的位置传参

    def 函数名(*元组形参名):

    pass

    【5】**kwargs

    双星号字典形参,收集多余的关键字传参

    def 函数名(**字典形参名):

    pass

    【6】不定长形参

    星号元组形参,双星号字典形参

    可以接受任意的位置传参和关键字传参

    def fun(*args,**kwargs):

    pass

    位置形参,缺省参数,星号元组形参,双星号字典形参可以混合使用.

    函数形参自左至右的顺序为:

    • 位置形参
    • 星号元组形参
    • 命名关键字形参
    • 双星号字典形参

    函数调用

    函数名(实参)

    注:

    1. 函数调用是一个表达式

    2. 如果函数内部没有return语句,函数调用完毕后返回None对象

    3. 如果函数需要返回其它的对象需要用到 return 语句

    4.函数名是一个变量,绑定的是函数对象

    函数调用时参数的传递形式

    【1】位置传参

    实参和形参的位置对应,将实参数据传递给函数形参。

    实参和形参按位置一一对应。

    实参个数和形参个数必须一致。

    【2】序列传参

    位置传参的一种。

    用 * 将序列拆解后按位置进行传递的传参方式

    【3】关键字传参

    按形参的名称将实参数据传递给形参。

    实参和形参按形参名称匹配。

    【4】字典关键字传参

    实参为字典,将字典用编程客栈 '**' 拆解后再进行关键字传参的传参方式。

    字典的键名必须和形参一致,切数量相同。

    字典的键必须为字符串。

    全局变量与局部变量

    【1】全局变量

    ① 定义在函数外部,模块内部的变量称为全局变量

    ② 全局变量所有函数都可以直接访问(但函数内不能将其直接赋值)

    【2】局部变量

    ① 定义在函数内部的变量称为局部变量(函数的形参也是局部变量)

    ② 局部变量只能在函数内部使用

    ③ 局部变量在函数调用时才能够被创建,在函数调用之后会自动销毁开发者_JAVA开发

    函数的功能性

    ① 一个函数可以作为另一个函数调用时的实参,传递给此函数

    def f1():
        print("f1被调用")
    
    def f2():
        print("f2被调用")
    
    def fx(fn):
        print(fn)
        fn()  # 此时这是调用什么呢?
    
    fx(f1)
    fx(f2)
    #结果
    <function f1 at 0x7f7a52ed6f28>
    f1被调用
    <function f2 at 0x7f7a51757c80>
    f2被调用
    
    #---------------------
    def goodbye(L):
        for x in L:
            print("再见:", x)
    
    def hello(L):
        for x in L:
            print("你好:", x)
    
    def operator(fn, L):
        fn(L)
    
    operator(hello, ['Tom', 'Jphperry', 'Spike'])
    
    #结果
    你好: Tom
    你好: Jerry
    你好: Spike

    ② 一个函数可以作为另一个函数的返回值 

    def fx():
        return max
    
    fn = fx()
    print(fn([1, 3, 5, 7]))
    
    #结果
    7

    ③ 函数可以嵌套

    函数式编程

    用一系列函数解决问题。

    优点:

    【1】用每一个函数完成细小的功能,一系列函数的任意组合可以完成大问题 

    【2】函数仅接受输入并产生输入,不包含任何能影响输出的内部状态

    要求:

    def 语句创建的函数最好不要访问局部作用域以外的变量,这样可以保证返回结果的唯一性(可重入性)

    函数的 可重入性(结果唯一性)

    如果一个函数的输入参数一定,则返回结果必须一定的函数称为可重入函数 

    【1】 可重入函数,传入参数一定.结果必然一定 

    def myadd(x, y):
    
    return x + y

    【2】不可重入函数: 

    y = 200
    
    def myadd2(x):
    
    return x + y
    
    print(myadd2(10)) # 210
    
    y = 300
    
    print(myadd2(10)) # 310

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消