python学习笔记 -- 函数

目录

一. 函数的定义和调用

二. 函数的返回值

三. 变量的作用域

四. 函数的链式调用

五. 函数的嵌套调用

六. 函数的递归调用

七. 函数参数的默认值

八. 关键字传参


一. 函数的定义和调用

函数,指一段可以被重复调用的代码。在python中,函数定义的语法如下:

def 函数名称(参数列表):

        函数体

        return 返回值   # 可以省略

如下代码,定义函数calcSum,获取从buttom ~ upper的累加,并调用函数计算1~100的累加。

函数定义和调用注意事项:

  • 函数定义要在函数调用之前。
  • 函数的形参个数和与实参保持一致。

函数调用的语法格式:

  • 函数名称(实参列表)
  • 返回值 = 函数名称(实参列表)
def calcSum(buttom, upper):ret = 0for i in range(buttom, upper + 1):ret += ireturn retprint(calcSum(1, 100))

对于实参的格式,python不像C/C++这般严格,但是,要保证传给函数的实参能够进行函数中的全部运算。如下面的代码,定义函数add(x,y),在函数内部计算x+y并输出结果,可以传递两个整形数据,也可以传两个字符串类型数据,但是传一个整形一个字符串就不可以。

def add(x, y):print(f'{x} + {y} = {x + y}')add(10, 20)            # 10 + 20 = 30
add('Hello', 'World')  # Hello + World = HelloWorld# TypeError: unsupported operand type(s) for +: 'int' and 'str'
# add(10,'aaa') 

二. 函数的返回值

与C/C++中的函数只能有一个返回值不同,python的函数允许有多个返回值,接收多个返回值的语法,类似于多元赋值。

函数返回多个值的语法:return VAL1, VAL2, ...

接收多个函数返回值的语法:val1,val2,... = 函数名(实参列表)

如果希望只接受多个返回值中的一个,则可以用下划线('_') 来占位表示省略。如 _, y = Func() 表示只接受Func函数的第二个返回值。

如下代码,定义了getPoint函数,返回两个值x,y,并对函数返回值进行接收。

def GetPoint():x = input('请输入x的值:')y = input('请输入y的值:')return x, yx1, y1 = GetPoint()   # 获取GetPoint函数的两个返回值
_, y2 = GetPoint()    # 只获取GetPoint函数的第二个返回值print(f'x1 = {x1}, y1 = {y1}')
print(f'y2 = {y2}')

三. 变量的作用域

在python中,定义在函数内部的变量为局部变量,定义在函数外的变量为全局变量。

如下代码,在全局定义变量x=10,在test函数内部定义语句x=20,当在函数内部使用每个变量时,会现在局部查找是否有这个变量,如果有,那么就使用局部变量,如果没有,就向外层查找使用的变量。

x = 10   # 全局变量xdef test():x = 20   # 属于test作用域的局部变量print(f'x = {x}')  # 输出局部变量值x = 20test()
print(f'x = {x}')  # 输出全局变量值x = 10

如果希望在函数内部对全局变量进行控制,那么需要使用global关键值声明变量为全局变量。

global关键字:声明变量为全局属性。

x = 10   # 全局变量xdef test():global x   # global关键字声明全局变量x = 20     # 将全局变量x的值更改为20test()
print(f'x = {x}')   # x = 20

注意:在C/C++中,定义在for、while、if 等后面跟随的{ }表示的作用域中的变量,无法在{ }外面调用。但是,在python中,定义在for、while、if作用域内的变量,可以在其外面被调用。当然,无论是C/C++还是python,定义在函数内部的局部变量都不能在函数外面被调用。

for i in range(1, 11):x = 100print(f'i = {i}')    # i = 10
print(f'x = {x}')    # x = 100

四. 函数的链式调用

链式调用:一个函数的返回值,作为另一个函数的参数。

如下代码,在调用test函数时,使用add函数的返回值作为实参。

def add(x, y):return x + ydef test(x, y):print(f'x = {x}')print(f'y = {y}')# 链式调用,使用add函数的返回值充当test函数的实参
test(add(10, 20), add(30, 50))

五. 函数的嵌套调用

嵌套调用:一个函数内部调用另一个函数。

如下代码,函数c中调用函数b,函数b中调用函数a,就是典型的函数嵌套调用。

def a():print('a')def b():a()print('b')def c():b()print('c')# 函数c中调用函数b, 函数b中调用函数a
c()

使用pyCharm的调试功能,可以查看函数调用的栈中情况,如图5.1为开启调试的方法:单击鼠标右键,选择Debug 'XXX',开始进行调试。

图5.1 以调试方法运行程序

开启调试后,程序首先运行至第一个断点位置,使用如下两个按键进行逐语句调试:

  • Step Over (F8):遇到函数调用不进入函数。
  • Step Into (F7):遇到函数调用就进入函数运行。
