一篇文章带你深入学习Python函数

目录
  • 函数的特性:
    • 函数是对象:
    • 函数可以删除:
  • 总结

函数的特性:

  • 函数是对象
  • 函数可以删除
  • 函数名字和函数本身完全是分开的
  • 函数因为是对象,可以结合数据结构使用
  • 函数因为是对象,可以作为函数参数
  • 函数因为是对象,可以在嵌套在函数体内
  • 内层函数对象能够记忆住父函数的变量
  • 所有的函数都是对象,但是所有的对象并不一定都是函数

对象成为函数需要实现__call__协议

函数是对象:

# 函数是对象:支持赋值操作。
def test1(n):
    print(f"hello, {n}!")

# test1的函数名赋值给 new1
new1 = test1
new1("tom") # hello, tom!

函数可以删除:

# 函数可以删除
def test2(n):
    print(f"hello, {n}!")
del test2
# test2("tom") # NameError: name 'test2' is not defined

函数名字和函数本身完全是分开的:删除test3,不影响已经赋值的new3的调用

# 函数名字和函数本身完全是分开的:删除test3,不影响已经赋值的调用
def test3(n):
    print(f"hello, {n}!")

new3 = test3
del test3
new3("Jam") # hello, Jam!

函数因为是对象,可以结合数据结构使用:

# 函数因为是对象,就可以结合数据结构使用
def test4(n):
    print(f"hello, {n}!")

data = [1, "a", {"name": "tom"}, test4]
for i in data:
    from types import FunctionType
    if type(i) == FunctionType:
        test4("Lily")  # hello, Lily!

函数因为是对象,可以作为函数参数:

# 函数因为是对象,就可以作为函数参数
def test5(n):
    print("原始函数执行")
    print(f"hello, {n}")

def new5(n):
    n("Golang")

new5(test5)  # 原始函数执行  hello, Golang

函数因为是对象,可以在嵌套在函数体内:

# 函数因为是对象,可以在嵌套在函数体内
def test6(n):
    def inner1(m):
        new = m + "!!!"
        return new
    def inner2(m):
        new = m + "***"
        return new
    if n > 3:
        return inner2
    else:
        return inner1

result6 = test6(3)
print(result6("tom"))  # tom!!!

内层函数对象能够记忆住父函数的变量:也称为闭包

# 内层函数对象能够记忆住父函数的变量
def test7(n):
    def inner(m):
        return m + n
    return inner

result7 = test7(7)
print(result7(6))  # 13

所有的函数都是对象,但是所有的对象并不一定都是函数:

# 所有的函数都是对象,但是所有的对象并不一定都是函数
class A:
    pass

a = A()

def test8():
    pass

from types import FunctionType
print(isinstance(a, A))  # True
print(isinstance(test8, FunctionType))  # True
print(isinstance(a, FunctionType))  # False  所有的对象并不一定都是函数

对象成为函数需要实现__call__协议:

# 对象成为函数需要实现__call__协议
class B:
    def __init__(self, n):
        self.n = n
    def __call__(self, m):
        return self.n + m

