Python学习笔记(6)

Python学习笔记(6)

  • 第13节课 函数基础
    • 1.函数定义与调用
    • 2.函数的返回值
    • 3.局部变量与全局变量

第13节课 函数基础

对于任何一个知识点,必须讨论的三个问题:

(1)它是啥

(2)为啥有它

(3)它能干哈

  • 注释:注解说明程序代码;帮助程序员提高代码的阅读性、可读性;单行、多行
  • 内置基本数据类型:就是程序中最基础的计算单元
  • 运算符:就是提供方式来计算数据单元
  • 关键字:程序中提供的具有特殊含义的单词,为了提供最基本的程序功能,定义数据类型、提供程序结构
  • 标识符:为程序当中自定义的一些数据进行命名(变量、函数、对象、类),方便调用\引用数据
  • 循环:处理重复执行代码,这些代码之间必须是有规律性的,降低代码量,减少代码冗余。
  • 内置函数\内置模块:int()、print()、input()…random time math ,就是Python中提前封装好的一些功能/工具,可以方便用户快速调用,实现程序逻辑,而不需要用户从新开始创建该功能,“避免重复造轮子”。但是,用归用,最为初学者,我们必须要懂得底层的逻辑。

1.函数定义与调用

函数也是用于处理重复性代码问题的,这些代码是具有独立功能性的,我们可以将这些类似的代码进行一次封装(函数),之后再想去实现同样的功能时,可以直接复用曾经写到的这个函数。

image-20250323194450271

在Python中如何定义函数,语法结构:

def 函数名(参数列表):函数体return 返回值def sum(a, b):return a + b
  • def :定义函数的关键字
  • 函数名:自定义的函数名称,规则与标识符一致的;所有单词字母小写,单词之间用下划线分隔。
  • 参数列表:就是给函数传递的一些原始数据,函数根据这些数据去做具体的计算。参数可以不指定数据类型。
  • 函数体:就是上述说的具体的计算,今后在编写函数时,一定要注意缩进的问题
  • return:直译 返回,实际上表示结束函数(将函数进行弹栈操作),如果有返回值的话则将结果返回给函数的调用者,如果没有返回值的话return可以不写,但不代表不存在,它是隐藏的
  • 返回值:就是程序计算的结果,需要给调用者传递结果的话,就将结果写在return之后即可。

在C语言中:

int sum(int a, int b) {return a + b;
}
  • int:返回值类型 就是计算结果的数据类型
  • sum:函数名
  • int a, int b:参数列表,表示传递两个整数数字 -> 形式参数
  • return a + b:结束函数同时将计算的结果返回给调用者的

如果给Python函数指定数据类型的话:

今后在校招笔试题当中,编程题的Python代码,大部分都会指定参数和返回值类型

def sum(a:int, b:int) -> int:return a + b
  • a:int, b:int:指定形式参数的类型
  • -> int:指定返回值的类型
def sumA(a, b):return a + bdef sumB(a:int, b:int) -> int:return a + bres = sumA(1,3)
print(res)
print(sumA(3.14, 5.34))
print(sumA("Hello", "Wolrd"))res = sumB(1,3)
print(res)
print(sumB(3.14, 5.34))
print(sumB("Hello", "Wolrd"))

可以发现,上述代码中sumA和sumB的运行结果是一致的,sumB中指定参数类型和指定返回值类型实际上没有效果的,这么写的目的就是为了方便调用者了解函数的参数和返回值的情况,提供建议,方便调用使用,而不是强制要求类型,增加了函数代码的可读性

def kajsbhgdjhahsdjvgja(a, b, c):passdef 根据三边计算三角形面积(a, b, c): 

NameError: name ‘is_prime’ is not defined

函数必须先定义后调用!!!

判断素数

