python -【四】函数

函数

一、函数的基础

函数:是组织好的,可以重复使用的,用来实现特定功能的代码段

语法

def 函数名(入参):
    return 出参

# 定义函数
def out_hello():print('hello ~~~')# 调用/使用/执行函数
out_hello()

练习题

自定义一个函数,返回一个整型数字,输入一个字符串

# 定义函数
def convert(str_):print(f'输入的内容是:{str_}, 类型:{type(str_)}')return int(str_)# 执行函数
v = convert('123')
print(f'输出的内容是:{v}, 类型:{type(v)}')"""
输入的内容是:123, 类型:<class 'str'>
输出的内容是:123, 类型:<class 'int'>
"""

二、函数的参数

def add(x, y):z = x + yprint(f' {x} + {y} = {z}')add(5, 5)"""
x, y : 形参
5, 5: 实参
输出结果:5 + 5 = 10
"""

三、函数的返回值

def add(x, y):return x + yv = add(5, 5)
print(v)"""
输出结果:10
"""
def none_func_1():print('')def none_func_2():print('')return Noneres = none_func_2()
print(f'无返回值的函数返回结果是:{res}, 返回结果类型是:{type(res)}')
res2 = none_func_1()
print(f'无返回值的函数返回结果是:{res2}, 返回结果类型是:{type(res2)}')"""
无返回值的函数1返回结果是:None, 返回结果类型是:<class 'NoneType'>
无返回值的函数2返回结果是:None, 返回结果类型是:<class 'NoneType'>
"""

四、None 使用场景

None:在函数内,无论有没有写 return 语句,默认都是有 return 语句的,只是 return None

# 1. 声明变量的初始值为 None
name = None# 2. None 用于条件表达式
def check_age(age):if age >= 18:return 'SUCCESS'else:# 3. 函数的返回值return Noneresult = check_age(16)
# 表示 None 的时候进入,False 
if not result:print('未成年,无法入内 ...')

五、函数的注释

def add(x, y):"""两数之和:param x: x:param y: y:return: x + y"""z = x + yprint(f' {x} + {y} = {z}')

六、函数的嵌套

def func_1():print(1)def func_2():print(2)def func_3():print(3)def func():func_1()func_2()func_3()func()"""
1
2
3
"""

七、局部变量

局部变量:函数内的变量,作用在函数内,函数调用结束后局部变量失效

def test_num():num = 100# 正常输出print(f'函数内部 num={num}')test_num()
# NameError: name 'num' is not defined. Did you mean: 'sum'?
print(f'函数外部 num={num}')

八、全局变量

全局变量:函数内和函数外都能使用该变量

# 定义全局变量 num
num = 100# 函数内使用 num 变量
def test_num():print(f'函数内部 num={num}')# 执行 test_num 函数
test_num()
# 函数外部访问 num
print(f'函数外部 num={num}')

九、global 关键字

global 关键字作用:在函数体内修改全局变量,会导致该全局变量在外部无法文档修改后的内容,效果如下:

count = 200def read_count():print(f'read_count 函数内 count = {count}')def modify_count():count = 3000print(f'modify_count 函数内 count = {count}')# 1. 读取函数,count = 200
read_count()
# 2. 修改,count = 3000
modify_count()
# 3. count = 200 第二步种修改的无法作用到函数外
print(f'函数外 count = {count}')"""
read_count 函数内 count = 200
modify_count 函数内 count = 3000
函数外 count = 200
"""

在 modify_count 函数内,加上 global 关键字后
global 语法:global 被指定的全局变量名

count = 200def read_count():print(f'read_count 函数内 count = {count}')def modify_count():# 如下:将 count 本次的修改指向全局global countcount = 3000print(f'modify_count 函数内 count = {count}')read_count()
modify_count()
print(f'函数外 count = {count}')"""
read_count 函数内 count = 200
modify_count 函数内 count = 3000
函数外 count = 3000
"""

十、函数综合案例

"""
综合案例:ATM 机主菜单
----------主菜单-----------
张三,您好,欢迎进入 ATM 系统,请选择:
查询余额    [输入1]
取款       [输入2]
取款       [输入3]
退出       [输入4]
请输入您的选择:查询余额----------查询余额-----------
张三,您好,您的余额剩余:100元----------存款-----------
张三,您好,您存款 200元
张三,您好,您的余额剩余:300元----------取款-----------
张三,您好,您取款 200元
张三,您好,您的余额剩余:100元
"""money = 0def read_in(str_):return int(input(str_))def main_menu():menu = """----------主菜单-----------张三,您好,欢迎进入 ATM 系统,请选择:查询余额    [输入1]存款       [输入2]取款       [输入3]退出       [输入4]"""print(menu)def query_money():menu = f"""----------查询余额-----------张三,您好,您的余额剩余:{money}元"""print(menu)def save_money(m: float):global moneymoney += mmenu = f"""----------存款-----------张三,您好,您存款 {m}元张三,您好,您的余额剩余:{money}元"""print(menu)def draw_money(m: float):global moneymoney -= mmenu = f"""----------取款-----------张三,您好,您取款 {m}元张三,您好,您的余额剩余:{money}元"""print(menu)def main_func():while True:main_menu()op = read_in('请输入您的选择: ')if op == 1:query_money()elif op == 2:m = read_in('请输入您的存款金额: ')save_money(m)elif op == 3:m = read_in('请输入您的取款金额: ')draw_money(m)elif op == 4:breakprint('已退出ATM系统...')if __name__ == '__main__':main_func()

