Python-函数

Python 中可以使用def关键字来定义函数。

函数定义规则:

  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()
  • 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
  • 函数内容以冒号 : 起始,并且缩进。
  • return [表达式] 结束函数,选择性地返回一个值给调用方,不带表达式的 return 相当于返回 None。

def greet(name):"""这是一个简单的问候函数"""print(f"Hello, {name}!")# 示例调用
greet("Alice")  # 输出: Hello, Alice!

函数的参数

写一个函数,根据给出的三条边的长度判断是否可以构成三角形,如果可以构成三角形则返回True,否则返回False

def make_judgement(a, b, c):"""判断三条边的长度能否构成三角形"""return a + b > c and b + c > a and a + c > bprint(make_judgement(1, 2, 3))  # False
print(make_judgement(4, 5, 6))  # True

如果不想按照从左到右的顺序依次给出abc 三个参数的值,也可以使用关键字参数,通过“参数名=参数值”的形式为函数传入参数。

print(make_judgement(b=2, c=3, a=1))  # False
print(make_judgement(c=6, b=4, a=5))  # True

在定义函数时,我们可以在参数列表中用/设置强制位置参数positional-only arguments),用*设置命名关键字参数。所谓强制位置参数,就是调用函数时只能按照参数位置来接收参数值的参数;而命名关键字参数只能通过“参数名=参数值”的方式来传递和接收参数

# /前面的参数是强制位置参数
def make_judgement(a, b, c, /):"""判断三条边的长度能否构成三角形"""return a + b > c and b + c > a and a + c > b# 下面的代码会产生TypeError错误,错误信息提示“强制位置参数是不允许给出参数名的”
# TypeError: make_judgement() got some positional-only arguments passed as keyword arguments
# print(make_judgement(b=2, c=3, a=1))

说明:强制位置参数是 Python 3.8 引入的新特性,在使用低版本的 Python 解释器时需要注意。

# *后面的参数是命名关键字参数
def make_judgement(*, a, b, c):"""判断三条边的长度能否构成三角形"""return a + b > c and b + c > a and a + c > b# 下面的代码会产生TypeError错误,错误信息提示“函数没有位置参数但却给了3个位置参数”
# TypeError: make_judgement() takes 0 positional arguments but 3 were given
# print(make_judgement(1, 2, 3))
参数的默认值

Python 中允许函数的参数拥有默认值,带默认值的参数必须放在不带默认值的参数之后

from random import randrange# 定义摇色子的函数
# 函数的自变量(参数)n表示色子的个数,默认值为2
# 函数的因变量(返回值)表示摇n颗色子得到的点数
def roll_dice(n=2):total = 0for _ in range(n):total += randrange(1, 7)return total# 如果没有指定参数,那么n使用默认值2,表示摇两颗色子
print(roll_dice())
# 传入参数3,变量n被赋值为3,表示摇三颗色子获得点数
print(roll_dice(3))
def add(a=0, b=0, c=0):"""三个数相加求和"""return a + b + c# 调用add函数,没有传入参数,那么a、b、c都使用默认值0
print(add())         # 0
# 调用add函数,传入一个参数,该参数赋值给变量a, 变量b和c使用默认值0
print(add(1))        # 1
# 调用add函数,传入两个参数,分别赋值给变量a和b,变量c使用默认值0
print(add(1, 2))     # 3
# 调用add函数,传入三个参数,分别赋值给a、b、c三个变量
print(add(1, 2, 3))  # 6
可变参数

Python 语言中可以通过星号表达式语法让函数支持可变参数。所谓可变参数指的是在调用函数时,可以向函数传入0个或任意多个参数。

# 用星号表达式来表示args可以接收0个或任意多个参数
# 调用函数时传入的n个参数会组装成一个n元组赋给args
# 如果一个参数都没有传入,那么args会是一个空元组
def add(*args):total = 0# 对保存可变参数的元组进行循环遍历for val in args:# 对参数进行了类型检查(数值型的才能求和)if type(val) in (int, float):total += valreturn total# 在调用add函数时可以传入0个或任意多个参数
print(add())         # 0
print(add(1))        # 1
print(add(1, 2, 3))  # 6
print(add(1, 2, 'hello', 3.45, 6))  # 12.45

如果我们希望通过“参数名=参数值”的形式传入若干个参数,具体有多少个参数也是不确定的,我们还可以给函数添加可变关键字参数,把传入的关键字参数组装到一个字典中,

