最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

天天热门:Python基础之函数

来源:博客园


【资料图】

目录
  • Python基础之函数
    • 一、函数相关的基础知识
      • 1.函数的语法结构
      • 2.函数的定义与调用
      • 3.函数的分类
      • 4.函数的返回值
      • 5.函数的参数
      • 6.名称空间
      • 7.名字的查找顺序以及实际案例
      • 8.global与nonglobal
      • 9.函数名的多种用法
      • 10.闭包函数
    • 二、关于装饰器
      • 1.装饰器简介
      • 2.装饰器的模板(重点 务必掌握)
      • 3.关于语法糖
      • 4.递归函数
      • 5.匿名函数
      • 6.常见内置函数
      • 7.重要内置函数

Python基础之函数

​关于函数定义首先说一下循环吧 循环就是相同的代码在同一个位置反复执行而函数是相同的代码在不同的位置反复执行(相同的代码不是真正的一模一样而是可以通过传入不同的数据做出不同的改变)函数相当于工具(具有一定的功能) 什么时候想用就直接拿出来使用

一、函数相关的基础知识

1.函数的语法结构

def 函数名(参数):    """函数注释"""    函数体代码    return 返回值
def:定义函数的关键字函数名:命名等价于变量名参数:可有可无 主要是在使用函数的时候规定要不要外界传数据进来函数注释:类似于工具说明书函数体代码:是整个函数的核心 主要取决于程序员的编写return:使用函数之后可以返回给使用者的数据 可有可无

2.函数的定义与调用

"""函数必须先定义再调用 顺序不得乱"""函数的定义使用关键字def  # 定义阶段只检测语法不执行代码函数的调用函数名加括号  # 调用阶段才会执行函数体代码

3.函数的分类

# 1.空函数 函数体代码为空 用pass或···补全 在项目前期用来搭建框架def register():    """注册功能"""    pass
# 2.无参函数 定义函数的时候括号内没有参数def index():    print("from index function")
# 3.有参函数 定义函数的时候有参数 调用函数的时候需要括号传参数def func(a):    print(a)

4.函数的返回值

# 什么是返回值调用函数之后返回给调用者的结果# 如何获取返回值变量名 赋值符号 函数的调用res = func()  # 先执行func函数 然后将返回值赋值给变量res# 函数返回值的多种情况函数体代码中没有return关键字 默认返回None函数体代码有return 如果后面没有写任何东西还是返回None函数体代码有return 后面写什么就返回什么函数体代码有return并且后面有多个数据值 则自动组织成元组返回函数体代码遇到return会立刻结

5.函数的参数

# 形参与实参的关系形参类似于变量名 在函数定义阶段可以随便写 最好见名知意实参类似于数据值 在函数调用阶段与形参临时绑定 函数运行结束就立刻断开def register(username, password):  # username和password为形参    register(almira, 123)  # almira和123为实参    username与almira绑定password与123绑定
形式参数在函数定义阶段括号内填写的参数 简称"形参"实际参数在函数调用阶段括号内填写的参数 简称"实参"位置形参函数定义阶段括号内从左往右依次填写的变量名 eg:def func(a, b, c):pass位置实参函数调用阶段括号内从左往右依次填写的变量名 eg:func(1, 2, 3)默认参数本质就是关键字参数 提前给定 用户可传可不传可变长形参   *args  **kwargs 用来接受多余的关键字参数 组织成字典赋值给**后面的变量名可变长实参   在这里*类似于for循环 **可以将字典打散成关键字参数的形式传递给函数
# 关于这些参数需要注意以下几个点越短的越简单的越靠前越长的越复杂的越靠后默认参数也要遵循上面同一个形参在调用时不能多次赋值按照位置一一对应传值少一个多一个都不行

6.名称空间

# 名称空间的定义名称空间就是用来存储变量名与数据值绑定关系的地方(我们也可以简单的理解为就是存储变量名的地方)"""内置名称空间"""解释器运行自动产生 里面包含了很多名 eg:print input len    """全局名称空间"""py文件运行产生 里面存放文件级别的名字 eg: name = "almira"里面的name就是    """局部名称空间"""函数体代码运行时产生
# 名称空间的存活周期以及作用范围内置名称空间  Python解释器启动自动创建 关闭则自动销毁 解释器级别全局有效全局名称空间  py文件执行则自动创建 运行结束则自动销毁 py文件级别全局有效局部名称空间  函数体代码运行就创建 运行结束则自动销毁 函数体代码全局有效

7.名字的查找顺序以及实际案例