# 关于函数返回值为布尔类型情况下,函数名的规范问题
# 以is开头 增加可读性
print(is_prime(13)) # NameError: name 'is_prime' is not defined
def is_prime(num):for i in range(2, num // 2 + 1):if num % i == 0:return Falsereturn True
print(is_prime(12))

在Python中实际上没有主函数的(程序的入口),Python的执行是从第一行代码开始逐行执行。如果非要写主函数的话,也可以这么操作:

  • 假main():依旧是我们自定义的函数,模拟模仿一下主函数的功能
def main():num1 = 12num2 = 13print(is_prime(num1)) # NameError 执行到此处时并没有发现is_prime的定义print(is_prime(num2))
main()
def is_prime(num):for i in range(2, num // 2 + 1):if num % i == 0:return Falsereturn True
# 以下代码不报错的原因在于:两个函数的定义都已经确定了,无非就是执行顺序的问题
def main():num1 = 12num2 = 13print(is_prime(num1))print(is_prime(num2))
def is_prime(num):for i in range(2, num // 2 + 1):if num % i == 0:return Falsereturn True
main()
  • 以模块的形式测试执行
def is_prime(num):for i in range(2, num // 2 + 1):if num % i == 0:return Falsereturn True# 目前为止,简单认为是主函数
if __name__ == "__main__":num1 = 12num2 = 13print(is_prime(num1))print(is_prime(num2))

2.函数的返回值

一般有三种情况:

  • 无返回值:实际上是有返回值的 None
def printName(name):print(name)returnret = printName("Hello")
print(type(ret))
  • 单返回值:不多说,看上面的例子

  • 多返回值:在C\Java中,如果需要多返回值的话,一般都是将数据封装在一个数组或类似的序列当中,把数组或类似的序列当成一个单返回值返回的。

# Java
public int[] getPoint() {# 获取一个坐标点 x, y# return x, y; # 错误的return new int[]{x, y};
}
# Python
def get_point():# 返回坐标点的x和y数据的话x = 10y = 12return x, yx, y = get_point()
print(x, y)# 接受变量的个数必须与返回的个数一致!
# ValueError: not enough values to unpack (expected 3, got 2)
x, y, z = get_point()
print(x, y, z)
def get_point():# 返回坐标点的x和y数据的话x = 10y = 12return x, yret = get_point()
print(ret)
print(type(ret))
# (10, 12)
# <class 'tuple'>

实际上多返回值的思路和C\Java当中的一样,都是是将多数据进行了封装,Python是以元组的方式进行多返回值封装的。

a, b, c = map(int,input("输入三个数字:").split(" "))
print(a,b,c)ret = map(int,input("输入三个数字:").split(" "))
print(ret)
print(type(ret)) # 以map映射的方式返回的
# <map object at 0x0000017431ADA140>
# <class 'map'>ret = eval(input("输入三个数字:"))
print(ret)
print(type(ret))
# (1, 2, 3)
# <class 'tuple'>

3.局部变量与全局变量

  • 全局变量:定义在函数外部的变量,作用域是整个程序文件,即就是在文件的任何函数内部都可以访问的。
  • 局部变量:定义在函数内部的变量,作用域是所属的函数,只能在函数内部调用,外面访问不到。
num = 10 # 全局变量 创建
def show():num = 20 # 局部变量 创建print(num) # 局部变量 输出20show()
print(num) # 全局变量 输出10
####################################
num = 10
def show():num = 10 # 局部 创建# UnboundLocalError: cannot access local variable 'num' where it is not associated with a value# 程序认为num是局部变量 这里给局部变量进行了 += -> num = num + 10 前提需要num有定义或者值num += 10 # 局部 修改 但是局部没有初始化print(num)show()
print(num)
####################################
num = 10
def show():global num # 声明该函数中的num是全局变量num = 20num += 20print(num) # 40show()
print(num) # 40
####################################
numA = 10   # 全局 创建
def show():numA = 20 # 局部 创建numB = 30 # 局部 创建print(numA, numB) # 20 30
show()
# NameError: name 'numB' is not defined. Did you mean: 'numA'?
print(numA, numB) # numA全局 程序认为numB全局 但是没找到定义 所以报错
# 反推出 函数中的局部在外部访问不到
####################################
num1 = 10 # 全局 创建
num2 = 20 # 全局 创建
def show(num1, num2): # 形式参数 也是函数内部的局部变量 创建并赋值# 简单理解为 函数内部如果没有global声明,一律当做局部看待num1 = 30   # 局部 修改num2 = 40   # 局部 修改print(num1 + num2) # 70returnshow(num1, num2) # 实际参数 调用了全局的num1和num2 将值 传递给 形式参数
print(num1 + num2) # 全局
####################################
num1 = 10 # 全局 创建
num2 = 20 # 全局 创建
def show(num1, num2): # 形式参数 也是函数内部的局部变量 创建并赋值# 全局变量和局部变量同时在函数中使用时 全局和局部不要重名!global num1 # SyntaxError: name 'num1' is parameter and globalnum1 = 30   num2 = 40   # 局部 修改print(num1 + num2) # 70returnshow(num1, num2) # 实际参数 调用了全局的num1和num2 将值 传递给 形式参数
print(num1 + num2) # 全局####################################
num = 10
def show():# 分不清局部和全局的话 重点突看 num 在函数中 有无定义 默认全局print(num) # 一般不推荐使用 会造成变量二义性
show()

总结:

  • 函数内部要使用全局变量时,进行全局声明 global
  • 函数内部但凡没有 global,变量一律当局部处理
  • 全局变量和局部变量同时在函数中使用时,不能重名
  • 形式参数一律都是函数内部的局部变量
  • 实际参数仅仅是将**“址”**传递给了形式参数

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

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

相关文章

RISC-V AIA学习2---IMSIC

我在学习文档这章时&#xff0c;对技术术语不太理解&#xff0c;所以用比较恰当的比喻来让自己更好的理解。 比较通俗的理解&#xff1a; 将 RISC-V 系统比作一个工厂&#xff1a; hart → 工厂的一条独立生产线IMSIC → 每条生产线配备的「订单接收员」MSI 中断 → 客户通过…

目标检测20年(一)

今天看的文献是《Object Detection in 20 Years: A Survey》&#xff0c;非常经典的一篇目标检测文献&#xff0c;希望通过这篇文章学习到目标检测的基础方法并提供一些创新思想。 论文链接&#xff1a;1905.05055 目录 一、摘要 1.1 原文 1.2 翻译 二、介绍 三、目标检测…

AI Agent开发大全第八课-Stable Diffusion 3的本地安装全步骤

前言 就像我们前面几课所述,本系列是一门体系化的教学,它不像网上很多个别存在的单篇博客走“吃快餐”模式,而是从扎实的基础来带领大家一步步迈向AI开发高手。所以我们的AI课程设置是相当全面的,除了有牢固的基础知识外还有外面互联网上也搜不到的生产级实战。 前面讲过…

Hadoop集群搭建(hdfs、yarn)

Hadoop 是 Apache 软件基金会旗下的一个开源项目&#xff0c;是用于处理大数据的分布式系统基础架构&#xff0c;被广泛应用于大数据存储、处理和分析等场景。 一、核心组件 1、Hadoop 分布式文件系统&#xff08;HDFS&#xff09; 具有高容错性&#xff0c;能在低成本硬件上…

数据结构——顺序栈seq_stack

前言&#xff1a;大家好&#x1f60d;&#xff0c;本文主要介绍了数据结构——顺序栈 目录 一、概念 1.1 顺序栈的基本概念 1.2 顺序栈的存储结构 二、基本操作 2.1 结构体定义 2.2 初始化 2.3 判空 2.4 判满 2.5 扩容 2.6 插入 入栈 2.7 删除 出栈 2.8 获取栈顶元…

数据结构初阶-二叉树的应用

1.单值二叉树 题目链接&#xff1a;https://leetcode.cn/problems/univalued-binary-tree/description/ 题目思路&#xff1a;我们把根结点与左孩子和右孩子进行比较&#xff0c;只有左右子树都是单值二叉树的时候才为单值二叉树。但是我们需要先返回的是false&#xff0c;最…

【网络层协议】NAT技术内网穿透

IP地址数量限制 我们知道&#xff0c;IP地址&#xff08;IPv4&#xff09;是一个4字节32位的整数&#xff0c;那么一共只有2^32也就是接近43亿个IP地址&#xff0c;而TCP/IP协议栈规定&#xff0c;每台主机只能有一个IP地址&#xff0c;这就意味着&#xff0c;一共只有不到43亿…

快速入手-基于Django的mysql配置(三)

Django开发操作数据库更简单&#xff0c;内部提供了ORM框架。比如mysql&#xff0c;旧版本用pymysql对比较多&#xff0c;新的版本采用mysqlclient。 1、安装mysql模块 pip install mysqlclient 2、Django的ORM主要做了两件事 &#xff08;1&#xff09;CRUD数据库中的表&am…

ETL:数据清洗、规范化和聚合的重要性

在当今这个数据呈爆炸式增长的时代&#xff0c;数据已成为企业最为宝贵的资产之一。然而&#xff0c;数据的海量增长也伴随着诸多问题&#xff0c;如数据来源多样、结构复杂以及质量问题等&#xff0c;这些问题严重阻碍了数据的有效处理与深度分析。在此背景下&#xff0c;ETL&…

【leetcode hot 100 208】实现Trie(前缀树)

解法一&#xff1a;字典树 Trie&#xff0c;又称前缀树或字典树&#xff0c;是一棵有根树&#xff0c;其每个节点包含以下字段&#xff1a; 指向子节点的指针数组 children。对于本题而言&#xff0c;数组长度为 26&#xff0c;即小写英文字母的数量。此时 children[0] 对应小…

PyTorch生成式人工智能实战:从零打造创意引擎

PyTorch生成式人工智能实战&#xff1a;从零打造创意引擎 0. 前言1. 生成式人工智能1.1 生成式人工智能简介1.2 生成式人工智能技术 2. Python 与 PyTorch2.1 Python 编程语言2.2 PyTorch 深度学习库 3. 生成对抗网络3.1 生成对抗网络概述3.2 生成对抗网络应用 4. Transformer4…

vue中上传接口file表单提交二进制文件流

1.使用elementui上传组件 要做一个选择文件后&#xff0c;先不上传&#xff0c;等最后点击确定后&#xff0c;把file二进制流及附加参数一起提交上去。 首先使用elementui中的上传组件&#xff0c;设置auto-uploadfalse&#xff0c;也就是选择文件后不立刻上传。 <el-uplo…

深入解析 Java Stream API:筛选根节点的优雅实现!!!

&#x1f680; 深入解析 Java Stream API&#xff1a;筛选根节点的优雅实现 &#x1f527; 大家好&#xff01;&#x1f44b; 今天我们来聊聊 Java 8 中一个非常常见的操作&#xff1a;使用 Stream API 从 List 中筛选出特定条件的元素。&#x1f389; 具体来说&#xff0c;我…

推荐1款简洁、小巧的实用收音机软件,支持手机和电脑

聊一聊 没想到现在还有人喜欢听广播。 我一直以为听广播必须要用那种小广播机才可以。 原来手机或电脑上也是可以的。 今天给大家分享一款可以在电脑和手机上听广播的软件。 软件介绍 龙卷风收音机 电台广播收音机分电脑和手机两个版本。 电脑端无需安装&#xff0c;下载…

金桔网桥路由版3

上一集我们讲到了二层云交换机&#xff0c;我把在云上搭建的桥接模式的VPN服务器称为二层云交换机。 那么现在我家到办公室的网络结构就变成这样的&#xff0c; 这样的好处就是我的电视盒子通过网线看电视&#xff0c;走的是OpenWrt路由器通过二层云交换机由办公室的OpenWrt路由…

常见中间件漏洞攻略-Tomcat篇

一、 CVE-2017-12615-Tomcat put方法任意文件写入漏洞 第一步&#xff1a;开启靶场 第二步&#xff1a;在首页抓取数据包&#xff0c;并发送到重放器 第三步&#xff1a;先上传尝试一个1.txt进行测试 第四步&#xff1a;上传后门程序 第五步&#xff1a;使用哥斯拉连接 二、后…

计算机复试面试

数据库 1.设计过程/设计步骤 1.需求分析&#xff1a;明确客户需求&#xff0c;确定系统边界&#xff0c;生成数据字典 2.概念结构设计&#xff1a;将用户需求抽象为概念模型&#xff0c;绘制e-r图 3.逻辑结构设计&#xff1a;将e-r图转化为dbms相符合的逻辑结构&#xff0c;db…

【零基础学python】python基础语法(一)

前言&#xff1a;Python 是当今最受欢迎的编程语言之一&#xff0c;其广泛应用于 人工智能、数据科学、Web 开发、自动化 等多个领域。它以 简洁的语法、强大的标准库 和 跨平台兼容性 深受开发者喜爱。作为 机器学习和大数据的首选语言&#xff0c;Python 在学术研究、金融分析…

数据类设计_图片类设计之8_自由图形类设计_(前端架构)

前言 学的东西多了,要想办法用出来.C和C是偏向底层的语言,直接与数据打交道.尝试做一些和数据方面相关的内容 引入 前面的内容都是矩阵图形类,现在讨论自由图形类设计 矩阵图形类和自由图形类的差别 左图为矩阵图形类对象,右图为自由图形类对象.矩阵图形类对象单独占据一个矩…

【学习记录】大模型微调之使用 LLaMA-Factory 微调 Qwen系列大模型,可以用自己的数据训练

一、LoRA微调的基本原理 1、基本概念 LoRA&#xff08;Low-Rank Adaptation&#xff09;是一种用于大模型微调的技术&#xff0c;通过引入低秩矩阵来减少微调时的参数量。在预训练的模型中&#xff0c;LoRA通过添加两个小矩阵B和A来近似原始的大矩阵ΔW&#xff0c;从而减少需…