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

python基础之函数

目录

1.函数相关术语

2.函数类型分类

3.栈

4.位置参数和关键字参数

5.默认参数

6.局部变量和全局变量

7.返回多个值

8.怀孕函数

9.匿名函数

10.可传递任意个数实参的函数

11.函数地址与函数接口

12.内置函数修改与函数包装


1.函数相关术语

函数的基本概念有函数头,函数名,形参和实参,函数体,如下图所示

  • 参数是可选的,也就是说函数可以不包含参数,比如 def main():
  • 使用 return result 返回语句来返回一个值,函数为带返回值的函数。
  • 不使用 return 语句,函数为不带返回值的函数。不用 return 的函数,python 默认函数末尾加上了一个 return None,就是说返回了一个 None,空值。

2.函数类型分类

带参数,有返回值的函数
def myfunc(a, b):result = 0for i in range(a, b + 1):result += ireturn result
不带参数,无返回值的函数
def main():print("月满则亏")print("水满则溢")print("花满则衰")print("爱满则痴")main()  # 执行 main()
带参数,无返回值的函数
def nprint(n):for i in range(n):print("xxxxxx")print(nprint(2))

3.栈

栈是在函数调用时产生的一个内存区域,用来存储函数的参数和局部变量的激活记录。
当调用一个函数时,这个函数的参数和局部变量的激活记录被压入栈。
当这个函数执行完毕,这些激活记录将会被从栈中删除。

示例代码

def func(Data1, Data2):Data3 = Data1 * Data2return Data3ret = func(1, 2)

对于语句ret = func(1, 2),func在调用时会产生一个栈,实参传递给形参,以及函数体内部的变量激活记录都会逐步记录在栈中(称为"压入栈"),函数调用完毕,这些记录会逐步从栈中清除出去("出栈")。

栈的特点:"后进先出"。就是最后进来的激活记录先被弹出堆栈。

4.位置参数和关键字参数

调用函数时,实参的值传递给形参,这个过程叫做值传递。值传递有多种方式,比如按默认位置,或者使用关键字参数。比如下面这个例子中f函数有3个关键字参数:x,y,z。

def f(x, y, z):return (x + y) / z# 使用位置参数调用函数
print(f(1, 2, 3))  # 1.0# 使用关键字参数调用函数
print(f(z=2, y=3, x=5))  # 4.0# 同时使用位置参数和关键字参数
print(f(7, z=3, y=2))  # 3.0

注意:调用函数时,位置参数在左边,关键字参数在右边。

5.默认参数

函数定义时, 形参如果带有关键字,表示当实参不赋值时,该变量具有默认值。
而当实参有赋值时,使用实参的赋值,而不是用默认值。
# 非默认值参数必须在默认值参数之前
def f(x, y=1, z=2):return x + y + zprint(f(1, 1, 1))  # 3
print(f(y=1, x=2, z=3))  # 6
print(f(1, z=3))  # 5

6.局部变量和全局变量

在函数内部定义的变量被称为局部变量。
在函数之外创建的变量被称为全局变量。
使用 global variable 语句将局部变量变为全局变量。
示例代码
x = 1
y = 1
z = 1def f(x):global yx = 2y = 2z = 2f(100)
print(x)  # 1
print(y)  # 2
print(z)  # 1

在以上代码中:

  • 一开始定义了x和y,它们是全局变量。
  • 然后定义了一个函数f,形参有x,注意这里的x为函数的形参名,跟前面那个全局变量x不是同一个
  • 函数体内部先使用了global y语句,它的作用是函数内部等会如果有y的调用,则y调用的是全局变量那个y。
  • x = 2语句是一个赋值语句,注意这条赋值语句的x不是全局变量那个x,是形参变量x,因此全局变量那个x的值不会发生改变,仍为1
  • y = 2语句:由于global y的作用,这里的y是全局变量的那个y,因此全局变量y的值会变成2
  • z = 2语句:由于没有global z语句,这里的z是函数内部产生的局部变量,因此这里的赋值语句不会对全局变量那个z造成影响。