涉及到名字的查找 首先要搞明白自己在哪个空间 其实名字的查找顺序是可以打破# 在局部名称空间中的时候局部名称空间>>>全局名称空间>>>内置名称空间# 在全局名称空间中的时候全局名称空间>>>内置名称空间
1.相互独立的局部名称空间默认不能够互相访问 def func1():    name = "jason"    print(age)    def func2():       age = 18       print(name)2.局部名称空间嵌套先从自己的局部名称空间查找 之后由内而外依次查找"""函数体代码中名字的查找顺序在函数定义阶段就已经固定死了x = "干饭了"    def func1():        x = 1        def func2():            x = 2            def func3():                print(x)                x = 3            func3()        func2()    func1()"""

8.global与nonglobal

# global 局部名称空间直接修改全局名称空间中的数据money = 666def index():    global money    money = 123index()print(money)
# nonglobal 内层局部名称空间修改外局部名称空间中的数据 def index():    name = "jason"    def inner():        nonlocal name        name = "kevin"    inner()    print(name)index()

9.函数名的多种用法

函数名其实绑定的也是一块内存地址只不过该地址里面存放的不是数据值而是一段代码函数名加括号就会找到该代码并执行以下有四种函数名的用法·可以当做变量名赋值·可以当做函数的参数·可以当做函数的返回值·可以当做容器类型数据

10.闭包函数

什么是闭包函数?·定义在函数内部的函数·用到外部函数的名称空间中的名字闭包函数实际应用?·是另外一种给函数体代码传参的方式# 形如def outer():    print("from outer")    def inner():        print("from inner")        

二、关于装饰器

1.装饰器简介

# 概念在不改变被装饰对象原代码和调用方式的情况下给被装饰对象添加新的功能# 本质并不是一门新的技术 而是由函数参数、名称空间、函数名多种用法、闭包函数组合到一起的结果# 口诀对修改封闭 对扩展开放

2.装饰器的模板(重点 务必掌握)

def outer(func):    def inner(*args, **kwargs):        # 执行被装饰对象之前可以做的额外操作        res = func(*args, **kwargs)        # 执行被装饰对象之后可以做的额外操作        return res    return inner

3.关于语法糖

# 单层语法糖语法糖会自动将下面紧挨着的函数名当做第一个参数自动传给@函数调用# 多层语法糖加载顺序由下往上每次执行之后如果上面还有语法糖 则直接将返回值函数名传给上面的语法糖如果上面没有语法糖了 则变形 index = outter1(wrapper2)

4.递归函数

  1. 直接或者间接调用自己
  2. 每次调用都必须比上一次简单且需要有一个明确的约束条件
  3. 递归:一层层往下
  4. 回溯:基于明确的结果一层层网上

最大递归深度:其实就是python解释器添加的安全措施官网提供的最大递归深度为1000 实际测试的时候可能会出现996 997 998

def get_age(n):    if n == 1:        return 18    return get_age(n-1) + 2res = get_age(5)print(res)

5.匿名函数

函数定义没有名字的函数 需要使用关键字lambda匿名函数一般不单独使用 需要配合其他函数一起用语法结构lambda 形参:返回值使用场景lambda a,b:a+b

6.常见内置函数

map()  # 映射max()  # 最大值min()  # 最小值reduce()  # 传多个 返回一个值abs()  # 绝对值all()  # 所有数据值对应的布尔值为True结果才是True 否则返回Falseany()  # 所有数据值对应的布尔值有一个为True结果才是True 否则返回Falsebytes()  # 转换成bytes类型callable()  # 判断名字是否可以加括号调用chr(97)  # 基于ASCII码表做转换 数字转换字符ord("a")  # 基于ASCII码表做转换 字符转换数字dir()  # 返回括号内对象能够调用的名字 divmod()  # 元组 第一个数据为整除数 第二个是余数round()  # 四舍五入enumerate()  # 枚举eval()  # 能够识别字符串中的python并执行exec()  # python内置函数exec支持动态执行python代码hash()  # 哈希加密pow()  # 幂指数(次方)sum()  # 求和range()  # 能返回一系列连续添加的整数,能够生成一个列表对象open()  # 打开id()  # 用于获取对象的内存地址input()  # 获取用输入isinstance()  # 用来判断一个函数是否是一个已知的类型bin()  # 返回一个整数的二进制表示形式的字符串oct()  # oct() 函数将一个整数转换成 8 进制字符串hex()  # 将10进制整数转换成16进制,以字符串形式表示int()  # 将数字或者字符串转换成int类型数据

7.重要内置函数

zip()  # 打包成元组,返回列表,如果长度不一致,则与短的iterable对齐filter()  # 用于过滤序列,将满足条件的元素取出来构成新的序列sorted()  # 排序 默认是升序

关键词: 定义阶段 函数调用