图5.2 pyCharm调试代码

六. 函数的递归调用

函数的递归调用,即:函数自己调用自己。编写递归函数时,有以下几点注意事项:

  • 要有递归终止条件。
  • 在递归调用中要越来越靠近终止条件。
  • 递归层次不能太深,以防栈溢出。

如下代码,使用递归的方法编写函数,计算n!。

def factorial(n):if n == 1:return 1return n * factorial(n - 1)print(factorial(5))

递归的优点:代码编写简单。

递归的缺点:

  • 执行过程复杂,程序运行效率低。
  • 如果递归层次过深,容易出现栈溢出问题。

一般来说,使用递归编写的代码,都可以使用循环来替代。

七. 函数参数的默认值

在C++中,函数定义是支持缺省参数的,即:如果不显示给定实参的值,就采用默认的值。在python中,缺省参数同样也是被支持的,并且与C++一样,带有缺省值的形参必须放在函数的参数列表最右侧

如下代码所示,定义add函数,并引入缺省参数debug,默认为False,调用时若不显示给定debug的值,那么就默认为False,显示给定就采用给定的值。

def add(x, y, debug = False):if debug == True:print(f'x = {x}, y = {y}')return x + yprint(add(10, 20))
print(add(100, 200, True))

八. 关键字传参

对于C/C++,必须保证调用函数时的实参与对应形参在函数参数列表中的位置一一对应,这种传参的方法称为位置传参。

python在C/C++的基础之上,引入了关键字传参,关键字传参,通过指定形参的名称来传递参数,如下代码,定义函数test(x, y),并通过关键字传参进行调用。

def test(x, y):print(f'x = {x}, y = {y}')# 关键字传参调用函数
test(x=10, y=20)
test(y=20, x=10)

python支持位置传参与关键字传参共同使用,共同使用时必须保证位置参数在前,关键字参数在后。如下代码,定义函数test(x, y, z),通过语句test(10, z=30, y=20)调用函数,形参x在形参列表的第一个位置,可以进行位置传参,后面两个参数则通过关键字传参。

def test(x, y, z):print(f'x = {x}, y = {y}, z = {z}')# 关键字传参调用函数
test(10, z=30, y=20)

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

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

相关文章

Redis系列之持久化机制RDB和AOF

Redis系列之持久化机制RDB和AOF 文章目录 1. 为什么需要持久化?2. 持久化的方式3. RDB机制3.1 RDB机制介绍3.2 配置RDB3.3 什么时候触发3.4 操作实例3.5 RDB优势和不足 4. AOF机制4.1 什么是AOF机制?4.2 同步机制4.3 重写机制4.4 AOF的优势和不足 混合模…

简单使用国产数据库—达梦

达梦数据库是一款由中国的达梦软件公司开发的关系数据库管理系统(RDBMS),它在业界以其高性能、可扩展性和安全性而著称。该系统广泛应用于各种应用程序的数据存储和管理,满足用户对于数据处理和管理的多样化需求。 安装好的达梦数…

119.龙芯2k1000-pmon(18)-全自动安装linux系统

经过两天的测试和完善,现在基本已经正常可用了。 (全自动是假,接近全自动吧。) 需要使用配测电脑的网络功能,windows即可,脱离linux虚拟机。(理论上讲u盘也是可以的) 测试平台&…

客户案例|100M 768 维向量数据,Zilliz Cloud 稳定支持 Shulex VOC 业

日前,国际化 VOC SaaS 公司数里行间(Shulex)将上亿数据量的核心业务从开源向量数据库 Milvus 迁移至全托管的向量数据库云服务 Zilliz Cloud。 相比于 Milvus,Zilliz Cloud 实现了 Shulex VOC 评论分析洞察报告生成速度 30% 的提升…

AI 驱动的医疗变革:迈向未来医疗新生态

直面呼啸而来的人工智能,医疗行业将首当其冲,发生翻天覆地的变化。美国心脏病学家兼基因学教授埃里克托普在《未来医疗》中预测,未来人类将拥有“健康小助手”——个人医疗数据和处理能力,还能轻松预防疾病。诸多评论家也持类似观…

南京观海微电子---快速上手DDR读写例程——DDR接口专栏(三)

1. 前言 本文将向大家介绍如何使用DDR IP核的Native接口来对DDR进行读写操作。 2. DDR IP核接口介绍 要想把DDR3 IP核使用起来,必先需要了解下该IP核有哪些接口。DDR3 IP核接口图如下所示。注:图中展示的为DDR IP的Native接口,除了Native接…

javaEE8(数据库编程课后习题1,2)

一&#xff1a; 二&#xff1a; 数据库内信息&#xff1a; 登录&#xff1a; 注册&#xff1a; Register.jsp <% page pageEncoding"UTF-8" import"java.sql.*"%> <!DOCTYPE html> <html lang"en"> <head> <…

