Python---函数相关知识

news2024/12/22 20:32:50

专栏:python
个人主页:HaiFan.
专栏简介:本专栏主要更新一些python的基础知识,也会实现一些小游戏和通讯录,学时管理系统之类的,有兴趣的朋友可以关注一下。

函数

  • 前言
  • 函数的使用
  • 函数的语法格式
  • 函数的参数
  • 函数的返回值
  • 变量的作用域
  • 函数的执行过程
  • 函数的递归
  • 参数默认值
  • 关键字参数


前言

在初中高中的时候,我们学习过函数,python中的函数和数学中的函数有点类似,数学上的函数:y = x^2,随着x的改变,y也会改变,编程中的函数(是一段只要可以用到这个函数的功能,就调用这个函数)是一段可以重复使用的代码段。

在这里插入图片描述


函数的使用

#求一到10
sum = 0
for cnt in range(1,11):
    sum += cnt
print(sum)
#求一到100
sum = 0
for cnt in range(1,101):
    sum += cnt
print(sum)
#求一到1000
sum = 0
for cnt in range(1,1001):
    sum += cnt
print(sum)

像这样要求某一区间的和,每次都需要写一个循环,每次写都是一样的写法,只是数字改了改,既然差异这么小,就可以把重复的代码写出来,写成一个函数。

def add(st,ed):#st代表起始数字,ed代表末尾数字
    thesum = 0
    for i in range(st, ed + 1):
        thesum += i
    print(thesum)

这就写成了一个函数,用st和ed来代表数字,想要打印结果的话,在函数下面调用一下函数即可。

add(1,10)
add(1,100)
add(1,1000)

在这里插入图片描述
可以明显的看出,用函数写的结果和一个循环一个循环的写,结果是一样的,但是用函数写的话,代码量少了很多,这就为做项目的时候,提供了方便。

函数的语法格式

函数是有严格的语法格式的。

def 函数名(形参列表):#def是define(定义)的意思
	函数体
	return 返回值

调用函数/使用函数

函数名(实参列表) # 不考虑返回值
返回值 = 函数名(实参列表) # 考虑返回值

函数定义是不会执行函数体的内容的,必须要调用之后,才会执行,调用几次函数,就执行几次函数。
在这里插入图片描述
从图中可以看出,再不调用函数的情况下,是没有任何输出的。

函数必须先定义,在使用。

add(1,10)

def add(st,ed):
    thesum = 0
    for i in range(st, ed + 1):
        thesum += i
    print(thesum)

在这里插入图片描述

函数的参数

形参和实参是什么?

def add(st,ed):
    thesum = 0
    for i in range(st, ed + 1):
        thesum += i
    print(thesum)
    
add(1,10)

形参是实参的一份临时拷贝,形参的改变不会影响实参。在这个代码中,st和ed就是形参(函数在调用的时候,实参赋值给形参),1和10就是实参。

def add(st,ed):
    st = 20
    ed = 30
    print(f'st = {st}')
    print(f'ed = {ed}')
    
a = 1
b = 10
add(a,b)
print(f'a = {a}')
print(f'b = {b}')

在这里插入图片描述

  1. 一个函数可以有n(n不能等于负数,0或0以上都可以)个形参。
  2. 一个函数的形参有几个,那么传递实参的时候,也得传几个,函数的形参个数要和实参的个数一样,就上面的代码来说,两个形参对应两个实参。

因为python是动态类型的编程语言,函数的形参不必指定参数的类型,也可以理解为,函数支持多种不同类型的数据。

函数的返回值

函数的参数可以视为是函数的“输入”,函数的返回值可以视为函数的“输出”。
此处的“输入”“输出”不是单纯的指通过控制台输入输出。

def add1(st, ed):
    thesum = 0
    for i in range(st, ed + 1):
        thesum += i
    print(thesum)

add1(1, 10)

可以写成下面的这一种情况。

def add2(st, ed):
    thesum = 0
    for i in range(st, ed + 1):
        thesum += i
    return thesum

ret = add2(1, 10)
print(ret)

这里没有直接写print而是写成了return,return可以把函数的结果返回给函数的调用者,再有调用者负责打印函数的结果。

在这里,更加推荐第二种写法。

一个函数中可以有多个return语句

def add2(st, ed):
    thesum = 0
    for i in range(st, ed + 1):
        if (i + st == 100):
            return False
        thesum += i
    return True

ret = add2(1, 100)
print(ret)

在这里插入图片描述
执行到return语句,函数就会立刻结束执行,回调调用的位置。

一个函数可以一次返回多个返回值,使用,来分割多个返回值。

def Print():
    a = 10
    b = 11
    return a, b


x, y = 0,0
x,y = Print()
print(x)
print(y)

在这里插入图片描述
如果函数只想关注返回值的一部分,可以使用_来忽略不想要的返回值

def Print():
    a = 10
    b = 11
    return a, b


x, y = 0,0
_,y = Print()
print(x)
print(y)

在这里插入图片描述

变量的作用域

def Print():
    a = 10
    b = 11
    return a, b
a,b = Print()

这个代码中,函数内部有a和b,函数外部也有a和b,但是这两组a和b不是相同的,只是名字相同而已。

