Python 第六章 函数

news2024/11/23 17:25:42

6.1函数的定义和调用

6.1.1定义函数

格式:

def 函数名 ([参数列表]):
    ["""文档字符串"""]
    函数体
    [return 语句]

6.1.2函数调用

格式:

函数名([参数列表])

python中函数可以嵌套定义

例如:

def add_modify(a,b):
    result=a+b
    print(result)
    def test():
        print("我是内层函数")
add_modify(6,6)

定义在函数内部的函数只能在函数内部调用

def add_modify(a,b):
    result=a+b
    print(result)
    def test():
        print("我是内层函数")
    test()
add_modify(6,6)

6.2函数参数的传递

6.2.1 位置参数的传递

def get_max(a,b):
    if a>b:
        print(a,"是较大的值")
    else:
        print(b,"是较大的值")
get_max(6,5)

6.2.2关键字参数传递

形参=实参

def connect(ip,port):
    print(f"设备{ip}:{port} 连接!")

connect(port=666,ip=999)

注意:如果定义函数的时候参数中有“/”

那么“/”前边的只能用位置参数传递,“/”后边的位置和关键字都可以。

6.2.3默认参数的传递

在定义时可以给参数传一个值,例如:

def connect(port,ip=666):
    print(f"设备{ip}:{port} 连接!")
connect(port=999)
connect(ip=6,port=999)

需要注意的是,没有设定默认参数的形参定义时必须在前边

6.2.4参数的打包与解包

函数支持将实参以打包和解包的形式传递给形参。

    • 打包:

如果函数在定义时不确定要传递几个值,那么可以在定义函数的时候为形参添加“*”或者“**”

"*"可以将接收的数据,以元组的形式打包成多个值,“**"可以将接收数据,椅子以·字典的形式打包成多个值。(突然发现python函数可以重复定义)

def test(*args):
    print(args)
test(1,2,3,4,5,6,7,8,9,10)
def test(**args):
    print(args)
test(a=1,b=2,c=3,d=4,e=5)

又试了下好像不是方法的重载

def test(*args):
    print(args)
test(1,2,3,4,5,6,7,8,9,10)
def test(**args):
    print(args)
test(a=1,b=2,c=3,d=4,e=5)
test(1,2,3,4,5,6,7,8,9,10)