7.返回多个值

python 函数允许返回多个值。
函数多个数本质上是以元组的形式在传递值。
def sort(n1, n2):if n1 < n2:return n1, n2return n2, n1print(sort(2, 3))  # (2, 3)
a, b = sort(3, 2)print(a)  # 2
print(b)  # 3def func(num1, num2):return num1 + num2, num1 - num2x = func(2, 3)
print(type(x))  # <class 'tuple'>

8.怀孕函数

怀孕函数就是函数内部又定义了一个函数。

python 函数很特殊,可以无限嵌套。
def Test():def TestX():print("hello world")for i in range(3):TestX()Test()

9.匿名函数

匿名函数就是函数的简洁表达,使用关键字 lambda 实现。

# 例子1
myfunc = lambda a, b: a + b
print(myfunc(2, 3))   # 5# 例子2(用来装逼)
ret = (lambda a, b: a * b)(4, 5)
print(ret)  # 20
(lambda data: print(data))("hello world")  # hello world

10.可传递任意个数实参的函数

在Python中,可以创建一个函数,它可以接收任意数量的实参。这通过使用星号表达式()实现。星号运算符有两种形式:单星号(*)和双星号(**)。

①单星号(*):将实参列表转换为元组。

def mysum(*data):print(type(data))   # <class 'tuple'>ret = 0for x in data:ret += xreturn retprint(mysum(1, 2))  # 3
print(mysum(1, 2, 5, 7))  # 15

②双星号(**):将字典转换为关键字参数。

def mysum(**data):print(type(data))   #  <class 'dict'>ret = 0for key in data:ret += data[key]print(key, data[key])return retprint(mysum(a=2, b=2, c=5, d=7))  # 这里用等号,等号左边为关键字,右边为值print(mysum(x=2, y=3))  # 这里用等号,等号左边为关键字,右边为值

③同时使用单星号(*)和双星号(**):函数可以接收任意数量的实参,并且可以是以上两种类型。

def print_args_kwargs(*args, **kwargs):print(args)print(kwargs)print_args_kwargs(1, 2, 3, a=1, b=2, c=3)
# 输出: (1, 2, 3) {'a': 1, 'b': 2, 'c': 3}

11.函数地址与函数接口

函数的本质是一个地址,可函数名赋值来实现相同功能

def myadd(num1, num2):return num1 + num2print(id(myadd))  # 2363817237224
print(type(myadd))  # <class 'function'>go = myadd  # 注意软件规范不允许这样赋值,不然容易出问题
print(id(go), id(myadd))  # id 会相同
print(type(go), type(myadd))  # 类型都是函数ret = go(1, 2)
print(ret)  # 3

函数名赋值实现函数的调用和定义的分离,实现函数接口,搭建框架。

# 函数的定义
def add(x, y):return x + y - 1# 函数的定义
def minus(x, y):return x - y + 10# 函数调用框架
def work(func_name, num1, num2):value = func_name(num1, num2)print(value)for i in range(value):print("hello world")return value + 1# 函数调用
work(add, 1, 2)# 函数调用
work(minus, 3, 4)

运行结果

2
hello world
hello world
9
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world

12.内置函数修改与函数包装

修改内置函数

import osdef myprint(mystr):os.system("echo ---------------")if mystr.find("python is handsome.") != -1:os.system("echo " + mystr)else:os.system("echo " + "python is handsome!")os.system("echo " + mystr)print = myprint  # 切换函数的地址
print("hello world")
print("Full love leads to madness")

运行结果

---------------
python is handsome!
hello world
---------------
python is handsome!
Full love leads to madness
函数包装
  • 加密 or 保护费
  • 还可以给函数的使用加密
  • 每次调用都要输入密码才行

示例代码

import os# 备份原来的函数地址
backossystem = os.system# 等价的调用
# backossystem("notepad")# 需要收费的系统
def system_check(mystr):if mystr.find("A") != -1:backossystem(mystr)else:print("请开通会员否则 " + mystr + " 无法执行")# 修改内置函数地址
os.system = system_check
os.system("echo hello world")

