【Python】函数的定义和调用、形参和实参、函数的返回值、多元赋值、全局和局部变量

文章目录

  • 函数的定义
  • 函数的调用
  • 形参和实参
  • 函数的返回值
    • 一个 return
    • 多个 return
      • 多元赋值
  • 变量作用域
      • 函数内的变量
      • 全局变量和局部变量
      • 修改全局变量

函数的定义

函数的定义:分配任务

def 函数名(形参列表):函数体return 返回值
  • defdefine,定义
  • 形参列表中,可以有多个形参,它们之间使用逗号分隔
  • 函数体要带一级缩进,带有缩进的代码,才能算是函数的内部语句
  • 函数执行到 return 就代表执行完了,后面跟的值就是函数的返回值。return 语句不是必须得,可有可无

函数的调用

函数的调用:开始完成任务

函数名(实参列表)
  • 实参列表,简称实参,此处写的实参的个数要和形参的个数匹配
def test():  print('hello')  print('hello')  print('hello')  
# 调用函数
test()"""
运行结果
hello
hello
hello
"""
  • 函数调用才会真正执行函数体里面的代码
  • 函数经过一次定义之后,可以被调用多次
  • Python 中要求,函数定义写在前面,调用在后面,“先定义,再使用

形参和实参

举一个例子:

我有一个朋友

高中的时候,是一个学霸
通过是一个非常漂亮的女生
他们的关系非常好,
但是因为一些原因,最终没能在一起


这个朋友,其实 就是我

  • 在这里面,“我有一个朋友“ 就是形参,“” 就是实参
  • 函数的调用是可以有多次的,每次调用的实参,也是可以不同的
  • 函数的实参,就是在函数调用的时候,要赋值给形参
def calcSum(beg, end):  theSum = 0  for i in range(beg, end + 1):  theSum += i  print(theSum)  # 求 1-100 的和  
calcSum(1,100)  
# 求 300-400 的和  
calcSum(300,400)"""
运行结果
5050
35350
"""

C++/Java 里面,不光要求实参和形参的个数要匹配,还要求类型也匹配。但是在 Python 里面,只要求个数,对类型没有要求(动态类型)

def test(x, y):return x + ytest(10, 20)
test(12.4, 11.5)
test('hello', 'world')"""
运行结果
30
23.9
helloworld
"""
  • 也不是说传入什么类型都可以,只要保证传入的参数类型,在函数体里面能够支持对应的运算操作即可(字符串和数字就不能一起)

函数的返回值

函数的参数可以视为是函数的 “输入”, 则函数的返回值, 就可以视为是函数的 “输出” .

此处的 “输入”, “输出” 是更广义的输入输出, 不是单纯指通过控制台输入输出.
我们可以把函数想象成一个 “工厂”. 工厂需要买入原材料, 进行加工, 并生产出产品.
函数的参数就是原材料, 函数的返回值就是生产出的产品.

一个 return

beg-end 之间的数的和:

def calcSum(beg, end):  theSum = 0  for i in range(beg, end + 1):  theSum += i  return theSum  result = calcSum(1,100)  
print(result)
  • 此处的求和代码,在 calcSum 内部只进行了计算,而把打印的逻辑放到了函数的外面,calcSum 把计算结果当做返回值,返回给“函数的调用者
    • 这里把函数里面算好的 5050 赋值给了 result 变量
    • 在实际开发中,一般更倾向于这种写法。
    • 一个通用的编程原则:一个函数只做一件事

解耦合

  • 在一个稍微复杂一点的程序中,经常会涉及到很多个模块,模块之间可能要进行交互
  • 交互就会带来耦合,我们希望通过良好的设计让耦合尽量低

  • 你和你的女朋友,耦合就比较强,一方产生变动,对另一方影响就非常大
    • 比如你的女朋友生病了,你就要去照顾她,去陪她
  • 你和你的其他普通女性朋友之间的耦合就几乎为 0,一方产生变动,对另一方几乎没啥影响
    • 如果这个朋友生病了,你肯定不会去照顾她,你甚至都不会知道

