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

【Python pro】函数

1、函数的定义及调用

1.1 为什么需要函数

  1. 提高代码复用性——封装
  2. 将复杂问题分而治之——模块化
  3. 利于代码的维护和管理

1.1.1 顺序式

n = 5
res = 1
for i in range(1, n+1):res *= i
print(res)
# 输出:120

1.1.2 抽象成函数

def factorial(n):res = 1for i in range(1, n+1):res *= ireturn resprint(factorial(5))
# 输出:120

1.2 函数定义及调用

  1. 白箱子:输入,处理,输出
  2. 三要素:参数、函数体、返回值

1.2.1 定义

模块——def 函数名(参数):
      函数体
      return 返回值

def area_of_square(n):area = pow(n, 2)return area

1.2.2 调用

模块——函数名(参数)

area = area_of_square(5)
print(area)
# 输出:25

1.3 参数传递

1.3.1 形参和实参

(1)形参:

函数定义时的参数,本质上是变量名

(2)实参:

函数调用时的参数,本质上是变量值

1.3.2 位置参数

  1. 要求:严格按照位置顺序,用实参对形参进行赋值
  2. 适用:通常在参数比较少时
  3. 注意:实参与形参个数必须一一对应,不多不少
def function(x, y, z):print(x, y, z)function(1, 2, 3)
# 输出:1 2 3
function(1, 2, 3, 4)
# 输出:TypeError: function() takes 3 positional arguments but 4 were given

1.3.3 关键字参数

  1. 模板:形参名=实参值
  2. 适用:通常在参数比较多时
  3. 要求:实参与形参必须一 一对应
def function(x, y, z):print(x, y, z)function(x=1, z=2, y=3)
# 输出:1 3 2
  • 位置参数可以和关键字参数混用,但位置参数必须在关键字参数之前
function(1, z=2, y=3)
# 输出:1 3 2
function(x=1, 2, z=3)
# 输出:SyntaxError: positional argument follows keyword argument
  • 不能为同一个形参重复传值
function(1, z=2, x=3)
# 输出:TypeError: function() got multiple values for argument 'x'

1.3.4 默认参数

  1. 定义:默认参数是编程语言中函数定义的一种特性,它允许在声明函数时为参数指定一个默认值。如果调用函数时没有提供该参数的值,则使用默认值。
  • 默认参数必须在非默认参数后面
  • 调用函数时,可不对默认参数的形参传值
def greet(name, message="你好, "):print(f"{message}{name}")# 使用默认的message参数
greet("小李")
# 输出:你好, 小李
# 覆盖默认的message参数
greet("小张", "欢迎你, ")
# 输出:欢迎你, 小张
  • 默认参数应设置为不可变类型(数字、字符串、元组)
def add_item(item, my_list=[]):my_list.append(item)return my_listprint(add_item('apple'))
# 输出: ['apple']
print(add_item('banana'))
# 输出: ['apple', 'banana']def add_item(item, my_list=None):if my_list is None:my_list = []my_list.append(item)return my_listprint(add_item('apple'))
# 输出: ['apple']
print(add_item('banana'))
# 输出: ['banana']
  • 参数可选
def name(first_name, last_name, middle_name=None):if middle_name:return first_name + middle_name + last_nameelse:return first_name + last_nameprint(name("王", "源"))
# 输出:王源
print(name("王", "凯", "俊"))
# 输出:王俊凯

1.3.5 可变长参数——args和kwargs

  1. 定义:允许函数接受任意数量的位置参数和关键字参数
  2. 用途:当你不确定一个函数将接收多少个参数时
(1)*args:

传递一个非键值对的可变数量的参数列表给函数。星号(*)表示将参数应该视为元组来处理

def test_var_args(f_arg, *argv):print("第一个常规参数:", f_arg)print(argv)for arg in argv:print("另一个通过*args传入的参数:", arg)test_var_args('Python', 'Rocks', 'For', 'Data', 'Science')
# 输出:第一个常规参数: Python
#      ('Rocks', 'For', 'Data', 'Science')
#      另一个通过*args传入的参数: Rocks
#      另一个通过*args传入的参数: For
#      另一个通过*args传入的参数: Data
#      另一个通过*args传入的参数: Science
(2)*kwargs:

允许将不定长度的键值对作为参数传递给一个函数。双星号(**)表示将参数视为字典来处理

