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.局部变量和全局变量
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.返回多个值
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.怀孕函数
怀孕函数就是函数内部又定义了一个函数。
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 文件读取(FileStream.Read)2.2 文件写入(FileStream.Write) 三、文件复制、移动和目录操作3.1 文件复制(FileStream.Copy)3.2 文件移动(…...
信息泄露--注意点点
目录 明确目标: 信息泄露: 版本软件 敏感文件 配置错误 url基于文件: url基于路由: 状态码: http头信息泄露 报错信息泄露 页面信息泄露 robots.txt敏感信息泄露 .get文件泄露 --判断: 搜索引擎收录泄露 BP: 爆破: 明确目标: 失能 读取 写入 执行 信息泄…...
位运算符
自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 位运算符是把数字看作二进制数来进行计算的,因此,需要先将要执行运算的数据转换为二进制,然后才能进行执行运算。…...
云上聚智——移动云云服务器进行后端的搭建及部署
什么是移动云 移动云是指将移动设备和云计算技术相结合,为移动应用提供强大的计算和存储能力的服务模式。传统的移动应用通常在本地设备上进行计算和存储,而移动云将这些任务转移到云端进行处理。通过移动云,移动设备可以利用云端的高性能计算…...
C语言程序的编译
目录 一、预处理(预编译) 二、编译 三、汇编 四,链接 在前面讲到了宏的定义,那么宏在编译时候是如何发生替换的?接下来做一下详细的介绍C语言程序的编译过程主要包括以下几个步骤:预处理、编译、汇编和…...
滴滴三面 | Go后端研发
狠狠的被鞭打了快两个小时… 注意我写的题解不一定是对的,如果你认为有其他答案欢迎评论区留言 bg:23届 211本 社招 1. 自我介绍 2. 讲一个项目的点,因为用到了中间件平台的数据同步,于是开始鞭打数据同步。。 3. 如果同步的时候…...
深度学习之基于Yolov3的行人重识别
欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 行人重识别(Person Re-Identification,简称ReID)是计算机视觉领域…...
防火墙最新技术汇总
防火墙技术持续发展,以应对日益复杂的网络安全威胁。以下是防火墙领域的一些最新技术汇总: 下一代防火墙(NGFW):NGFW结合了传统防火墙的分组过滤和状态检测功能,还集成了深度包检测(DPI…...
PikaUnsafe upfileupload
1.client check 客户端检测,前端js检测,禁用js和修改后缀名即可。 php格式不能上传,我们修改后缀上传。 蚁剑成功连接。 2.MIME type 这个就是 content-type 规定上传类型,上面的方法也能成功,也可以修改 conten-ty…...
git拉取项目前需要操作哪些?
1.输入 $ ssh-keygen -t rsa -C "秘钥说明" 按enter键 2.出现 ssh/id_rsa:(输入也可以不输入也可以) 然后按enter键 3.出现empty for no passphrase:(输入也可以不输入也可以) 然后按enter键 4.出现same passphrase again: (输入也可以不输入也…...
报名开启!2024 开源之夏丨Serverless Devs 课题已上线!
Serverless 是近年来云计算领域热门话题,凭借极致弹性、按量付费、降本提效等众多优势受到很多人的追捧,各云厂商也在不断地布局 Serverless 领域。 Serverless Devs 是一个由阿里巴巴发起的 Serverless 领域的开源项目,其目的是要和开发者们…...
DataBinding viewBinding(视图绑定与数据双向绑定)简单案例 (kotlin)
先上效果: 4个view的文字都是通过DataBinding填充的。交互事件:点击图片,切换图片 创建项目(android Studio 2023.3.1) Build.gradle(:app) 引入依赖库(完整源码) buildFeatures { vie…...
TensorFlow基于anaconda3快速构建
基于python构建太累 Installing Packages - Python Packaging User Guide 使用 pip 安装 TensorFlow 有兴趣自己学,我放弃了 -------------------------------------------------------- 下面基于anaconda 1、下载 Index of /anaconda/archive/ | 清华大学开…...
力扣72-编辑距离
题目链接 记忆化搜索: 解题关键:每次仅考虑两字符串word1、word2分别从0 - i修改成0-j下标的完全匹配(下标表示) 临界条件:当 i 或 j 小于0时,表示该字符串为空,编辑距离确定为 y1 或 x1 int dp[501][501…...
K8S 删除pod的正确步骤
在日常的k8s运维过程中,避免不了会对某些pod进行剔除,那么如何才能正确的剔除不需要的pod呢? 首先,需要查出想要删除的pod # 可通过任意方式进行查询 kubectl get pods -A |grep <podname> kubectl get pods -n <names…...
羊大师分析,羊奶健康生活的营养源泉
羊大师分析,羊奶健康生活的营养源泉 羊奶,作为一种古老的饮品,近年来因其独特的营养价值和健康益处而备受关注。今天,羊大师就来探讨一下羊奶与健康之间的紧密联系。 羊奶富含蛋白质、脂肪、维生素和矿物质等多种营养成分。羊奶…...
刷屏一天GPT-4o,发现GPT4用的都还不熟练?戳这儿
以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮,可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…...
力扣HOT100 - 139. 单词拆分
解题思路: 动态规划 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 包,即将多个包或项目放到一个大仓库下管理。 仅需一次 NPM 安装 仅需一步,Rush 便可以将你项目的所有依赖安装到一个公共文件夹下,该文件夹并不像 “package.json” 一样位于项…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