# 参数列表中的**kwargs可以接收0个或任意多个关键字参数
# 调用函数时传入的关键字参数会组装成一个字典(参数名是字典中的键,参数值是字典中的值)
# 如果一个关键字参数都没有传入,那么kwargs会是一个空字典
def foo(*args, **kwargs):print(args)print(kwargs)foo(3, 2.1, True, name='测试', age=43, gpa=4.95)

用模块管理函数

import关键字导入指定的模块再使用完全限定名模块名.函数名)的调用方式

module1.py

def foo():print('hello, world!')

module2.py

def foo():print('goodbye, world!')

test.py

import module1
import module2# 用“模块名.函数名”的方式(完全限定名)调用函数,
module1.foo()  # hello, world!
module2.foo()  # goodbye, world!

在导入模块时,还可以使用as关键字对模块进行别名,这样我们可以使用更为简短的完全限定名。

test.pyimport module1 as m1
import module2 as m2m1.foo()  # hello, world!
m2.foo()  # goodbye, world!

标准库中的模块和函数

Python 标准库中提供了大量的模块和函数来简化我们的开发工作,我们之前用过的random模块就为我们提供了生成随机数和进行随机抽样的函数;而time模块则提供了和时间操作相关的函数;我们之前用到过的math模块中还包括了计算正弦、余弦、指数、对数等一系列的数学函数。随着我们深入学习 Python 语言,我们还会用到更多的模块和函数。

Python 标准库中还有一类函数是不需要import就能够直接使用的,我们将其称之为内置函数,这些内置函数不仅有用而且还很常用,下面的表格列出了一部分的内置函数。

# 内置函数综合案例:学生成绩管理系统def student_grade_system():"""学生成绩管理系统演示各种内置函数的使用"""print("=== 学生成绩管理系统 ===")# 1. abs - 计算成绩差值的绝对值score1 = 85score2 = 92diff = abs(score1 - score2)print(f"\n1. 两位学生成绩差值的绝对值: {diff}")# 2. bin/hex/oct - 显示学生ID的不同进制表示student_id = 123print(f"\n2. 学生ID {student_id} 的不同表示:")print(f"二进制: {bin(student_id)}")print(f"十六进制: {hex(student_id)}")print(f"八进制: {oct(student_id)}")# 3. chr/ord - 处理特殊字符grade_symbol = 'A'print(f"\n3. 等级符号 '{grade_symbol}' 的Unicode码: {ord(grade_symbol)}")print(f"Unicode码65对应的字符: {chr(65)}")# 4. input - 获取学生姓名name = input("\n4. 请输入学生姓名: ")# 5. len - 计算姓名长度print(f"姓名长度: {len(name)}")# 6. max/min/sum - 计算成绩统计grades = [85, 92, 78, 90, 88]print(f"\n5. 成绩统计 - 班级成绩: {grades}")print(f"最高分: {max(grades)}")print(f"最低分: {min(grades)}")print(f"平均分: {sum(grades) / len(grades):.2f}")# 7. pow - 计算加权成绩base_score = 80weight = 1.2weighted_score = pow(base_score, weight)print(f"\n6. 基础分 {base_score} 的加权分(权重1.2): {weighted_score:.2f}")# 8. range - 生成学号序列print("\n7. 生成的学号序列:")for id in range(2023001, 2023006):print(id, end=' ')# 9. round - 四舍五入平均分avg = sum(grades) / len(grades)print(f"\n\n8. 精确到小数点后2位的平均分: {round(avg, 2)}")# 10. type - 检查数据类型print("\n9. 数据类型检查:")print(f"grades的类型: {type(grades)}")print(f"name的类型: {type(name)}")# 11. open - 写入学生数据到文件print("\n10. 将学生数据写入文件...")with open('student_data.txt', 'w', encoding='utf-8') as f:f.write(f"学生姓名: {name}\n")f.write(f"学生成绩: {grades}\n")f.write(f"平均分: {avg:.2f}\n")print("数据已写入student_data.txt文件")# 运行学生成绩管理系统
student_grade_system()

函数应用实战

例子1:随机验证码

设计一个生成随机验证码的函数,验证码由数字和英文大小写字母构成,长度可以通过参数设置。

import random
import string# 生成一个随机字符串 ,长度为10 ,由数字和字母组成
ALL_CHAR = string.digits + string.ascii_letters;def generate_code(*,code_len=4):"""生成指定长度的验证码:param code_len: 验证码的长度(默认4个字符):return: 由大小写英文字母和数字构成的随机验证码字符串random.choice(ALL_CHAR,k=code_len) 从ALL_CHAR中随机选择k个字符"""return ''.join(random.choices(ALL_CHAR,k=code_len))for _ in range(5):print(generate_code(code_len=10))