十一、函数多返回值

def multi_result():return 1, 2x, y = multi_result()
print(f'x={x}, y={y}')def multi_result_2():return 1, '哈哈哈', [1, 2, 3], Truea, b, c, d = multi_result_2()
print(f'a={a}, b={b}, c={c}, d={d}')"""
x=1, y=2
a=1, b=哈哈哈, c=[1, 2, 3], d=True
"""

十二、参数传递

函数 ‘建=值’ 传参


# 不能省略的参数
def params(name, age, worker):print(f'params函数内:name={name}, age={age}, worker={worker}')# 缺省参数:设置缺省参数必要让被指定的参数在形参列表中最后面,否则会报错,如下
# def params_2(name='王五', age, worker):
def params_2(name, age, worker='码农'):print(f'params_2函数内:name={name}, age={age}, worker={worker}')# 调用方式1,顺序传参
params('张三', 20, '码农')
# 方式2:k=v传参,无序顺序指定
params(age=25, worker='码农', name='张三')
# 缺省参数
params_2(age=30, name='李四')

不定长参数

不定长参数:
位置不定长:*args 元组
参数不定长:**kwargs k=v

# 位置不定长
def args_func(*args):print(f'位置不定长:{args}, 类型是:{type(args)}')# 参数不定长
def kwargs_func(**kwargs):print(f'参数不定长:{kwargs}, 类型是:{type(kwargs)}')args_func('张三', 18.0, '码农', ['alibaba', 'bytedance'])
kwargs_func(name='张三', age=18.0, worker='码农', company=['alibaba', 'bytedance'])"""
位置不定长:('张三', 18.0, '码农', ['alibaba', 'bytedance']), 类型是:<class 'tuple'>
参数不定长:{'name': '张三', 'age': 18.0, 'worker': '码农', 'company': ['alibaba', 'bytedance']}, 类型是:<class 'dict'>
"""

函数作为参数传递

"""
函数作为参数进行传递
"""def calc(x, y):return x + ydef test_calc(calc_func):print(f'calc的类型是:{type(calc_func)}')return calc_func(2, 1)res = test_calc(calc)
print(f'计算结果:{res}')

lambda 匿名函数

lambda 函数
语法:lambda 传入参数:函数体(一行代码)
lambda 函数体只能写一行,且不可重复调用

def test_lambda(add_func):print(f'add_func 的类型是:{type(add_func)}')return add_func(2, 1)# 调用匿名函数
result = test_lambda(lambda x, y: x + y)
print(f'匿名函数返回结果:{result}')# 定义多参数的匿名函数
def test_lambda_2(add_func):print(f'add_func 的类型是:{type(add_func)}')return add_func(2, 1, 3, 4)# 调用匿名函数
result = test_lambda_2(lambda x, y, z, a: x + y + z + a)
print(f'匿名函数返回结果:{result}')
result_2 = test_lambda_2(lambda x, y, z, a: x + y + z - a)
print(f'匿名函数返回结果:{result_2}')"""
calc的类型是:<class 'function'>
计算结果:3
add_func 的类型是:<class 'function'>
匿名函数返回结果:3
add_func 的类型是:<class 'function'>
匿名函数返回结果:10
add_func 的类型是:<class 'function'>
匿名函数返回结果:2
"""

十三、类型注释

13.1 基础类型的类型注解

帮助第三方 IDE 工具对代码进行类型推断,协助做代码提示
帮助开发者自身对变量进行类型注释
不会对程序有任何影响,只是作为提示,仅此而已

方式1:指定变量类型            语法:变量名:类型 = 值

方式2:使用注释指定类型     语法:i = 10 # type: int

"""
方式1:变量名:类型 = 值
"""# 容器的类型注解
my_list: list[int] = [1, 2, 3, 4]
my_tuple: tuple[str, int, bool] = ('a', 1, True)
my_set: set[int] = {1, 2, 3, 4}
my_dict: dict[str, int] = {'a': 1, 'b': 2}
my_str: str = '123456'# 基础类型的注解
va_1: int = 10
va_2: str = '123456'
va_3: bool = True
va_4: float = 2.3# 类的注解
class Path:passpa: Path = Path()
"""
方式2:i = 10 # type: int
"""m = random.randint(1, 100)  		# type: int
j = json.loads('{"name":"张三"}')  	# type: dict[str, str]def func():return 1f = func() 									 # type: int

