当前位置: 首页 > java >正文

Python 函数全攻略:函数进阶(生成器、闭包、内置函数、装饰器、推导式)

一、默认参数中的易错点

  • 问题: 当函数的默认参数是可变类型(如 list, dict)时,存在“坑”。

  • 现象:

    def func(a2=[]): # a2 默认是一个空列表a2.append(2)print(a2)func() # 第一次调用,a2 默认为 [],输出 [2]
    func([]) # 传入新列表,输出 [2]
    func([1]) # 传入带元素的列表,输出 [1, 2]
    func() # 再次调用 func(),a2 仍指向第一次创建的那个列表,输出 [2, 2]
    
  • 原因:

    • 函数定义时,默认参数的可变对象只创建一次,并被该参数引用。

    • 当函数调用时未传递该默认参数,它会一直使用并修改第一次创建的那个可变对象。

    • 当函数调用时传递了该默认参数,它会使用传入的值,不影响原始默认对象。

    • 不可变类型int, str, tuple)则无此问题,因其“修改”会生成新对象,不影响原默认值。


二、内置函数(Functions)

Python内置函数丰富,以下分组介绍常用和重要部分:

  1. 数值计算类 (5个):

    • abs(x): 求绝对值。

    • pow(base, exp): baseexp 次方 (等同于 base ** exp)。

      • 示例: pow(2, 5) -> 32

    • sum(iterable): 对可迭代对象中的数字求和。

      • 示例: sum([1, 2, 3]) -> 6

    • divmod(dividend, divisor): 返回商和余数的元组 (商, 余数)

      • 示例: divmod(98, 10) -> (9, 8)

      • 应用场景: 分页计算(总页数 = 商 + (1 if 余数 > 0 else 0))。

    • round(number, ndigits=None): 四舍五入,ndigits 指定小数位数。

      • 示例: round(3.1415926, 2) -> 3.14;round(3.147, 2) -> 3.15

  2. 序列操作与布尔判断类 (4个):

    • min(iterable): 获取可迭代对象中的最小值。

    • max(iterable): 获取可迭代对象中的最大值。

    • all(iterable): 判断可迭代对象中所有元素布尔值为 True 才返回 True,否则返回 False(空可迭代对象返回 True)。

      • 示例: all([1, 'hello', True]) -> Trueall([1, 0, True]) -> False

      • 应用: 校验多条件(如用户名密码非空)。

    • any(iterable): 判断可迭代对象中任一元素布尔值为 True 就返回 True,否则返回 False(空可迭代对象返回 False)。

      • 示例: any([0, '', False, 1]) -> Trueany([0, '', False]) -> False

  3. 进制转换类 (4个):

    • 核心: 计算机底层是二进制,其他进制(八进制、十进制、十六进制)为方便人类表示。

    • 转换路径: 二进制/八进制/十六进制 <-> 十进制 (必须通过十进制中转)。

    • Python表示:

      • 十进制:普通整数 90

      • 二进制:0b 前缀字符串 0b1011010

      • 八进制:0o 前缀字符串 0o132

      • 十六进制:0x 前缀字符串 0x5a

    • 转换函数:

      • bin(decimal): 十进制转二进制字符串(带0b前缀)。

      • oct(decimal): 十进制转八进制字符串(带0o前缀)。

      • hex(decimal): 十进制转十六进制字符串(带0x前缀)。

      • int(string, base=None): 将字符串(或其他类型)转为十进制整数。base 参数指定字符串的进制(2, 8, 16等),若无base则自动推断。

        • 示例: int('0b1011010', base=2) -> 90;int('0o132', base=8) -> 90;int('0x5a', base=16) -> 90

    • 面试题: 将IP地址 (192.168.11.23) 转换为二进制字符串,再转换为整体十进制数。

      • 思路:

        1. IP按 . 分割成四个字符串数字。

        2. 遍历每个字符串数字:

          • 转为整数 (十进制)。

http://www.xdnf.cn/news/12606.html

相关文章:

  • 6.6并发编程
  • 引起MySQL CPU 使用率过高常见因素和解决方案
  • Svelte 核心语法详解:Vue/React 开发者如何快速上手?
  • LeetCode刷题 -- 542. 【01 矩阵】最短距离更新算法实现(双向DP)
  • 粤龙庄新文化解释:龙腾南粤,酱蕴山河
  • 计算机网络第2章(下):物理层传输介质与核心设备全面解析
  • 手机号段数据库与网络安全应用
  • Java应用Flink CDC监听MySQL数据变动内容输出到控制台
  • 家政小程序开发——AI+IoT技术融合,打造“智慧家政”新物种
  • 腾讯 ovCompose 跨平台框架发布,几年后还会有人用吗?
  • VScode 使用 git 提交数据到指定库的完整指南
  • TensorFlow深度学习实战(20)——自组织映射详解
  • 【Java开发日记】说一说 SpringBoot 中 CommandLineRunner
  • PyTorch 中contiguous函数使用详解和代码演示
  • 第4章——springboot自动配置
  • LabVIEW音频测试分析
  • ​React Hooks 的闭包陷阱问题
  • YoloV12改进策略:Block改进|TAB,融合组内自注意力(IASA)和组间交叉注意力(IRCA)|即插即用
  • spring:实例工厂方法获取bean
  • 408考研逐题详解:2009年第33题
  • 第22讲、Odoo18 QWeb 模板引擎详解
  • 【PCIe总线】 -- PCI、PCIe相关实现
  • 第十五届蓝桥杯单片机国赛
  • SQL-labs通关(level1-22)
  • 主流信创数据库对向量功能的支持对比
  • Vue Fragment vs React Fragment
  • Mysql-定时删除数据库中的验证码
  • Golang基础学习
  • 性能测试-jmeter实战2
  • 注意力热图可视化