变量只能在所在的函数内部生效。

def Print():
    a = 10
    b = 11
    return a, b
Print()
print(a,b)

在这里插入图片描述
在不同的作用域中,允许存在名字相同的变量

x = 10

def test():
    x = 20
    print(f'函数内部的x = {x}')
test()
print(f'函数外部的x = {x}')

在这里插入图片描述

注:在函数内部的变量,也称为“局部变量”
不在任何函数内部的变量,称为“全局变量”

如果函数内部尝试访问的变量在局部不存在,就会尝试在全局作用域中查找

x = 10
def test():
    print(f'x = {x}')
test()

在这里插入图片描述
如果想在函数内部,修改全局变量的值,需要使用global关键字声明

x = 10

def test():
    global x
    x = 20
    print(f'修改过的全局变量x = {x}')

print(f'没修改过的全局变量x = {x}')
test()

在这里插入图片描述

此处若是没有global,则函数内部的x = 10就会被视为是创建一个局部变量x。

if/while/for等语句块不会影响到变量作用域
在if/while/for中定义的变量,也可以在语句外面正常使用

for i in range(1,100):
    pass
print(i)

在这里插入图片描述

函数的执行过程

调用函数才会执行函数体代码,不调用则不会执行
函数体执行结束,或遇到return语句结束,则返回好函数调用的位置继续往下执行。

def test():
    print(2)
    print(3)
    print(4)

print(1)
test()
print(5)

在这里插入图片描述

函数的递归

递归是 嵌套调用 中的一种特殊情况, 即一个函数嵌套调用自己

例如求某个数的阶乘,用递归实现

def factor(n):
    if n == 1:
        return 1
    return n * factor(n - 1)
    
a = int(input())
ret = factor(a)
print(ret)

在这里插入图片描述

这个代码就是典型的递归调用。

在这里插入图片描述
在明确递推公式和初始条件的时候,就可以用递归解决一系列问题,递归的代码一般都很少。相对的,递归的代码,往往不容易被理解,很难掌握,也很容易出现栈溢出的情况。

参数默认值

python中的函数,可以给形参指定默认值,带有默认值的参数,可以在调用的时候,不用传参。

def add(x,y,flag = True):
    if flag:
        print(f'x = {x},y = {y}')
    return x + y

print(add(10,20))
print(add(10,20,False))

在这里插入图片描述
此处的flag = True即为参数默认值,当我们不指定第三个参数的时候,默认flag的取值为True

带有参数默认值的参数,需要放到没有默认值的参数的后面。

def add(x,flag = True,y):
    if flag == 1:
        print(f'x = {x},y = {y}')
    return x + y

print(add(10,20))
print(add(10,20,False))

在这里插入图片描述

关键字参数

在调用函数的时候,需要给函数指定实参,一般情况下是按照形参的顺序,来依次传递实参的,但是我们也可以通过关键字参数,来调整这里传参的顺序,指定当前实参传递给哪个形参。

关键字传参——按照形参的名字来进行传参。

def test(x,y):
    print(f'x = {x},y = {y}')
test(10,100)

在这里插入图片描述

def test(x,y):
    print(f'x = {x},y = {y}')
test(10,100)
test(x = 100,y = 10)

在这里插入图片描述

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

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

相关文章

Python脚本集成SQLite3数据库

文章目录一、Sqlite3数据库的基本使用1.数据库是什么2.数据库分类二、正式开始使用SQLite3(Python)1.基础sql命令2.Python连接SQLite3①查询②增加③更新一、Sqlite3数据库的基本使用 1.数据库是什么 借用百科上的话,数据库是“按照数据结构…

yolo v8 解决了 v5 的问题嘛?

文章大纲 yolo v8 简介网络结构yolo v8 准确率的提升yolo v8 的速度提升参考文献与学习路径yolo v8 简介 官网: https://ultralytics.com/yolov8https://github.com/triple-Mu/YOLOv8-TensorRT详细介绍: https://learnopencv.com/ultralytics-yolov8/网络结构 yolo v8 准确率…

I.MX6ULL裸机开发笔记3:SDK烧录镜像

目录 一、获取NXP官方SDK 二、Linux安装SDK 三、SDK中相关工具 四、烧录工具 一、获取NXP官方SDK 官方网站MCIMX6ULL-EVK_i.MX6ULL评估套件_NXP 半导体 二、Linux安装SDK ./XXX.run 这里如果提示sudo ./XXX.run 找不到命令,就可以用ls -l查看当前文件夹文件的…

VVDocumenter-Xcode github README.md 中英文翻译

最近在学习 Xcode 的使用,查到有一款用于生成注释文档的插件:VVDocumenter-Xcode 进入其 github 页面之后看 README,看到两句话: 1. Goodbye World: 再不更新了? 2. 从 Xcode 8 之后Apple官方提供了插件做…

Python爬虫---爬虫介绍,实战案例