运行结果

请开通会员否则 echo hello world 无法执行

end

相关文章:

python基础之函数

目录 1.函数相关术语 2.函数类型分类 3.栈 4.位置参数和关键字参数 5.默认参数 6.局部变量和全局变量 7.返回多个值 8.怀孕函数 9.匿名函数 10.可传递任意个数实参的函数 11.函数地址与函数接口 12.内置函数修改与函数包装 1.函数相关术语 函数的基本概念有函数头…...

深入理解C#中的IO操作 - FileStream流详解与示例

文章目录 一、FileStream类的介绍二、文件读取和写入2.1 文件读取&#xff08;FileStream.Read&#xff09;2.2 文件写入&#xff08;FileStream.Write&#xff09; 三、文件复制、移动和目录操作3.1 文件复制&#xff08;FileStream.Copy&#xff09;3.2 文件移动&#xff08;…...

信息泄露--注意点点

目录 明确目标: 信息泄露: 版本软件 敏感文件 配置错误 url基于文件: url基于路由: 状态码: http头信息泄露 报错信息泄露 页面信息泄露 robots.txt敏感信息泄露 .get文件泄露 --判断: 搜索引擎收录泄露 BP: 爆破: 明确目标: 失能 读取 写入 执行 信息泄…...

位运算符

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 位运算符是把数字看作二进制数来进行计算的&#xff0c;因此&#xff0c;需要先将要执行运算的数据转换为二进制&#xff0c;然后才能进行执行运算。…...

云上聚智——移动云云服务器进行后端的搭建及部署

什么是移动云 移动云是指将移动设备和云计算技术相结合&#xff0c;为移动应用提供强大的计算和存储能力的服务模式。传统的移动应用通常在本地设备上进行计算和存储&#xff0c;而移动云将这些任务转移到云端进行处理。通过移动云&#xff0c;移动设备可以利用云端的高性能计算…...

C语言程序的编译

目录 一、预处理&#xff08;预编译&#xff09; 二、编译 三、汇编 四&#xff0c;链接 在前面讲到了宏的定义&#xff0c;那么宏在编译时候是如何发生替换的&#xff1f;接下来做一下详细的介绍C语言程序的编译过程主要包括以下几个步骤&#xff1a;预处理、编译、汇编和…...

滴滴三面 | Go后端研发

狠狠的被鞭打了快两个小时… 注意我写的题解不一定是对的&#xff0c;如果你认为有其他答案欢迎评论区留言 bg&#xff1a;23届 211本 社招 1. 自我介绍 2. 讲一个项目的点&#xff0c;因为用到了中间件平台的数据同步&#xff0c;于是开始鞭打数据同步。。 3. 如果同步的时候…...

深度学习之基于Yolov3的行人重识别

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 行人重识别&#xff08;Person Re-Identification&#xff0c;简称ReID&#xff09;是计算机视觉领域…...

防火墙最新技术汇总

防火墙技术持续发展&#xff0c;以应对日益复杂的网络安全威胁。以下是防火墙领域的一些最新技术汇总&#xff1a; 下一代防火墙&#xff08;NGFW&#xff09;&#xff1a;NGFW结合了传统防火墙的分组过滤和状态检测功能&#xff0c;还集成了深度包检测&#xff08;DPI&#xf…...

PikaUnsafe upfileupload

1.client check 客户端检测&#xff0c;前端js检测&#xff0c;禁用js和修改后缀名即可。 php格式不能上传&#xff0c;我们修改后缀上传。 蚁剑成功连接。 2.MIME type 这个就是 content-type 规定上传类型&#xff0c;上面的方法也能成功&#xff0c;也可以修改 conten-ty…...

git拉取项目前需要操作哪些?

1.输入 $ ssh-keygen -t rsa -C "秘钥说明" 按enter键 2.出现 ssh/id_rsa&#xff1a;(输入也可以不输入也可以) 然后按enter键 3.出现empty for no passphrase&#xff1a;(输入也可以不输入也可以) 然后按enter键 4.出现same passphrase again: (输入也可以不输入也…...