多个 return

一般多个 return 语句是搭配:分支语句/循环语句

def isOdd(num):  if num % 2 == 0:  return False  else:  return True  print(isOdd(10))  
print(isOdd(19))"""
运行结果
False
True
"""
  • isOdd 是在判断输入的数字是不是奇数
    • 是,返回
    • 不是,返回
def Odd(num):if num % 2 == 0:return Falsereturn True
  • 这个代码逻辑和上面的逻辑是等价的
  • 当函数执行到 return 的时候就不再继续向下执行了,而是回到了调用位置(函数结束了)
  • return True 写到 if 外面,意味着不管条件是否满足,都会执行 return True,但是仔细观察,就会发现当条件满足之后,if 里面有一个 return 了, 所以一旦条件满足,就会执行 if 里面的 return,函数就结束了,就没有机会执行到外面的 return

Python 中的一个函数可以返回多个值,是非常香的特征,C++/Java 都馋哭了

  • C++/Java 中调用一个函数一次只能返回一个值
  • C++要想返回多个值,可以通过输出型参数(指针/引用)
  • Java 要想返回多个值,需要把多个值给包装成一个对象,然后再返回这个对象

多元赋值

def getPoint():  x = 10  y = 20  return x, y  a, b = getPoint()
  • 这里就将 x 赋值给了 a,将 y 赋值给了 b

Golang 在设计的时候也把这个机制给引用进去了

虽然现在返回了多个值,但是我只想用其中一部分,不关注其他的

  • 可以使用 _ 来进行占位
def getPoint():  x = 10  y = 20  return x, y  _, b = getPoint()
  • 不要 x 了,只要 y,把 y 赋值给 b 即可

变量作用域

def getPoint():  x = 10  y = 20  return x, y  x, y = getPoint()
  • 在这个代码中, 函数内部存在 x, y, 函数外部也有 x, y.
  • 但是这两组 x, y 不是相同的变量, 而只是恰好有一样的名字.
  • 比如说,你喊你的女朋友“宝贝”,你的朋友喊他女朋友也是“宝贝”
  • 但是这两个“宝贝”是不同的,这是在各自不同的范围
  • 你喊你的女朋友“宝贝”,是在你俩的圈子里
  • 你朋友喊你的女朋友“宝贝”,是在他俩的圈子里
  • 你们俩在各自圈子里互不影响

函数内的变量

一个变量的有效范围是一定的,只在一个固定的区域内生效

函数内部的变量只在函数内部生效,出了函数就失效了

def getPoint():  x = 10  y = 20  return x, y  getPoint()  
print(x,y)

image.png|374

全局变量和局部变量

虽然名字相同,实际上是不同的变量.

x = 10  
def test():  x = 20  print(f'函数内部 x = {x}')  test()  
print(f'函数外部 x = {x}')"""
运行结果
函数内部 x = 20
函数外部 x = 10
"""
  • 外面的 x全局变量,是在整个程序中都有效的
  • 函数里面的 x局部变量,只在函数内部有效
x = 10  
def test():  print(f'x = {x}')  test()"""
运行结果
x = 10
"""
  • 在函数里读取全局变量是可以的
  • 当函数中尝试访问某个变量的时候,会先尝在局部变量中查找,如果找到,就直接访问
    • 如果没有找到,就向上一级作用域中进行查找,test 再往上一级,就是全局了

修改全局变量

如果是想在函数内部修改全局变量的值,需要使用 global 关键字声明

x = 10  
def test():  global x  x = 20  test()  
print(f'x = {x}')"""
运行结果
x = 20 
"""
  • 如果没有 global,此时就会把 x = 10 当做是在函数内部创建了一个局部变量 x,但实际上是要修改全局变量 x
  • 为了让函数里面知道这里的 x 是一个全局变量,就是用 global 关键字先声明一下