例子2:判断素数

设计一个判断给定的大于1的正整数是不是质数的函数。质数是只能被1和自身整除的正整数(大于1),如果一个大于 1 的正整数 N 是质数,那就意味着在 2 到 N−1 之间都没有它的因子。

def is_prime(num: int) -> bool:"""判断一个正整数是不是质数:param num: 大于1的正整数:return: 如果num是质数返回True,否则返回False"""for i in range(2, int(num ** 0.5) + 1):if num % i == 0:return Falsereturn True

说明1:上面is_prime函数的参数num后面的: int用来标注参数的类型,虽然它对代码的执行结果不产生任何影响,但是很好的增强了代码的可读性。同理,参数列表后面的-> bool用来标注函数返回值的类型,它也不会对代码的执行结果产生影响,但是却让我们清楚的知道,调用函数会得到一个布尔值,要么是True,要么是False

说明2:上面的循环并不需要从 2 循环到 N−1 ,因为如果循环进行到 N 时,还没有找到$\small{N}$的因子,那么 N 之后也不会出现 N 的因子,大家可以自己想一想这是为什么。

例子3:最大公约数和最小公倍数

设计计算两个正整数最大公约数和最小公倍数的函数。 x 和 y 的最大公约数是能够同时整除 x 和 y 的最大整数,如果 x 和 y 互质,那么它们的最大公约数为 1; x 和 y 的最小公倍数是能够同时被 x 和 y 整除的最小正整数,如果 x 和 y 互质,那么它们的最小公倍数为 x×y 。需要提醒大家注意的是,计算最大公约数和最小公倍数是两个不同的功能,应该设计成两个函数,而不是把两个功能放到同一个函数中。

def lcm(x: int, y: int) -> int:"""求最小公倍数"""return x * y // gcd(x, y)def gcd(x: int, y: int) -> int:"""求最大公约数"""while y % x != 0:x, y = y % x, xreturn x

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/910346.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/910346.shtml
英文地址,请注明出处:http://en.pswp.cn/news/910346.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mac在局域网中突然很慢(包括SMB、NFS、SCP、SSH、Ping等场景均很慢)

今天 SMB 又突然好慢,大概只有 8-9 MB/s,而苹果 SMB 很容易突然很慢是出了名的。我就想装 NFS,但是 NFS 弄好之后还是很慢,我服了,我就检查了scp等场景,都很慢,但是互联网下载速度还是很快的。 …

UMAP:用于降维的均匀流形近似和投影实验

关键词: Uniform Manifold Approximation and Projection (UMAP):均匀流形近似与投影 一、说明 对于降维,首先看数据集是否线性,如果是线性的用pca降维;如果是非线性数据,t-SNE或者UMAP,本文针…

【Datawhale组队学习202506】YOLO-Master task03 IOU总结

系列文章目录 task01 导学课程 task02 YOLO系列发展线 文章目录 系列文章目录前言1 功能分块1.1 骨干网络 Backbone1.2 颈部网络 Neck1.3 头部网络 Head1.3.1 边界框回归头1.3.2 分类头 2 关键概念3 典型算法3.1 NMS3.2 IoU 总结 前言 Datawhale是一个专注于AI与数据科学的开…

Spring IOC容器核心揭秘:BeanFactory创建、配置加载解析并注册为BeanDefinition

文章目录 一、为何这个阶段如此重要?二、整体流程全景图三、源码级深度解析1. BeanFactory的诞生源码入口:refresh()方法核心方法:obtainFreshBeanFactory()核心实现:refreshBeanFactory()BeanFactory实例化 2. ★ 核心&#xff1…

解锁n8n:开启工作流自动化的无限可能(5/6)

文章摘要:n8n 是一款开源低代码工作流自动化平台,通过可视化拖放节点创建复杂工作流,无需大量代码。具有强大集成能力、数据转换、错误处理等功能,适用于数据同步、客户关系管理、IT 自动化等场景。相比 Zapier、IFTTT 等工具&…

数据赋能(308)——合作共享——数据交流

概述 重要性如下: 信息准确性:数据交流原则确保在数据传递过程中信息的准确性,这是决策和业务活动的基础。决策支持:准确的数据交流为决策提供有力支持,帮助组织做出更明智的决策。业务效率:有效的数据交…

TCP流量控制与拥塞控制:核心机制与区别

一、TCP流量控制(Flow Control) 定义:通过调节发送方的发送速率,确保接收方能够及时处理数据,避免缓冲区溢出。 本质:解决发送方与接收方之间的"端到端"速率匹配问题。 1. 实现机制&#xff1a…

