python基础(6)— 函数

1、函数分类

函数是具有一定功能的程序代码块,可以被反复使用,拓展:函数式编程

Python中函数可分为如下几类:

  • 内置函数,Python解释器自带的函数,可以直接使用,查看方式 dir('__builtins__')。
  • 自定义函数,用户自己定义的函数,根据实际需要实现某些功能,可以重复使用。如编写一个登录功能的函数。
  • 嵌套函数,在一个函数内部定义另一个函数。
  • 闭包函数,在一个函数中定义一个函数,外函数的返回值是内函数,内函数可以引用外函数的变量和外部变量。
  • 装饰器函数,闭包的一种,可以拓展被装饰函数的功能。
  • 匿名函数,也称为 lambda 表达式,是一种简化函数定义的方法,主要用于实现一些简单的功能。
  • 高阶函数,函数作为另一个函数的参数或者返回值,这种函数称为高阶函数。例如,map()、filter()、reduce() 等函数。
  • 回调函数,将一个函数作为参数传递给另一个函数,在另一个函数中调用该参数函数实现特定的功能。回调函数常用于异步编程、事件处理和GUI编程等场景。
  • 返回函数,一个函数的返回值是另一个函数。返回函数通常用于函数的嵌套,使代码更加灵活。
  • 递归函数,在函数的定义中调用函数本身,通常用于解决一些包含重复子问题的计算问题,比如阶乘、斐波那契数列等。
  • 偏函数,固定原函数中某些参数后生成一个新的函数,新函数可以忽略掉被固定的参数,只需要传入其他的参数即可。

详见:函数分类

2、自定义函数

(1)自定义函数的语法格式如下:

def 函数名([参数列表]):

        expression

        [return]

说明:

  • 关键字def:定义函数的时候必须的关键字
  • 函数名(): 函数名,后面必须带小括号()
  • [参数列表] : 函数的参数列表,形参,可以为空,也可以有多个参数,多个参数之间使用","分割
  • expression:函数体,实现函数功能的具体代码
  • [return] :可选参数,后面跟着函数的返回值,可以有返回值,也可以没有返回值,视实际情况而定 

示例:定义一个无参数的函数,使用占位符pass,表示这是一个空函数,没有任何功能,返回值None。

def fun():
    pass

(2)在Python中设计自定义函数时,应遵循以下设计原则:

- 单一职责原则(Single Responsibility Principle):每个函数只应该完成一个单一的功能。

- 开放封闭原则(Open-Closed Principle):函数应该对修改封闭,对扩展开放。

- 可读性和可维护性原则:代码应该被设计为易读,可理解和可维护的。

- 参数要简单和易于使用:函数参数应该尽可能地简单,易于使用,并且简单易记。

- 装饰模式应用:装饰模式可用于在不修改函数代码的情况下扩展函数的功能。

- 重构原则:重构代码以提高其可读性,可理解性和可维护性。

- 规范命名规则:函数,变量和参数的命名应该符合Python PEP 8规范。

- 注释清晰:函数代码应该有清晰的注释,以增加代码可读性。

3、调用函数

调用函数的语法格式:

函数名([实参])

说明:

  • 即便函数没有参数,调用函数的时候,函数名后的小括号也不能省略。 
  • 调用函数的时候,传参必须是实参,且实参的数量和位置必须跟形参保持一致。
  • 调用函数的时候,位置参数在前,关键字参数在后。

示例:调用前面定义的fun函数,返回None。

fun()
-----------------------------------------------------------------------
None

注意:fun和fun()区别

  • fun 指的是函数对象本身,指向内存地址
  • fun() 指的是调用函数
def fun():
    pass


print(fun)
print(fun())
--------------------------------------------------------------------------
<function fun at 0x000001577C5571F0>
None

4、函数返回值

Python函数中使用关键字return返回函数的返回值,记住任何时候,只要执行了return语句就一定会退出函数。返回值可以为空、一个值,多个值。返回值类型可以是任意类型,如表达式等。

语法格式如下:

return [返回值]

def fun():
    return

print(fun())
------------------------------------------------------------------------
None

5、函数参数类型

Python函数的参数可以分为位置参数和关键字参数,函数可以没有参数,也可以有多个参数。

  • 形参:定义函数时的参数,如定义函数def func(a,b)的参数a,b是形参。
  • 实参:调用函数时参数的值,如调用函数func(2,3)的参数2,3是实参。
  • 默认参数:定义函数时,为形参提供默认值,默认参数必须在最右端。 调用函数的时候如果没有传入实参,则取默认参数。如果传入实参,则取实参。
  • 位置参数:调用函数时传入实际参数的数量和位置都必须和定义函数时保持一致。
  • 关键字参数:调用函数的时候使用的是键值对的方式,key=values。混合传参时关键字参数必须在位置参数之后。
  • 可变参数