b = B(9)
print(b(9))  # 18

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • python基础学习之递归函数知识总结

    一.递归函数使用注意点 递归函数一定要编写终止条件,否则将产生无限递归.(死循环) 二.递归的效率问题 递归效率不高,递归层次过多会导致栈溢出. Python中不推荐使用递归. 三.递归函数引入 """ 使用代码循环输出故事:从前有座山,山里有座庙... """ # ------------while循环 (暂时忽略死循环)--------------- while True: print("从前有座山,山里有座庙...")

  • Python学习之str重要函数

    目录 一.6个非常重要的str处理词 二.重要的str处理 几乎所有的 数据类型里也都能用 1.提取字符串中 特定位置的字符 2.len 得到当前变量的字符串中有几个字符 3.range 创建连续的数字 总结 一.6个非常重要的str处理词 1.join添加分隔符号 其他类型的数据也可能用到这个 2.split 分割 3.find 查询匹配子序列位置 4.strip 去掉 5.upper 大写 6.lower 小写 7.replace 替换 二.重要的str处理 几乎所有的 数据类型里也都能用

  • 一篇文章带你学习python的函数与类

    目录 函数 模块 类 根据类创建实例 继承 总结 现在做的一个小项目需要用到python的相关知识,但是因为太久没用一些东西都忘掉了,因此在本篇博客中记录一下python的函数和类的基础知识,下次可以直接查阅,用的参考书是<Python编程从入门到实践> 函数 运用关键字def告诉Python要定义函数: def greet_name(): print("Hello!") 包含参数: def greet_name(username): print("Hello,

  • Python学习之函数 def

    目录 一.函数概述 二.函数的调用 三.函数参数的使用规则 1.位置参数 2.关键字参数赋值 3.位置参数和关键字参数混合使用 4.参数组 **字典  *列表 5.*列表 6.**字典 总结 一.函数概述 简单来说 函数 就是自己定义的一段 小程序 方便自己调取使用 def 用来定义函数的关键字 也就是这个函数的名字 函数运行到return的时候就会返回值 并且把函数内的参数全部清空 变量不再占用内存库空间 退出函数 函数的格式如下就是  #x是进入的参数,也可以不用输入值,因为函数里面全部的值

  • Python学习之字符串函数使用详解

    目录 1 搜索字符串函数 2 设置字符串格式函数 3 改变字符串大小写函数 4 选定字符串函数 5 拆分字符串函数 6 替换字符串函数 Python的友好在于提供了非常好强大的功能函数模块,对于字符串的使用,同样提供许多简单便捷的字符串函数.Python 字符串自带了很多有用的函数,在字符串函数之前先介绍一个非常实用的dir()内置函数,因为对每一个初学者还是大佬级别的python程序员,都不能完全记住所有方法.而该函数可以查看所有这些函数,可调用 dir 并将参数指定为任何字符串(如 dir(

  • Python基础学习之简单理解函数

    一.什么是函数 注意不要和数学中的函数搞混了 那么到底什么是函数呢? 函数其实就是当我们在程序中需要大量重复的代码块,我们将其封装成一个代码块,用一个名字来表示,而这个名字是标识符.需要遵循标识符的规则. 函数的优点就是避免了代码重复率,提高开发效率. 举个例子:我们需要让电脑给我们表白(骚话),输出一段情话,就比如这一段 "我爱你" "我要给你生猴子" "啊啊啊,好喜欢你" 按照之前所学,一个一个的print()就行了嘛 但是我需要你什么时候都

  • 一篇文章带你深入学习Python函数

    目录 函数的特性: 函数是对象: 函数可以删除: 总结 函数的特性: 函数是对象 函数可以删除 函数名字和函数本身完全是分开的 函数因为是对象,可以结合数据结构使用 函数因为是对象,可以作为函数参数 函数因为是对象,可以在嵌套在函数体内 内层函数对象能够记忆住父函数的变量 所有的函数都是对象,但是所有的对象并不一定都是函数 对象成为函数需要实现__call__协议 函数是对象: # 函数是对象:支持赋值操作. def test1(n): print(f"hello, {n}!") #

  • 一篇文章带你顺利通过Python OpenCV入门阶段

    目录 1. OpenCV 初识与安装 2. OpenCV 模块简介 3. OpenCV 图像读取,显示,保存 4. 摄像头和视频读取,保存 5. OpenCV 常用数据结构和颜色空间 6. OpenCV 常用绘图函数 7. OpenCV 界面事件操作之鼠标与滑动条 8. 图像像素.通道分离与合并 9. 图像逻辑运算 10. 图像 ROI 与 mask 掩膜 11. 图像几何变换 12. 图像滤波 13. 图像固定阈值与自适应阈值 14. 图像膨胀腐蚀 15. 边缘检测 16. 霍夫变换 17.

  • 一篇文章带你搞懂Python类的相关知识

    一.什么是类 类(class),作为代码的父亲,可以说它包裹了很多有趣的函数和方法以及变量,下面我们试着简单创建一个吧. 这样就算创建了我们的第一个类了.大家可以看到这里面有一个self,其实它指的就是类aa的实例.每个类中的函数只要你不是类函数或者静态函数你都得加上这个self,当然你也可以用其他的代替这个self,只不过这是python中的写法,就好比Java 中的this. 二.类的方法 1.静态方法,类方法,普通方法 类一般常用有三种方法,即为static method(静态方法),cl

  • 一篇文章带你搞定Python多进程

    目录 1.Python多进程模块 2.Python多进程实现方法一 3.Python多进程实现方法二 4.Python多线程的通信 5.进程池 1.Python多进程模块 Python中的多进程是通过multiprocessing包来实现的,和多线程的threading.Thread差不多,它可以利用multiprocessing.Process对象来创建一个进程对象.这个进程对象的方法和线程对象的方法差不多也有start(), run(), join()等方法,其中有一个方法不同Thread线

  • 一篇文章带你入门C语言:函数

    目录 函数 定义 库函数 定义 介绍 Example 1 strcpy Example 2 memset 自定义函数 Example 1 Example 2 两数交换 链式访问 Example 1 函数声明 函数递归 Example 1 Example 2 函数迭代 Example 3 Example 4 总结 函数 定义 程序里的函数又被叫做子程序,他作为一个大型程序的部分代码,有一或多个语句项组成.函数负责完成某项特定任务,提供了对过程的封装和对细节的隐藏,这样的代码通常会被集成为软件库.

  • 一篇文章带你详细了解python中一些好用的库

    目录 时间库-arrow 使用背景 安装arrow arrow使用 游标卡尺shift 获取arrow对象 arrow的类型转换和时区修改 总结 时间库-arrow 使用背景 日期时间处理在实际应用场景中无处不在,所以这也成了编程语言中必不可少的模块,Python 也不例外.但是,你知道在Python中有多少个相关的模块吗?datetime.time.calendar. dateutil. pytz 等等. 你知道有多少种数据类型吗?date.time.datetime.tzinfo.timed

  • 一篇文章带你了解C语言函数的可重入性

    目录 一.不可重入函数. 二.可重入函数. 三.如何写出可重入的函数 四.函数的可重入性和线程安全的关系 五.malloc和printf为什么不可重入 总结 一.不可重入函数. 在函数中如果我们使用静态变量了,导致产生中断调用别的函数的 过程中可能还会调用这个函数,于是原来的 静态变量被在这里改变了,然后返回主体函数,用着的那个静态变量就被改变了,导致错误.这类函数我们称为不可重入函数. 在 嵌入式系统的设计中,经常会出现多个任务调用同一个函数的情况.如果这个函数不幸被设计成为不可重入的函数的话

  • 一篇文章带你了解C语言函数递归

    目录 什么是递归? 递归的两个必要条件 递归实例 实例1(按照顺序打印一个数的整形值) 画图讲解 完整代码 实例2 (使用函数在不创建变量的情况下求字符串长度) 画图讲解 程序运行结果 完整代码 递归与迭代 实例1 (求n的阶乘) 方法一(使用递归) 方法二(使用迭代) 实例2 (求解斐波那契数列) 方法一 (递归求解) 方法二(迭代求解) 总结 什么是递归? 递归(recursion):程序调用自身的一种编程技巧. 如何理解函数递归: 1.从调用自身层面:函数递归就是函数自己调用自己. 2.从

  • 一篇文章带你吃透Vue生命周期(结合案例通俗易懂)

    目录 1.vue生命周期 1.0_人的-生命周期 1.1_钩子函数 1.2_初始化阶段 1.3_挂载阶段 1.4_更新阶段 1.5_销毁阶段 2.axios 2.0_axios基本使用 2.1_axios基本使用-获取数据 2.2_axios基本使用-传参 2.3_axios基本使用-发布书籍 2.4_axios基本使用-全局配置 3.nextTick和refs知识 3.0$refs-获取DOM 3.1$refs-获取组件对象 3.2$nextTick使用 3.3$nextTick使用场景 3.

  • 一篇文章带你彻底搞懂VUE响应式原理

    目录 响应式原理图 编译 创建compile类 操作fragment 获取元素节点上的信息 获取文本节点信息 操作fragment 响应式 数据劫持 收集依赖 响应式代码完善 Dep类 全局watcher用完清空 依赖的update方法 需要注意的一个地方 双剑合璧 总结 首先上图,下面这张图,即为MVVM响应式原理的整个过程图,我们本篇都是围绕着这张图进行分析,所以这张图是重中之重. 响应式原理图 一脸懵逼?没关系,接下来我们将通过创建一个简单的MVVM响应系统来一步步了解这个上图中的全过程.

随机推荐