13.2 函数的类型注解

# data: dict[str, int]  表示输入的类型是 dict[str, int]
#  idx: int  表示输入的类型是 int
# -> list[str]  表示返回值的类型是 list[str]
def func(data: dict[str, int], idx: int) -> list[str]:print(f'dict:{data}, idx:{idx}')return list(data.keys())

13.3 Union 类型注解

首先看一个例子:

my_list = [1, 2, 3, 4, '北京', 'GPT4', True]
以上的 my_list 是一个复合类型的容器,想要表述这种类型就需要用到 Union 类型的注解

from typing import Union# 在变量中展示
# 在变量中展示
my_list: list[Union[str, int, bool]] = [1, 2, 3, 4, '北京', 'GPT4', True]my_dict: dict[str, Union[str, int, bool]] = {'name': '张三','age': 20,'good_student': True
}# 在函数中展示
def func(data: Union[str, int]) -> Union[str, int]:return dataprint(f'func(1) 返回值类型是:{type(func(1))}') # func(1) 返回值类型是:<class 'int'>
print(f'func("哈") 返回值类型是:{type("哈")}') # func("哈") 返回值类型是:<class 'str'>

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

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

相关文章

如何配置才能连接远程服务器上的 redis server ?

文章目录 Intro修改点 Intro 以阿里云服为例。 首先&#xff0c;我在我买的阿里云服务器中以下载源码、手动编译的方式安装了 redis-server&#xff0c;操作流程见&#xff1a;Ubuntu redis 下载解压配置使用及密码管理 && 包管理工具联网安装。 接着&#xff0c;我…

Java中的ORM框架——myBatis

一、什么是ORM ORM 的全称是 Object Relational Mapping。Object代表应用程序中的对象&#xff0c;Relational表示的是关系型数据库&#xff0c;Mapping即是映射。结合起来就是在程序中的对象和关系型数据库之间建立映射关系&#xff0c;这样就可以用面向对象的方式&#xff0c…

【UE 反射】反射的原理是什么?如何使用机制?

目录 0 拓展0.1 静态类型检查0.1.1 静态类型检查的主要原理0.1.2 编译器的工作流程0.1.3 静态类型检查的优点和缺点0.1.4 示例0.1.5 C也可以在运行时类型检查RTTI基本原理RTTI的实现RTTI的工作流程RTTI的限制 0.2 运行时动态类型检查0.2.1 主要特点0.2.2 动态类型检查的实现0.2…

56.野指针和悬空指针

一.野指针 野指针指的是指针指向的地址是未知的&#xff08;随机的&#xff0c;不正确的地址&#xff09;。 二.野指针出现的几种情况 1.定义指针未初始化 #include <stdio.h>int main(void) {int *p;*p 1;printf("*p is %d\n",*p); } 正确写法&#xff1…

网页中的音视频裁剪拼接合并

一、需求描述 项目中有一个配音需求&#xff1a; 1&#xff09;首先&#xff0c;前台会拿到一个英语视频&#xff0c;视频的内容是A和B用英语交流&#xff1b; 2&#xff09;然后&#xff0c;用户可以选择为某一个角色配音&#xff0c;假如选择为A配音&#xff0c;那么视频在播…

命令行解析器浅解

1、什么叫解析器&#xff1f; 解析器&#xff08;parser&#xff09;是一种程序或组件&#xff0c;用于分析输入的数据&#xff0c;并将其转换为更易于处理的格式。解析器在计算机科学中有广泛的应用&#xff0c;特别是在编译器、解释器、自然语言处理和数据格式转换等领域。 1…

内存函数<C语言>

前言 前面两篇文章介绍了字符串函数&#xff0c;不过它们都只能用来处理字符串&#xff0c;C语言中也内置了一些内存函数来对不同类型的数据进行处理&#xff0c;本文将介绍&#xff1a;memcpy()使用以及模拟实现&#xff0c;memmove()使用以及模拟实现&#xff0c;memset()使用…

vue3学习(四)

前言 接上篇学习笔记&#xff0c;分享3个内置组件&#xff1a;动态组件、缓存组件、分发组件基本用法。大家一起通过code的示例&#xff0c;从现象理解,注意再次理解生命周期。 一、code示例 组件A&#xff1a;CompA <script setup> import {onMounted, onUnmounted} f…

[双指针] --- 快乐数 盛最多水的容器

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 算法Journey 本篇博客我们分享一下双指针算法中的快慢指针以及对撞双指针&#xff0c;下面我们开始今天的学习吧~ &#x1f3e0; 快乐数 &#x1f4d2; 题…