详见:位置参数和关键字参数

6、函数和方法的区别

函数(function)和方法(method)都是Python编程中的重要概念,但它们的含义略有不同。

(1)Python中的函数是一个独立的代码块,可以直接调用。可以接受任意参数类型。

例如:

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

result = add(3, 4)
print(result)

在这个例子中,`add`是一个函数,它接受两个参数`a`和`b`,并返回它们的和。我们传入参数`3`和`4`,得到返回值`7`,并把结果存储在`result`变量中。

(2)Python中方法是一个定义在类(对象)中的函数,只能通过对象进行调用。第一个参数"self"表示对象本身。

例如:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def say_hello(self):
        print("Hello, my name is", self.name, "and I am", self.age, "years old.")

person = Person("John", 25)
person.say_hello()

在这个例子中,`Person`是一个类,它有两个属性`name`和`age`,以及一个方法`say_hello`。我们通过实例化`Person`类来创建一个名为`person`的对象,然后调用`person`对象的`say_hello`方法,打印消息:"Hello, my name is John and I am 25 years old."。

7、变量和作用域

Python作用域指的是变量的生命周期以及其可被访问的范围。

(1)Python作用域分为四类:

  • 局部作用域(local):定义在函数内部的变量拥有局部作用域,意味着它们只能在函数内被访问。当函数执行完成后,变量将会被销毁。
  • 嵌套作用域(enclosed):对于在函数内部的函数,内层函数可以访问外层函数的变量,但是不包括全局作用域中的变量。
  • 全局作用域(global):定义在函数外部的变量拥有全局作用域,意味着它们可以在模块的任何地方被访问。
  • 内置作用域(built-in):Python解释器内置的函数和变量,在任何地方都可以使用。

(2)根据Python作用域的不同又可以把变量分为:

  • 全局变量(global variable):定义在函数或类外部,作用域为整个模块,可被模块内的所有函数和方法访问。
  • 局部变量(local variable):定义在函数或类内部,作用域只限于当前函数或方法内部,外部无法访问。
  • 自由变量(nonlocal variable):局部变量的一种,定义在嵌套函数中,且被内函数引用的变量,需要使用nonlocal关键字。

(3)变量的查找顺序遵循LEGB原则:

  • Python解释器会从当前作用域开始查找这个变量,按照局部作用域>>嵌套作用域>>全局作用域>>内置作用域的顺序查找,如果查找到最外层的内置作用域也找不到,Python将引发一个NameError异常。

(4)使用关键字global和nonlocal来改变变量的作用域:

详见: 命名空间和作用域

8、文档字符串

文档字符串,用来给自定义函数添加描述信息,方便自己和他人清楚的知道该函数的功能和用法。

以下是有关文档字符串的内容和格式的一些约定:

  • 文档字符串的位置在函数名和函数体之间的三引号里。
  • 第一行应该是对函数的简要概述。这一行应以大写字母开头,以句点结尾。
  • 第二行应为空白,后面几行应该是一个或多个段落,描述函数的调用约定,副作用等。

(1)给函数添加描述信息

def my_function():
    """
    Do nothing, but document it.

    No, really, it doesn't do anything.
    """
    pass

(2)使用对象的__doc__属性查看函数的描述信息

print(my_function.__doc__)
-------------------------------------------------------------------------

    Do nothing, but document it.

    No, really, it doesn't do anything.
    

(3)也可以使用help()函数打印帮助文档:

print(help(my_function))
-------------------------------------------------------------------------
Help on function my_function in module __main__:

my_function()
    Do nothing, but document it.
    
    No, really, it doesn't do anything.

None

详见:PEP 257 Docstring Conventions

9、类型提示和静态类型检查器

类型提示(Type Hints)也叫函数标注,函数注解,元数据。是用来给变量,函数参数和函数返回值添加数据类型标注,方便他人理解你的代码,也可以将类型提示写入存根文件(.pyi文件),这样静态类型检查器就可以通过存根文件来做静态类型检查,在你编写代码的阶段就给出错误的类型提示。

下面是一个给函数添加类型提示的简单例子:

def greeting(name: str) -> str:
    return 'Hello ' + name

说明:

name: str 表示参数name的类型为str,注意:后面有个空格

-> str 表示函数返回值类型为str。

详见:类型提示和存根文件


reference:

定义函数 — Python 3.8.16 文档

Python函数大全及9种函数类型详解 - Python自学网

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值