iOS多端兼容性调试:一次iOS性能优化分工具协作排查过程

在多技术栈混合开发日益普及的今天,iOS应用中越来越多地集成了WebView、Flutter、React Native甚至小程序模块。而这些模块带来的复杂性,不仅体现在UI适配,还包括数据同步、系统权限管理、线程调度等方面的问题。 本文记录的是我们在处理一个…

秋招Day14 - MySQL - 索引

索引为什么能够提高MySQL的查询效率? 索引可以理解为目录,通过索引可以快速定位数据,避免全表扫描 一般是B树结构,查找效率是O(log n)。 索引还能加速排序、分组、连接等操作。 create index idx_name on students(name); 能简…

第5天:LSTM预测火灾温度

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 目标 复用LSTM模型实现火灾温度预测 具体实现 (一)环境 语言环境:Python 3.10 编 译 器: PyCharm 框 架: Pytorch &am…

目标检测之YOLOV11自定义数据使用OBB训练与验证

一、前置条件与环境准备 在开始训练前,确保已完成以下准备《目标检测之YOLOV11自定义数据预处理——从原始标注到YOLO-OBB格式转换与验证》: 数据目录结构: yolov11/ ├── datasets/ │ └── shrimp/ │ ├── images/ │ …

Labview教程进阶一(Labview与OPC UA设备通信)

1.Labview与OPC UA设备通信 OPC UA通信协议优势显著,具体表现如下: 跨平台兼容:支持多种操作系统和硬件平台,实现无缝数据交换。高安全性:内置加密、身份验证和授权机制,确保数据传输安全。高效数据交换:采用二进制编码和优化的传输协议,提高通信效率。复杂数据建模:…

【Comsol教程】如何求解指定范围的积分 或 在积分中去除奇异点/异常值

我们在Comsol中经常需要对物体的边界求积分,比如求物体在流场中所受的总流体牵引力,又或者是物体在电场中受到的总介电泳力。当物体的材料或者边界条件存在突变时,物体表面的粘性应力或者麦克斯韦电应力可能会存在异常值。通常解决方法有细化…

Python 多版本治理理念(Windows 平台 · 零基础友好)

🧠 Python 多版本治理理念(Windows 平台 零基础友好) 🌐 核心原则:三维治理、四级隔离、五项自治 以下是基于人工智能深度学习环境搭建实践,总结出的"零基础入门 Conda工具链 全隔离项目环境"…

Python文件管理利器之Shutil库详解

Shutil是一个Python内置的用来高效处理文件和目录迁移任务的库。Shutil不仅支持基本的文件复制、移动和删除操作,还具备处理大文件、批量迁移目录、以及跨平台兼容性等特性。通过使用Shutil,我们可以更加轻松地实现文件系统的管理和维护,本文…

学习华为 ensp 的学习心得体会

引言​ 在信息技术日新月异的今天,网络技术作为连接世界的桥梁,其重要性不言而喻。作为一名对网络技术充满热情的大一新生,我选择了 eNSP(Enterprise Network Simulation Platform,企业网络模拟平台)作为我…

jenkins-2.439.1搭建

一、 二、pipeline文件 pipeline { agent any // 可以指定特定的agent, 如 label 或 docker environment { JAVA_HOME "/usr/local/software/jdk1.8.0_451" PATH "${JAVA_HOME}/bin:${env.PATH}" } tools { …

【threejs】一天一个小案例讲解:控制面板(GUI)

# 好吧,每天更新实在有点艰巨,我尽量少量多次 代码仓 所有代码都会上传到这里,可自行clone GitHub - TiffanyHoo/three_practices: Learning three.js together! 运行效果图 ​ 知识要点 一、安装dat.gui npm i dat.gui 二、使用步骤&a…

飞轮储能辅助双馈风机参与电力系统一次调频的仿真模型研究

以下是一篇关于飞轮储能辅助双馈风机参与电力系统一次调频的仿真模型研究的论文 ,涵盖理论分析、数学模型构建、控制策略设计及仿真验证等内容,适用于电气工程、新能源技术等领域的研究参考。 飞轮储能辅助双馈风机参与电力系统一次调频的仿真模型研究 摘要 随着风电在电力…

一次性理解Java垃圾回收--简单直接方便面试时使用

Java的垃圾回收是一个面试必问题,只要按照下面的步骤回答肯定不会有大问题。 1.先告诉面试官垃圾回收分为两大步: a.识别哪些对象是"垃圾"(不再被使用的对象) b.回收这些垃圾对象占用的内存空间 2. 接下来分别介绍标记阶段和回收阶段的细节…