if,else,whilefor 这些关键字也会引入“代码块”,但是这些代码块不会对变量的作用域产生影响,上述语句中的代码块内部定义的变量,可以在外面被访问

for i in range(1, 3):  print(i)  print('---------------')  
print(i)"""
1
2
---------------
2
"""
  • C++/Java 中只要是 { } 就会影响到作用域,而 Python 不会,Python 中只有函数能影响作用域

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

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

相关文章

AI革新下的社交媒体:揭秘Facebook如何利用智能算法

在社交媒体领域,Facebook一直走在技术创新的前沿。随着人工智能(AI)的飞速发展,Facebook通过智能算法不断革新用户体验、提升平台效率,并推动社交互动的新形式。本文将详细探讨Facebook如何利用AI技术,从个…

ElasticSearch IK分词器的MySQL热部署字典(Docker)

1.下载插件源码 找到自己对应ES版本的下载 Releases infinilabs/analysis-ik GitHub 2.添加mysql驱动依赖 <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.16</version><…

C++模拟实现priority_queue(优先级队列)

一、priority_queue的函数接口 从上图我们可以看出&#xff0c; priority_queue也是一个容器适配器&#xff0c;我们使用vector容器来模拟实现priority_queue。 namespace bit{#include<vector>#include<functional>template <class T, class Container vector…

【数据结构】动态顺序表的实现

1.什么是数据结构 数据结构就是把数据元素按照一定的关系组织起来的集合&#xff0c;用来组织和存储数据。通过数据结构&#xff0c;能够有效的将数据组织和管理在一起&#xff0c;按照我们的方式任意对数据进行增删查改等操作。 2.数据结构的分类 数据结构大概可分为逻辑结构…

Selenium + Python 自动化测试19(补充-读取各种文件数据操作)

我们的目标是&#xff1a;按照这一套资料学习下来&#xff0c;大家可以独立完成自动化测试的任务。 上一篇我们讨论了数据驱动测试中如何完成重复的测试实例&#xff0c;今天我们补充一些读取各种文件的方法。 本篇文章我们讨论一下如何使用读取txt、CSV、Excel文件&#xff0…

14-17岁未成年如何办理能一直用的手机卡?

14-17岁未成年如何办理能一直用的手机卡&#xff1f; 有些姐妹要去外面上学&#xff0c;都想要一张属于自己的手机卡。 但是因为反诈的原因&#xff0c;对于手机卡的申领特别严格。 很多不满18岁的人能申领的卡&#xff0c;都是物联卡或者纯流量卡&#xff0c;只能上网&#x…

如何评估Redis的性能

如果系统中出现了大 key、热 key 等&#xff0c;往往会导致 Redis 变慢&#xff0c;但是这个慢该如何界定&#xff1f;多久算慢&#xff1f;1秒还是3秒&#xff1f; 这个肯定是没有标准答案&#xff0c;因为这个和你的硬件设备有关。 硬件差一些&#xff0c;平时响应时间都是…

css 宫格样式内容上下结构

结构 <div class"sc-content-group"><div class"sc-content-item"><div class"sc-item-img"><el-image :src"src" :preview-src-list"[src]"></el-image></div><div class"s…

前程无忧搜索接口 JS 逆向:阿里系acw_sc__v2和Sign加密

&#x1f4ca; 前程无忧搜索接口 JS 逆向&#xff1a;阿里系acw_sc__v2和Sign加密 &#x1f50d; 观察网页加密规律&#xff1a;阿里系acw_sc__v2 在分析前程无忧的搜索接口时&#xff0c;我们首先需要关注网页的加密规律。特别是阿里系的 acw_sc__v2 加密机制。这个加密机制通…

图论 最短路

文章目录 单源最短路朴素Dijkstra代码 堆优化Dijkstra代码 Bellman-ford代码 spfaspfa求最短路代码 spfa判断负环代码 多源最短路Floyd代码 单源最短路 朴素Dijkstra 给定一个 n n n 个点 m m m 条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c;所有边权均为正…

龙格-库塔法(Matlab实现)