def greet_me(**kwargs):print(kwargs)for key, value in kwargs.items():print("{0} = {1}".format(key, value))greet_me(name="小李", age=25, city="北京")
# 输出:{'name': '小李', 'age': 25, 'city': '北京'}
#      name = 小李
#      age = 25
#      city = 北京

1.4 函数体和变量作用域

  1. 函数体:指在定义一个函数时,包含在函数声明和结束之间的所有代码块
  2. 局部变量:在函数内部定义的变量,其作用范围仅限于定义它的函数内部,不能在函数外部被访问或修改
  3. 全局变量:在所有函数之外定义的变量,可以在文件的任何地方被访问(包括所有函数内部)
# 定义一个全局变量
global_var = "我是全局变量"def check_scope():# 定义一个局部变量local_var = "我是局部变量"print(local_var)  # 可以访问局部变量# 输出:我是局部变量"""# 访问全局变量print(global_var)# 输出:UnboundLocalError: cannot access local variable 'global_var' where it is not associated with a value"""# 尝试修改全局变量的值,不使用global时会创建一个新的局部变量global_var = "尝试修改全局变量失败"print(global_var)# 输出:尝试修改全局变量失败def modify_global_var():global global_var  # 使用global关键字声明我们要使用全局变量global_var = "全局变量已被修改"print(global_var)# 输出:全局变量已被修改# 调用函数
check_scope()
print(global_var)
# 输出:我是全局变量
modify_global_var()
print(global_var)
# 输出:全局变量已被修改
"""
# 在函数外部无法访问局部变量
print(local_var)
# 输出:NameError: name 'local_var' is not defined. Did you mean: 'global_var'?
"""

1.5 返回值

1.5.1 单个返回值

def function(x):return x**3res = function(2)
print(res)
# 输出:8

1.5.2 多个返回值

def function1(x):return x, x**2, x**3print(function1(2))
# 输出:(2, 4, 8)
a, b, c = function1(3)
print(a, b, c)
# 输出:3 9 27

1.5.3 多个return语句(只执行其中一个)

def function2(x):if x in ['Sunday', 'Saturday']:return "weekend"else:return "weekday"print("这一句根本没有机会不执行")print(function2('Saturday'))
# 输出:weekend
print(function2('Monday'))
# 输出:weekday

1.5.4 没有return语句(返回值为None)

def function3(x):print("没有返回值")print(function3(1))
# 输出:没有返回值
#      None

2、匿名函数

2.1 基本形式

lambda 变量:
  函数体

2.2 常见用法

2.2.1 排序——sort()/sorted()

ls = [(98, 88), (78, 99), (86, 74), (90, 90), (78, 96)]
ls.sort()  # 基于每个元组的第一个元素进行排序
print(ls)
# 输出:[(78, 96), (78, 99), (86, 74), (90, 90), (98, 88)]ls.sort(key=lambda x: x[1])  # 基于每个元组的第二个元素进行排序
print(ls)
# 输出:[(86, 74), (98, 88), (90, 90), (78, 96), (78, 99)]ls1 = sorted(ls, key=lambda x: x[1]+x[0], reverse=True)
print(ls1)
# 输出:[(98, 88), (90, 90), (78, 99), (78, 96), (86, 74)]

2.2.2 最值——max()/min()

ls2 = max(ls, key=lambda x: x[1])
print(ls2)
# 输出:(78, 99)ls3 = min(ls, key=lambda x: x[1])
print(ls3)
# 输出:(86, 74)

3、面向过程和面向对象

3.1 面向过程

3.1.1 定义

一种编程范式,通过一系列的过程或函数来组织代码

3.1.2 关注

“怎么做”,即如何一步步地解决问题

3.1.3 特点

(1)流程控制:

程序由一系列顺序执行的语句组成,包括条件判断、循环等

(2)模块化:

将代码分解为多个函数或过程,每个函数或过程负责完成一个特定的任务

(3)数据与操作分离:

数据和对数据的操作通常是分开定义的。函数接收数据作为参数,处理后可能返回结果

(4)易于理解和实现:

对于简单的任务或者逻辑较为直接的问题,面向过程的方法通常更加直观易懂

def calculate_area(radius):pi = 3.14159return pi * (radius**2)def main():r = 5area = calculate_area(r)print("半径为", r, "的圆的面积为:", area)main()
# 输出:半径为 5 的圆的面积为: 78.53975