报名开启!2024 开源之夏丨Serverless Devs 课题已上线!

Serverless 是近年来云计算领域热门话题&#xff0c;凭借极致弹性、按量付费、降本提效等众多优势受到很多人的追捧&#xff0c;各云厂商也在不断地布局 Serverless 领域。 Serverless Devs 是一个由阿里巴巴发起的 Serverless 领域的开源项目&#xff0c;其目的是要和开发者们…...

DataBinding viewBinding(视图绑定与数据双向绑定)简单案例 (kotlin)

先上效果&#xff1a; 4个view的文字都是通过DataBinding填充的。交互事件&#xff1a;点击图片&#xff0c;切换图片 创建项目&#xff08;android Studio 2023.3.1&#xff09; Build.gradle(:app) 引入依赖库&#xff08;完整源码&#xff09; buildFeatures { vie…...

TensorFlow基于anaconda3快速构建

基于python构建太累 Installing Packages - Python Packaging User Guide 使用 pip 安装 TensorFlow 有兴趣自己学&#xff0c;我放弃了 -------------------------------------------------------- 下面基于anaconda 1、下载 Index of /anaconda/archive/ | 清华大学开…...

力扣72-编辑距离

题目链接 记忆化搜索&#xff1a; 解题关键&#xff1a;每次仅考虑两字符串word1、word2分别从0 - i修改成0-j下标的完全匹配(下标表示&#xff09; 临界条件&#xff1a;当 i 或 j 小于0时&#xff0c;表示该字符串为空&#xff0c;编辑距离确定为 y1 或 x1 int dp[501][501…...

K8S 删除pod的正确步骤

在日常的k8s运维过程中&#xff0c;避免不了会对某些pod进行剔除&#xff0c;那么如何才能正确的剔除不需要的pod呢&#xff1f; 首先&#xff0c;需要查出想要删除的pod # 可通过任意方式进行查询 kubectl get pods -A |grep <podname> kubectl get pods -n <names…...

羊大师分析,羊奶健康生活的营养源泉

羊大师分析&#xff0c;羊奶健康生活的营养源泉 羊奶&#xff0c;作为一种古老的饮品&#xff0c;近年来因其独特的营养价值和健康益处而备受关注。今天&#xff0c;羊大师就来探讨一下羊奶与健康之间的紧密联系。 羊奶富含蛋白质、脂肪、维生素和矿物质等多种营养成分。羊奶…...

刷屏一天GPT-4o,发现GPT4用的都还不熟练?戳这儿

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…...

力扣HOT100 - 139. 单词拆分

解题思路&#xff1a; 动态规划 class Solution {public boolean wordBreak(String s, List<String> wordDict) {Set<String> wordDictSet new HashSet(wordDict);boolean[] dp new boolean[s.length() 1];dp[0] true;for (int i 1; i < s.length(); i) {…...

rush 功能特性梳理

Rush 可以让 JavaScript 开发者更轻松地同时构建、发布多个 NPM 包&#xff0c;即将多个包或项目放到一个大仓库下管理。 仅需一次 NPM 安装 仅需一步&#xff0c;Rush 便可以将你项目的所有依赖安装到一个公共文件夹下&#xff0c;该文件夹并不像 “package.json” 一样位于项…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

sshd代码修改banner

sshd服务连接之后会收到字符串&#xff1a; SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢&#xff1f; 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头&#xff0c…...

EasyRTC音视频实时通话功能在WebRTC与智能硬件整合中的应用与优势

一、WebRTC与智能硬件整合趋势​ 随着物联网和实时通信需求的爆发式增长&#xff0c;WebRTC作为开源实时通信技术&#xff0c;为浏览器与移动应用提供免插件的音视频通信能力&#xff0c;在智能硬件领域的融合应用已成必然趋势。智能硬件不再局限于单一功能&#xff0c;对实时…...