四阶龙格-库塔法介绍 在各种龙格&#xff0d;库塔法当中有一个方法十分常用&#xff0c;以至于经常被称为“RK4”或者就是“龙格&#xff0d;库塔法”。该方法主要是在已知方程导数和初始值时&#xff0c;利用计算机的仿真应用&#xff0c;省去求解微分方程的复杂过程。 令初…

场景库之高精度地图编辑器

一、背景介绍 高精度地图编辑器是场景库生产所需的必要工具&#xff0c;地图编辑器基于JS开发&#xff0c;可对指定的地图进行描绘&#xff0c;生成数字高精度地图。 二、功能介绍 路网元素支持&#xff1a; 类别元素图片交叉口交叉口安全岛交通岛导流岛道路中心圈路口边缘线…

msvcp110.dll丢失修复?教你几招简单易懂的修复msvcp110.dll指南

msvcp110.dll错误通常出现在Windows操作系统中&#xff0c;表明系统缺少或损坏了该msvcp110.dll文件&#xff0c;这是Microsoft Visual C 2012 Redistributable程序包的一部分。下面列出了几种彻底解决此问题的全面方法&#xff0c;以确保解决从简单文件丢失到系统级问题的多种…

使用Intent在活动之间穿梭

文章目录 使用Intent在活动之间穿梭使用显式Intent使用隐式Intent更多隐式Intent的用法 使用Intent在活动之间穿梭 Intent是Android程序中各组件之间进行交互的一种重要方式&#xff0c;它不仅可以指明当前组件想要执行的动作&#xff0c;还可以在不同组件之间传递数据。Inten…

类的构造函数和显式与隐式转化函数

在这个示例中&#xff0c;Iterator类的构造函数是显式的&#xff0c;但通过定义类型转换函数operator Iterator()&#xff0c;你可以通过隐式类型转换来创建Iterator对象。 总之&#xff0c;如果你想要隐式构造一个迭代器对象&#xff0c;你可以将迭代器的构造函数声明为非显式…

Git 的基本使用

1.创建 Git 本地仓库 仓库是进⾏版本控制的⼀个⽂件⽬录。我们要想对⽂件进⾏版本控制&#xff0c;就必须先创建⼀个仓库出来&#xff0c;例如下面代码创建了gitcode_linux的文件夹&#xff0c;之后再对其进行初始化。创建⼀个 Git 本地仓库对应的命令为 git init &#xff0c…

Postman接口自动化之postman脚本编写

这是之前搞的接口自动化方案&#xff0c;已经在业务测试中实现了使用postman编写接口脚本&#xff0c;通过GitHubJenkinsemail html report实现了接口自动化&#xff0c;现在分块整理一下。 postman脚本编写 1、创建集合 和 目录&#xff1a; 一条业务线下的接口可以放到一个…

Docker离线安装

概述 Docker既可以在线安装&#xff0c;又可以离线安装。有时服务器不能连接互联网&#xff0c;只能采用离线安装的方式。 Docker的Linux发行包可以在https://download.docker.com/linux/下载。另外&#xff0c;国内有镜像网站&#xff0c;下载速度更快&#xff08;例如https…

联想电脑如何查看ip地址?详细介绍几种方法

随着互联网的普及和技术的飞速发展&#xff0c;IP地址已成为我们日常网络活动中不可或缺的一部分。无论是访问网站、远程办公还是进行网络游戏&#xff0c;IP地址都扮演着重要的角色。对于联想电脑用户来说&#xff0c;了解如何查看自己的IP地址是一项基本技能。虎观代理小二将…

[Linux] 认识系统服务(daemon)

参考&#xff1a;《鸟哥的Linux私房菜》 一、什么是 daemon 与服务&#xff08;service&#xff09; 在英语中的daemon就有守护进程&#xff0c;后台程序的意思。简单来说就是一直在后台运行的进程&#xff0c;我们就称之为服务(service)&#xff0c;或者是守护进程(daemon)。…