3.2 面向对象

3.2.1 定义

一种基于“对象”概念的编程范式,对象可以包含数据(属性)和方法(行为)

3.2.2 关注

“是什么”,即把问题分解成一组相互关联的对象,每个对象都是某个类的实例

3.2.3 特点

(1)封装:

将数据和操作数据的方法捆绑在一起,隐藏内部状态,并要求所有交互都通过对象的公开接口进行

(2)继承:

一个类可以从另一个类继承属性和方法,这促进了代码重用并允许创建层次结构

(3)多态:

允许子类提供其父类方法的不同实现,使得同一类型的对象可以以不同的方式响应相同的方法调用

(4)抽象:

简化复杂性的一种策略,通过隐藏具体的实现细节,只暴露必要的功能给用户

class Circle:def __init__(self, radius):self.radius = radiusdef calculate_area(self):pi = 3.14159return pi * (self.radius ** 2)def main():c = Circle(5)print("半径为", c.radius, "的圆的面积为:", c.calculate_area())main()
# 输出:半径为 5 的圆的面积为: 78.53975

3.3 区别

3.3.1 设计理念

面向过程编程注重算法的设计,而面向对象编程更关心数据结构的设计及其上的操作

3.3.2 扩展性

由于封装、继承和多态的存在,面向对象编程更容易扩展和维护,特别是在大型项目中

3.3.3 复用性

面向对象编程通过类和继承机制提高了代码的复用性,减少了重复代码

3.3.4 适用场景

面向过程编程适合解决小规模、线性的任务;面向对象编程更适合于构建大型、复杂的软件系统,尤其是那些需要长期维护和发展的情况


微语录:万物皆有裂痕,那是光照进来的地方。

相关文章:

【Python pro】函数

1、函数的定义及调用 1.1 为什么需要函数 提高代码复用性——封装将复杂问题分而治之——模块化利于代码的维护和管理 1.1.1 顺序式 n 5 res 1 for i in range(1, n1):res * i print(res) # 输出:1201.1.2 抽象成函数 def factorial(n):res 1for i in range(1…...

Docker 2025/2/24

用来快速构建、运行和管理应用的工具。帮助部署。 快速入门 代码略 解释 docker run :创建并运行一个容器,-d是让容器在后台运行 --name mysql :给容器起个名字,必须唯一 -p 3306:3306 :设置端口映射 -e KEYVALUE :是设置环境变量 mysql :指定运行的…...

4. 示例:创建带约束的随机地址生成器(范围0x1000-0xFFFF)

文章目录 前言代码示例:运行方法:查看结果:关键功能说明:扩展功能建议: 前言 以下是一个完整的SystemVerilog测试平台示例,包含约束随机地址生成、日志输出和波形生成功能: 代码示例&#xff1…...

爱普生SG-8101CE可编程晶振赋能智能手机的精准心脏

在智能手机高速迭代的今天,高性能、低功耗与小型化已成为核心诉求。智能手机作为人们生活中不可或缺的工具,需要在各种复杂场景下稳定运行。爱普生SG-8101CE可编程晶振凭借其卓越性能,成为智能手机中不可或缺的精密时钟源,为通信、…...

指针解剖学:穿透C/C++内存操作的核心密码与避坑指南

一、指针的本质与内存模型 指针是C/C的核心特性,本质是内存地址的变量化表示。每个变量在内存中占据连续的字节空间,地址是内存单元的唯一编号(如0x0028FF40)。指针变量存储的是目标数据的首地址,通过地址间接操作数据…...

Qt关于平滑滚动的使用QScroller及QScrollerProperties类说明

一、触控时代的滚动工具:QScroller类设计介绍 1.1 从机械滚轮到数字惯性 在触控设备普及前,滚动操作如同老式打字机的滚轴,只能通过鼠标滚轮或滚动条进行离散式控制。QScroller的出现如同给数字界面装上了"惯性飞轮",…...

【音视频】编解码相关概念总结

NALU RTP PS流 三者总体关系 NALU在RTP中的应用:视频流的RTP传输通常将NALU作为基本的单元进行传输。每个RTP包携带一个或多个NALU,这些NALU包含了视频编码数据。RTP协议通过其头部信息(如时间戳、序列号等)帮助接收端重新排列和…...

Vue3 + Vite + TS,使用 配置项目别名属性:resolve