目录标题1、爬虫介绍1.1 爬虫的合法性1.2 网络爬虫的尺寸1.3 robots.txt协议1.4 http&https协议1.5 requests模块1.5.1 request库的异常2、实战案例2.1 百度页面2.2 爬取京东商品页面2.3 爬取亚马逊商品页面-更改headers2.4 百度/360搜索关键词提交-params2.5 网络图片的爬…

Nacos 报Statement cancelled due to timeout or client request

1. 问题:nacos 启动报错,启动失败,全部报错下面贴出。 2. 结论:排查结果为服务器带宽不够,mysql 查询的数量量太大,传输时间损坏在网络io上! 3. 下面开始回溯事故起因: 前期config…

2022年一年级入学小结

2022年即将过去,在这里,简单回顾一下Richard同学进入小学一学期后的成长经历和小结。先说说学校生活Richard很喜欢目前的学校,喜爱给他授课的每一位老师,也和老师和同学们相处得不错,自诩自己现在的”粉丝“蛮多。从我…

C++设计模式(6)——适配器模式

亦称: 封装器模式、Wrapper、Adapter 意图 适配器模式是一种结构型设计模式, 它能使接口不兼容的对象能够相互合作。 问题 假如你正在开发一款股票市场监测程序, 它会从不同来源下载 XML 格式的股票数据, 然后向用户呈现出美…

9.框架SpringMVC

一、基本概念 Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 Servlet。Spring MVC 使用 MVC 架构模式的思想,将 Web 应用进行职责解构,把一个复杂的 Web 应用划分成模型(Model&#xff09…

HashMap的使用:put、remove和get方法原理

关联项目需求进行FeatureAB上报的时候,我们使用HashSet的add方法存key值,如果key已存在,则add失败,返回false,如果key不存在,add成功,返回true。看源码中HashSet的add(E e)方法实现:…

【Git】IDEA 集成 GitHub

8、IDEA 集成 GitHub 8.1、设置 GitHub 账号 如果出现 401 等情况连接不上的,是因为网络原因,可以使用以下方式连接: 然后去 GitHub 账户上设置 token。 点击生成 token。 复制红框中的字符串到 idea 中。 点击登录。 8.2、分享工程到 GitHu…

【甄选靶场】Vulnhub百个项目渗透——项目五十五:SP-LEOPOLD v1.2(beef联动msf,脏牛提权)

Vulnhub百个项目渗透 Vulnhub百个项目渗透——项目五十五:SP-LEOPOLD v1.2(beef联动msf,脏牛提权) 🔥系列专栏:Vulnhub百个项目渗透 🎉欢迎关注🔎点赞👍收藏⭐️留言&am…

ZooKeeper-集群搭建

5)ZooKeeper 集群搭建 5.1)Zookeeper集群介绍 Leader选举: •Serverid:服务器ID 比如有三台服务器,编号分别是1,2,3。 编号越大在选择算法中的权重越大。 •Zxid:数据ID 服务器中存放的最大数据ID.值越大说明数据 越新&…

剑指offer—day1.用两个栈实现队列、包含min函数的栈

1.用两个栈实现队列 本题来源:力扣 剑指 Offer 09. 用两个栈实现队列 - 力扣(LeetCode)https://leetcode.cn/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/题目描述 用两个栈实现一个队列。队列的声明如下,请实现它的两…

IP-guard如何映射到外网登录访问管理

终端安全管理(endpoint security management)是一种保护网络安全的策略式方法,它需要终端设备在得到访问网络资源的许可之前遵从特定的标准。随着企业信息化发展,终端安全管理系统需求不断扩大,相关系统软件被广泛应用。 IPguard即IP-guard&a…

线段树(重要!多加理解懒惰标记!)

基础概念: 线段(区间)[L,R] 所对应的线段树是由区间 [L,R] 及其子区间构成的二叉树(如下图所示) 线段树具有的特性: (1)线段树的叶结点为只有一个元素的区间,因此长度为…

最新版海豚调度dolphinscheduler-3.1.3安装部署详细教程

0 背景 本文基于Ambari集群搭建最新版本的海豚调度dolphinscheduler-3.1.3版本,后续会尝试整合到Ambari中。 1 安装准备 安装dolphinscheduler需要在环境中安装如下依赖 ① JDK8 下载JDK (1.8),安装并配置 JAVA_HOME 环境变量,并将其下的 …

用 22 张照片打开 23 年

魔幻又带有现实主义色彩的三年似乎终将见底。这也为 2023 年赋予了一些新的意义,或许是充满生机、怀揣希望、满怀爱意,或许是重新启航、步履不停、勇敢探索……为此,我们收集了 22 位社区用户和公司小伙伴在过去一年的「特别 Moment」及新年愿…

你认为DAO是否可行?新年计划,卯足干劲,兔必No.1

文章目录🌟 课前小差🌟 聚沙成塔🌟 社会价值🌟 DAO是什么🌟 国产化🌟 商业化回报🌟 写在最后🌟 课前小差 哈喽,大家好,我是几何心凉,这是一份全新…

Spring高级之BeanFactory功能

首先,我们想要知道一个接口有哪些功能,就必须要看这个接口的源代码,在idea中,选中这个接口CtrlF12,来查看这个接口里面有哪些方法: 表面上来看,功能其实很少,查看源码及其方法功能 …