书上说:*/**后的命名可以用任意的符合规范名字,但是建议用*args和**kwargs

如果函数没有接收到任何实参,那么,*args和**kwargs为空。

    • 解包

如果调用函数时给的实参是元组,或者字典那么可以在调用的时候在元组前加”*“或字典前加“**”

def test(a,b,c,d,e,f,g):
    print(a,b,c,d,e,f,g)
nums=(11,22,33,44,55,66,77)
test(*nums)

不知道为什么字典的元素的键还得和形参一样,好像就是把形参当成键然后字典中的值给到形参。

def test(a,b,c):
    print(a,b,c)
nums={"a":11,"b":22,"c":33}
test(**nums)

6.2.5混合传递

混合传递就是说前边介绍的几种方式可以混合使用,但是前提是要有顺序。

比如:

位置、关键字、默认参数、打包

例如:

def test(a,b,c=33, *args,**kwargs):
    print(a,b,c,args,kwargs)
test(1,2)
test(1,2,3)
test(1,2,3,4)
test(1,2,3, 4, e=5)

6.3函数的返回值

return返回。

过滤敏感词:

def filter_sensitive_words(words):
    if "山寨" in words:
        new_words=words.replace("山寨","**")
        return new_words
result=filter_sensitive_words("这个手机是山寨版的吧!!!")
print(result)

还可以返回多个值。

def move(x,y,stpe):
    nx=x+stpe
    ny=y+stpe
    return nx,ny
result=move(100,100,60)
print(result)

6.4变量作用域

6.4.1局部变量和全局变量

    • 局部变量

局部变量指的是在函数内部定义的变量,他只能在函数内部被使用。函数调用完后,就没有了。

    • 全局变量

在整个程序中都有作用。

在函数内部只能访问全局变量,不能修改全局变量。

number=10
def test_one(number):
    number=number
    print(number)
    number+=1
    print(number)
test_one(number)
print(number)

number=10
def test_one():
    print(number)
    number+=1
test_one()
print(number)

LEGB原则:

L(Local):局部作用域

E(Enclosing):嵌套作用域,嵌套定义的函数中外层函数声明的变量生效的区域。

G(Global):全局作用域

B(Built-in):内置作用域

6.4.2 global和nonlocal关键字

    • global关键字

局部变量声明为全局变量,这样就可以在函数内部修改全局变量了。

格式:global 变量

number=10
def test_one():
    global number
    number+=1
    print(number)
test_one()
print(number)

    • nonlocal关键字

可以在局部作用域中修改嵌套作用域中声明的变量。

格式: nonlocal 变量

def test():
    number=10
    def test_in():
        nonlocal number
        number=20
    test_in()
    print(number)
test()

6.5特殊形式的函数

6.5.1递归函数

调用自身的函数。

两个条件:一个是递归公式、一个是边界条件

递归函数执行可以分为两个阶段:

(1)递推:递归本次的执行都基于上一次的运算结果。

(2)回溯:遇到终止条件时,则沿着递推往回一级一级返回来。

格式:

def 函数名([参数列表]):
    if 边界条件:
        return 结果
    else:
        return 递归公式

递归求阶乘:

(1)n=1时,所得结果=1

(2) n>1时,结果是:n*(n-1)!

n=1是边界条件

n*(n-1)!是递归公式

def func(num):
    if num==1:
        return 1
    else:
        return num*func(num-1)

num =int(input("请输入一个整数:"))
result=func(num)
print(f"{num}!=%d"%result)

6.5.2匿名函数

匿名函数是无需定义标识符的函数:

使用lambda定义

格式:

lambda <形参> :<表达式>

匿名函数和普通函数的区别:

1.匿名函数没有名字

2.匿名函数的函数体只能是一个表达式

3.匿名函数实现的功能比较简单

4.匿名函数不能被其他程序使用

定义好的匿名函数不能直接使用,最好用一个变量保存他,以便后期使用可以随时使用这个函数。

#定义匿名函数,并将它的函数对象赋值给变量temp
temp=lambda x : pow(x,2)
#此时变量temp可以作为匿名函数的临时名称来调用函数。
print(temp(10))

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

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

相关文章

Vue3响应式原理解析

前言 今年上半年开始&#xff0c;自己开始在新项目中使用 Vue3 进行开发&#xff0c;相比较于 Vue2 来说&#xff0c;最大的变化就是 composition Api 代替了之前的 options Api&#xff0c;更像是 React Hooks 函数式组件的编程方式。 Vue3相对于Vue2响应式原理也发生了变化…

vue日期组件el-date-picker中更改默认日期格式并且实时显示的方法

在项目中有一个需求是这样的,要求实时显示他的当前默认时间,并且不能修改 使用了默认:default-value"currentTime"属性之后,新增的时候会报错,前端与后端传递的数据不匹配 因为默认时间被new date() 解析之后返回的数据是默认时间形式的,格式不符 方法如下: 第一步&a…

Elasticsearch入门 - Mac上Elasticsearch和Kibana的安装运行与简单使用

文章目录一&#xff0c;Mac上Elasticsearch和Kibana的安装1.1 环境与下载1.2 安装与运行1.3 问题1.3.1 elasticsearch安装后其他机器不能访问1.3.2 kibana安装后其他机器不能访问二&#xff0c;Elasticsearch在Kibana的常见命令2.1 查看集群的健康状态2.2 索引2.2.1 查看所有索…

Scrum 敏捷开发

什么是敏捷开发 敏捷 开发是一个术语&#xff0c;用于描述迭代软件开发。 迭代软件开发通过在短增量完成工作&#xff08;通常称为 冲刺&#xff0c; Sprint&#xff09;来缩短 DevOps 生命周期。 冲刺通常长达一到四周。 敏捷开发通常与传统或瀑布式开发形成鲜明对比&#xff…

Vue基础9之脚手架的使用、ref属性、props配置项和mixin混入

Vue基础9使用Vue脚手架初始化脚手架说明具体步骤项目文件介绍将前面写好的单文件组件放入这里运行脚手架文件结构render的作用修改默认配置配置项ref属性props配置项简单的传值方法默认的字符串传值使用v-bind对数字类型进行传值限制数据类型接收数据时候只对数据类型进行限制接…

Java 搜索二维矩阵 II

搜索二维矩阵 II中等编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a;每行的元素从左到右升序排列。每列的元素从上到下升序排列。示例 1&#xff1a;输入&#xff1a;matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22]…

v-model表单

1、v-model的基本使用 表单提交是开发中非常常见的功能&#xff0c;也是和用户交互的重要手段&#xff1a; 比如用户在登录、注册时需要提交账号密码&#xff1b;比如用户在检索、创建、更新信息时&#xff0c;需要提交一些数据&#xff1b; 这些都要求我们可以在代码逻辑中获…

【GD32F427开发板试用】+软件IIC(OLED显示)

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;四季的温度 gitee开源地址https://gitee.com/sijiwendu/gd32-f427-v/tree/master/module/oled 上一次完成DHT11开发文章https://aijishu.com/a…

什么是EDA?常见的EDA工具有哪些?

大家都知道&#xff0c;芯片设计难度非常大&#xff0c;要把上千亿颗晶体管集成在面积不到指甲盖大小的芯片上。其实能实现这样目标所以靠的是电子设计自动化&#xff08;Electronics Design Automation&#xff09;工具&#xff0c;也就是我们所称的EDA工具。 什么是EDA&…

从零搭建SpringCloud服务

一.微服务基础1.什么是SpringCloud&#xff1f;SpringCloud官网&#xff1a;https://spring.io/projects/spring-cloud&#xff08;个人建议是用谷歌浏览器访问官网打开中文翻译粗略把官网读一遍&#xff09;个人理解&#xff1a;以前的服务器就好像&#xff0c;一个会语数外全…

Elasticsearch:从实例中学习 nested 数据类型的 CRUD 及搜索

nested 数据类型是一个比较高级的话题。在本文中&#xff0c;将介绍 Elasticsearch 中针对嵌套对象的一些高级 CRUD 和搜索查询。 如果你想了解有关 Elasticsearch 基础知识的更多信息&#xff0c;可以查看这些文章以快速入门或复习&#xff1a; Elasticsearch&#xff1a;关于…

koa-router 正解

Koa-Router 之前分析过 Koa/ Koa-Bodyparser 的源码&#xff0c;今天让我们来分析下koa-router的源码&#xff0c;这个插件其实还是挺重要的。毕竟作为路由&#xff0c;我们还是要知道他的工作原理 这里会重申下 其实我是分析了 koa-router 主干流程。一些小众类的方法并没有看…

多步骤复杂 SQL 优化实例

问题先看数据&#xff1a;deliver 表是主表&#xff0c;一个客户会发生多次投递行为&#xff1a;deliverItem 表是从表&#xff0c;一个投递行为有多个投递项&#xff0c;delivered 是投递状态&#xff08;1 表示未完成&#xff0c;2 表示投递完成&#xff09;&#xff1a;需求…

如何了解一个软件的设计?

刚入职&#xff0c;接手新项目&#xff0c;面对一个全新项目&#xff0c;怎么快速研究它&#xff1f; 很多人直接看源码&#xff0c;一头扎入代码&#xff0c;很快就迷失其中&#xff0c;最初那股子探索精神&#xff0c;也会逐渐被迷茫所替。有多少次你满怀激情打开一个开源项…

极光推送REST API与Java后台对接

极光推送官网的web推送页面 因为是对接它的api&#xff0c;所以我参照这这个样式实现了一个&#xff0c;效果如下&#xff1a; 定时任务推送界面&#xff0c;可定制。实现了推送一次和每日定时推送&#xff0c;如果再扩展的话有每周、每月的功能&#xff0c;只是没有这个业务…

银行数字化转型导师坚鹏:银行数字化转型的五大痛点

首先从汇丰银行业绩持续下滑谈起&#xff0c;汇丰银行作为一家国际知名的全球性银行&#xff0c;最近10年左右的时间里&#xff0c;营业收入持续下降&#xff0c;已经从2008年的1400多亿美元到2021年的804.29亿美元; 净利润徘徊不前,2021年比2020年下降29.2%&#xff0c;仅为52…

kafka心得记录

1.为何引入kafka? 削峰填谷,主要还是为了应对上游瞬时大流量的冲击&#xff0c;避免出现流量毛刺现象&#xff0c;保护下游应用和数据库不被大流量打垮。 2.kafka备份机制&#xff0c;主从机制&#xff0c;Leader-Follower&#xff1a; Kafka 定义了两类副本&#xff1a;领导…

C语言文件操作函数详解——将你的代码永久化 ( •̀ ω •́ )✧

&#x1f384;博客主页&#xff1a;&#x1f390;大明超听话 &#x1f38b;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;关注✍评论 &#x1f38d;系列专栏&#xff1a;&#x1f391;从零开始C语言 &#x1f38a;从0开始数据结构与算法详解 &#x1f386;计算机考研——…

JavaScript中的原型链

本文作者为奇舞团前端开发工程师概述JavaScript 是 Web 的编程语言&#xff0c;简单易学&#xff0c;功能强大&#xff0c;但由于过于灵活设计理念&#xff0c;导致初学者经常一脸懵&#xff0c;本文要谈的是JavaScript中难点之一原型链。原型链的前世JavaScript的诞生要理解Ja…

Nessus介绍与安装

Nessus介绍与安装 1.Nessus简介 Nessus号称是世界上最流行的漏洞扫描程序&#xff0c;全世界有超过75000个组织在使用它。该工具提供完整的电脑漏洞扫描服务&#xff0c;并随时更新其漏洞数据库。Nessus不同于传统的漏洞扫描软件&#xff0c;Nessus可同时在本机或远端上遥控&…