未知生,焉知死!小动物S了,如何处理?一个人一生该坚持的几件事——早读(逆天打工人爬取热门微信文章解读)

天地不仁&#xff0c;以万物为刍狗 引言Python 代码第一篇 人民日报 【夜读】一个人一生该坚持的几件事第二篇 人民日报 来了&#xff01;新闻早班车要闻社会政策 结尾 “未知生&#xff0c;焉知死” 曾经视为定数的冰冷生命 在热烈的内心烛照下 应当焕发出滚烫的热情 唯有热爱…

注意力、自注意力和多头注意力的区别

本文作者&#xff1a; slience_me 注意力、自注意力和多头注意力的区别 理解注意力&#xff08;Attention&#xff09;、自注意力&#xff08;Self-Attention&#xff09;和多头注意力&#xff08;Multi-Head Attention&#xff09;之间的区别非常重要&#xff0c;因为它们是自…

[HackMyVm] Quick

kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 0a:00:27:00:00:05 (Un…

nginx禁止国外ip访问

1.安装geoip2扩展依赖 yum install libmaxminddb-devel -y 2.下载ngx_http_geoip2_module模块 https://github.com/leev/ngx_http_geoip2_module.git 3.编译安装 ./configure --add-module/datasdb/ngx_http_geoip2_module-3.4 4.下载最新数据库文件 模块安装成功后,还要…

【阿里云系列】-基于云效构建部署NodeJS项目到ACK

准备工作 01、编写Dockerfile文件可以根据不同的环境&#xff0c;新建不同的Dockerfile文件&#xff0c;比如Dockerfile-PROD # Deliver the dist folder with NginxFROM nginx:stable-alpine ENV LANGC.UTF-8 ENV TZAsia/ShanghaiCOPY dist/ /usr/share/nginx/html COPY ngi…

speexsdp消除回声

speexsdp需要几秒的滤波时间。我测试4-7秒。 GitHub - cpuimage/WebRTC_AECM: Acoustic Echo Canceller for Mobile Module Port From WebRTC 更快的消除 webrtc_aecm 效果: 这是testecho.c样例的程序。 初始化函数&#xff1a; SpeexEchoState *speex_echo_state_init(in…

uniapp开发DAPP钱包应用(一) 环境搭建 Vue+ MetaMask + ABI.json

上几节我们讲了如何通过Java后端完成链上交易、信息查询、以及如何使用web3插件实现开发自测。 这一节&#xff0c;我们来说说前端DAPP的开发实现。 1. MeteMask &#x1fa9c;Java对接&#xff08;BSC&#xff09;币安链 | BNB与BEP20的开发实践&#xff08;三&#xff09;水…

Vue3全家桶 - VueRouter - 【6】导航守卫

导航守卫 查看以下情形&#xff1a; 点击主页链接时&#xff0c;默认情况下可直接进入指定页面&#xff0c;如下图&#xff0c;但是问题是该跳转的界面是需要用户登录后方可访问的&#xff1b; 可设置导航守卫来检测用户是否登录&#xff0c;如果已登录&#xff0c;则进入后台…

华为OD机试 - 模拟数据序列化传输(Java JS Python C C++)

题目描述 模拟一套简化的序列化传输方式,请实现下面的数据编码与解码过程 编码前数据格式为 [位置,类型,值],多个数据的时候用逗号分隔,位置仅支持数字,不考虑重复等场景;类型仅支持:Integer / String / Compose(Compose的数据类型表示该存储的数据也需要编码)编码后数…

四元数(Quaternion)的一些性质

四元数(Quaternion)是用于三维旋转和定向的四部分组成的超复数&#xff0c;超复数简单理解就是比abi这样的复数更复杂的复数&#xff0c;其中abi这样的复数我们也可以叫做二元数&#xff0c;表示复平面的一点&#xff0c;对于熟悉欧拉公式的朋友就知道&#xff0c;也可以看成是…

Sui与数据平台ZettaBlock达成合作,为其公测提供数据

Sui一向以闪电般的速度、无限水平扩展著称&#xff0c;现已迅速成为DeFi活动的重要场所。近期&#xff0c;数据平台ZettaBlock宣布在其开创性的Web3数据平台发布中&#xff0c;选择Sui作为基础集成合作伙伴之一。在ZettaBlock的开放测试版发布之际&#xff0c;构建者和开发者将…

双指针算法练习

27. 移除元素 题目 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑…

JS 事件捕获、事件冒泡、事件委托

js事件机制在开发中可以说时刻使用&#xff0c;例如dom绑定事件、监听其自身事件等。js事件机制有事件捕获、事件冒泡俩种机制&#xff0c;我们分别说下这俩种机制的使用场景。 一、概念 事件捕获顺序如下&#xff1a; window > document > body > div 事件冒泡顺序…