​用 ONLYOFFICE 宏帮你自动执行任务:介绍与教程

使用 ONLYOFFICE 宏&#xff0c;可以来自动实现一些操作节省更多时间和精力。在本文中&#xff0c;我们集合了一些关于宏的教程&#xff0c;带您了解宏的工作原理&#xff0c;以及一些实例展示。 什么是 ONLYOFFICE 宏 如果您是一名资深 Microsoft Excel 用户&#xff0c;那么…

python -【三】循环语句

循环语句 一、while 循环 while 语法 while 条件: 条件满足时&#xff0c;做事情 a 0 while a < 100:print(i like python ...)a 1求 1-100 的总和 i 1 sum 0 while i < 100:sum ii 1 print(f1-100 的和是 {sum})""" 1-100 的和是 5050 &qu…

BH-0.66 6000/5/150电流互感器 塑壳 JOSEF约瑟

BH-0.66 15/5塑壳式电流互感器 BH-0.66 20/5塑壳式电流互感器 BH-0.66 30/5塑壳式电流互感器 BH-0.66 40/5塑壳式电流互感器 BH-0.66 50/5塑壳式电流互感器 BH-0.66 75/5塑壳式电流互感器 BH-0.66 100/5塑壳式电流互感器 BH-0.66 150/5塑壳式电流互感器 BH-0.66 200/5塑壳式…

python——__future__模块

__future__模块是Python的一个特殊内建模块&#xff0c;它提供了一种方式来让程序员在当前版本的Python中使用未来版本的语言特性&#xff0c;从而帮助代码实现向前兼容。这意味着&#xff0c;即使你正在使用的是旧版本的Python&#xff0c;也可以通过导入__future__模块中的某…

BevDet(1): 算法原理介绍介绍

BevDet是一个LSS-Based的实时高性能的多相机3D检测模型,它用4阶段的范式去做3D目标检测,设计上同时支持Segmentation。何谓4阶段范式: 1.图像域的特征提取(Image -view Encoder)2.视角转换 (View Transformer)3.Bev空间特征提取(BEV Encoder)4.任务头Head它涉及 Image View …

202474读书笔记|《我自我的田渠归来》——愿你拥有向上的力量,一切的好事都应该有权利发生

202474读书笔记|《我自我的田渠归来》——愿你拥有向上的力量 《我自我的田渠归来》作者张晓风&#xff0c;被称为华语散文温柔的一支笔&#xff0c;她的短文很有味道&#xff0c;角度奇特&#xff0c;温柔慈悲而敏锐。 很幸运遇到了这本书&#xff0c;以她的感受重新认识一些事…

线程池在业务中的实践

文章目录 1. 业务背景 1. 业务背景 场景一&#xff1a; 快速响应用户请求 场景描述&#xff1a;比如说⽤户要查看⼀个商品的信息&#xff0c;那么我们需要将商品维度的⼀系列信息如商品的价格、优惠、库存、图⽚等等聚合起来&#xff0c;展示给⽤户。 分析&#xff1a;从用户角…

C++标准模板(STL)- C 内存管理库 - 分配并清零内存 (std::calloc)

C 内存管理库 分配并清零内存 std::calloc void* calloc( std::size_t num, std::size_t size ); 分配 num 个大小为 size 的对象的数组&#xff0c;并初始化所有位为零。 若分配成功&#xff0c;则返回指向为任何对象类型适当对齐的&#xff0c;被分配内存块最低&#xf…

大数据Scala教程从入门到精通第十篇:Scala在IDEA中编写Hello World代码的简单说明

一&#xff1a;代码展示 object Main {def main(args: Array[String]): Unit {//SCALA中可以不写;//绿色的小三角达标的是这个类中有一个MAIN方法代表是可以执行的。//ctrl shift f10可以直接运行println("Hello world!")//Java中的类库我们可以直接使用System.o…

TH方程学习(1)

一、背景介绍 根据CW方程的学习&#xff0c;CW方程的限制条件为圆轨道&#xff0c;不考虑摄动&#xff0c;二者距离相对较小。TH方程则可以将物体间的相对运动推广到椭圆轨道的二体运动模型&#xff0c;本部分将结合STK的仿真功能&#xff0c;联合考察TH方程的有用性&#xff…

TransFormer学习之基础知识:STN、SENet、CBAM、Self-Attention

1.空间注意力机制STN 参考链接&#xff1a;STN(Spatial Transformer Networks) 参考链接&#xff1a;通俗易懂的Spatial Transformer Networks(STN) 核心动机&#xff1a; 在空间中捕获重要区域特征(如图像中的数字)&#xff0c;将核心区域进行放大居中&#xff0c;使得结果更…