使用 resolve 配置全局项目路径别名 1.优化了开发中单页面引用其他模块的路径复杂性 2.妥妥解决了,组件复用当中提高开发效率 // 不使用配置 import { useStore } from ../../../stores // 使用配置 可根据开发者需求任意定义,较多 import { useStore…...

docker创建nginx

docker run -d -p 8080:80 --name my-nginx-container nginx docker:命令 run:命令 -d:在后台运行容器 -p:8080:80:将容器内部的80端口映射到宿主机的8080端口。 --name my-nginx-container:为容器指定一个…...

StableDiffusion打包 项目迁移 项目分发 1

文章目录 SD项目迁移前置知识webui-user.batwebui.batlaunch_utils.py 下一篇开始实践 SD项目迁移 显卡驱动更新:https://www.nvidia.cn/geforce/drivers/ 下载安装三个程序: python3.10.6: https://www.python.org/downloads/release/python-3106/gi…...

【数据结构进阶】哈希表

🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:数据结构 目录 前言 一、哈希表的概念 二、哈希函数的实现方法 1. 直接定址法 2. 除留余数法 三、哈希冲突 1. 开放定址法(闭散列&#xff0…...

【蓝桥杯嵌入式】各模块学习总结

系列文章目录 留空 文章目录 系列文章目录前言一、LED模块1.1 赛题要求1.2 模块原理图1.3 编写代码1.4 赛题实战 二、LCD模块2.1 赛题要求2.2 模块原理图2.3 编写代码2.4 赛题实战 三、按键模块3.1 赛题要求3.2 模块原理图3.3 编写代码3.4 赛题实战 四、串口模块4.1 赛题要求4…...

Rust学习总结之-枚举

枚举是一个很多语言都有的功能,不过不同语言中其功能各不相同但是要表达的意思是一致的,枚举就是对于一个事物可以穷举出所有可能得值。比如说人的性别就可以用枚举,男人和女人两种。下面我们来学习Rust中的枚举。 一:枚举定义 …...

Linux系统管理(十七)——配置英伟达驱动、Cuda、cudnn、Conda、Pytorch、Pycharm等Python深度学习环境

文章目录 前言安装驱动下载安装Cuda编辑环境变量安装Cudnn安装conda验证安装成功配置conda镜像退出conda环境创建python环境查看当前conda环境激活环境安装python包安装pytorch 安装pycharm安装jupyter notebook 前言 深度学习和大语言模型的部署不免会用到Linux系统&#xff…...

SLAM算法工程师的技术图谱和学习路径

SLAM(Simultaneous Localization and Mapping)算法工程师是负责开发和实现用于机器人、自动驾驶车辆等领域的SLAM算法的专业人士。下面是SLAM算法工程师需要掌握的基础理论知识: 机器人运动学和动力学:理解机器人在空间中的运动方式和控制方法,包括轮式、蜘蛛腿、飞行器等…...

【第三天】零基础学习量化基础代码分析-持续更新

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 记录量化基础代码总览引言基本概念量化投资 伪代码示例:量化投资模型框架总结 每日-往期回看 第一天零基础学量化基础知识点总览-持续更新 第二天零基础…...

深入了解 Python 中的 MRO(方法解析顺序)

文章目录 深入了解 Python 中的 MRO(方法解析顺序)什么是 MRO?如何计算 MRO?C3 算法的合并规则C3 算法的合并步骤示例:合并过程解析 MRO 解析失败的场景使用 mro() 方法查看 MRO示例 1:基本用法 菱形继承与…...

如何防止 Instagram 账号被盗用:安全设置与注意事项

如何防止 Instagram 账号被盗用:安全设置与注意事项 在这个数字化时代,社交媒体平台如 Instagram 已成为我们日常生活的一部分。然而,随着网络犯罪的增加,保护我们的在线账户安全变得尤为重要。以下是一些关键的安全设置和注意事…...

采样算法二:去噪扩散隐式模型(DDIM)采样算法详解教程

参考 https://arxiv.org/pdf/2010.02502 一、背景与动机 去噪扩散隐式模型(DDIM) 是对DDPM的改进,旨在加速采样过程同时保持生成质量。DDPM虽然生成效果优异,但其采样需迭代数百至数千次,效率较低。DDIM通过以下关键…...

各种类型网络安全竞赛有哪些 网络安全大赛的简称

本文是对入门学习的一些概念了解和一些常规场景记录 1.CTF(capture the flag)是夺旗赛的意思。 是网络安全技术人员之间进行攻防的比赛。 起源1996年DEFCON全球黑客大会,替代之前真实攻击的技术比拼。 (DEFCON极客大会诞生1993,…...

包子凑数——蓝桥杯真题Python

包子凑数 输入输出样例 示例 1 输入 2 4 5输出 6样例说明 凑不出的数目包括:1, 2, 3, 6, 7, 11。 示例 2 输入 2 4 6输出 INF样例说明 所有奇数都凑不出来,所以有无限多个 运行限制 最大运行时间:1s最大运行内存: 256M 最大公约数 最大公…...

网络通信/IP网络划分/子网掩码的概念和使用

文章目录 概述子网的考题子网掩码的历史有/无类地址子网划分!子网掩码超网技术/CIDR子网掩码和路由IP子网掩码定义 网络规划网络规划-拆子网网络规划-组超网子网划分案例 区分于其他特殊IP地址IP地址和网络地址子网掩码和网络地址子网掩码和广播地址 子网间的通信其他 概述 本…...

【前端】简单原生实例合集html,css,js

长期补充,建议关注收藏点赞。 目录 分栏input各种类型iframe表单拖拽 分栏 区分fieldset和framesetframeset是把浏览器窗口分成几个区域,每个区域分别放置一个html文档到对应的frame中,而且这个比例可以按住边栏进行调整col指定左右边栏的宽…...

MySQL--》如何在MySQL中打造高效优化索引

目录 初识索引 索引结构 性能分析 索引使用 最左前缀法则 SQL提示使用 覆盖索引使用 前缀索引使用 索引失效情况 初识索引 索引(index):是帮助MySQL高效获取数据的数据结构(有序),在数据之外数据库系统还维护着满足特定查找算法的数据结构&…...

盛京开源社区加入 GitCode,书写东北开源生态新篇章

在数字化转型与开源技术蓬勃发展的浪潮下,开源社区已成为推动技术创新的核心力量。盛京开源社区(SJOSC)作为沈阳地区的开源交流平台,始终致力于连接开发者、企业及高校,构建区域技术生态圈。 现在,盛京开源…...

HTML转义和反转义工具类

HTML转义和反转义工具类 package com.common.utils;import cn.hutool.http.HTMLFilter; import org.apache.commons.lang3.StringUtils;/*** 转义和反转义工具类** author lxx*/ public class EscapeUtil {public static final String RE_HTML_MARK "(<[^<]*?>…...

网络运维学习笔记(DeepSeek优化版)005网工初级(HCIA-Datacom与CCNA-EI)链路层发现协议与VLAN技术

文章目录 一、链路层发现协议1.1 思科CDP协议1.2 华为LLDP协议 二、VLAN&#xff08;Virtual Local Area Network&#xff0c;虚拟局域网&#xff09;技术详解2.1 基本概念2.2 技术特性2.3 接口工作原理2.3.1 Access模式2.3.2 Trunk模式 2.4 厂商配置对比思科配置华为配置 2.5 …...

DeepSeek开源周Day4:三连发!突破 AI 训练瓶颈的立体解决方案,并行计算三剑客DualPipe、EPLB与Profile-data

项目地址&#xff1a; https://github.com/deepseek-ai/DualPipehttps://github.com/deepseek-ai/eplbhttps://github.com/deepseek-ai/profile-data 开源日历&#xff1a;2025-02-24起 每日9AM(北京时间)更新&#xff0c;持续五天 (4/5)&#xff01; ​ ​ 一、背景概述 …...

树莓百度百科更新!宜宾园区业务再添新篇

树莓集团宜宾园区业务不断拓展&#xff0c;主要体现在以下几个方面&#xff1a; 产业布局 -聚焦数字经济核心领域&#xff1a;涵盖软件开发、人工智能、大数据等&#xff0c;吸引众多上下游企业入驻&#xff0c;形成从芯片研发、软件开发到系统集成的完整产业链条。 -推进“双…...

RabbitMQ操作实战

1.RabbitMQ安装 RabbitMQ Windows 安装、配置、使用 - 小白教程-腾讯云开发者社区-腾讯云下载erlang&#xff1a;http://www.erlang.org/downloads/https://cloud.tencent.com/developer/article/2192340 Windows 10安装RabbitMQ及延时消息插件rabbitmq_delayed_message_exch…...