百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

python02_函数(python函数csdn)

off999 2024-10-18 08:00 37 浏览 0 评论

一、函数的作用

  • 可以具体完成某个功能
  • 可以重复使用(函数就是存储运行过程)

二、函数的定义

关键字 def

def 函数名(参数1,参数2,参数3):

函数体

return 表达式

下面是一个计算的简单函数,名为add():

def add():
    a = 1 + 6 * 4
    b = a + 4
    print(b)
add()
  • 使用关键字def来告诉Python要定义一个函数
  • 向Python指出了函数名,函数名为add():,定义以冒号结尾
  • def add():后面的所有缩进行构成了函数体,描述了函数是做什么的
  • 函数要先定义,才能调用
  • 函数的调用必须加括号

要使用这个函数,可调用它。函数调用让Python执行函数的代码,由于add()函数没有指定任何参数,所以要调用函数,直接指定函数名即可。

三、函数的类型

1、函数的位置参数

可以通过函数名后面的括号传递参数,下面是一个带有位置参数的函数,名为run_cases():

def run_cases(num):
    for case in range(num):
        print(f'正在执行第{}条用例')
    # 调用函数传入的参数其实就是去给函数定义的时候的变量去赋值
run_cases(10)

设置位置参数的原则:

  • 函数当中存储多行代码:观察哪些数据会变化,则把它作为参数

关于函数的参数传递,需要注意如下几点:

  • 调用函数传递的参数个数一定要跟函数定义的参数个数一致,位置要保持一致,顺序要保持一致,否则会报错
  • 注意函数体里面参数的类型,要输入正确的参数类型,否则会报错
  • 函数的形式参数和实际参数要配对,一一对应
  • 函数调用后,如果有变量,那其实就是给变量赋值

形式参数与实际参数的区别:

  • 形式参数:函数定义的时候的参数,就是个变量
  • 实际参数:函数调用的时候传入的参数,就是个值

2、函数的关键字参数

关键字参数指的是在调用具有参数默认值的函数时,使用参数的关键字来指定为哪个参数赋值。下面是一个带有关键字参数的函数,名为run_cases():

def run_cases(a,b,c):
    for case in range(a):
        print(f'正在执行第{}条用例')
    print(b + c)
run_cases(a=5,c=3,b=4)

关键字参数的作用:

  • 在传实际参数的时候,即时说明实际参数的意义

位置参数和关键字参数的混合时的注意点:

  • 位置参数一定要在关键字参数的前面,避免冲突
  • 不能对一个参数进行多次赋值
  • 不能使用未知关键字参数

3、函数的默认参数

默认参数,在定义函数时给予默认值,调用函数时不需要给予默认参数。

def 函数名(...,形参名,形参名=默认值)

代码块

注意??

  • 在使用此格式定义函数时,指定有默认值的形式参数必须在所有没默认值参数的最后,否则会产生语法错误。
def run_cases(a,b,c=3)
    for case in range(a):
        print(f'正在执行第{case}条用例')
    print(b+c)
# 不给c传实际参数
# 默认参数的作用:可以不传参数
run_cases(1,4)

4、函数的动态参数

预先不知道函数需要接受多少个实参,所以Python中有一个动态参数的概念,随便你传递多少个的参数给函数,它都全盘接受,并在函数体内做进一步处理。

def add(*args):
    print(args)
add(1,2,3,4)

打印出来的结果都是元组类型,那么无论你传递多少个参数进来,它都会把这些参数存储到一个元组里面。比如可以去计算任意个数数字的总和:

def add(*args):
    sum = 0
    for item in args:
        sum += item
    print(sum)
add(1,2,3,4)

大家应该充分体验到了动态参数带来的便利,当我们面对不知道要传递多少个参数的函数时,就可以利用动态参数这个用法。

5、带有关键字的动态参数

带有关键字的动态参数,与普通动态参数的区别就是:带有关键字,且必须指定关键字,否则识别不了。

def run(a,**b):
    # b 就是把剩下的关键字参数全部都放到一起(字典)
    print(a)
    print(b)  
run(3,H='fuyao',Z='zhishang')

传入的带有key值的参数,都被转成了字典,所以当你传入的值不确定个数的时候又要组成字典,那么我们就可以用这种形式去做处理。

6、位置参数、默认参数、动态参数、关键字动态参数的混合使用

def add(a,b=4,c=5,*args,**kwargs):
    print('a+b+c的结果是:',a+b+c)
    sum = 0
    # args 就是把剩下的位置参数全部都放到一起(元组)
    for item in args:
        sum += item
    print('动态参数的累加结果是:',sum)
    # kwargs 就是把剩下的关键字参数全部都放到一起(字典)
    print('关键字动态参数是:',kwargs)
# 调用函数
add(1,2,3,4,5,6,x=1,y=2)

根据传递的参数,我们可以看到是优先处理位置参数,然后剩余的参数传递给args,带有关键字的参数传给kwargs。

7、函数的拆包

然而现实中,自动化测试用例中有很多数据(url、方法、参数等),存那么多变量不太现实,那我们可以将多个数据存在一个变量中,此时就会用到拆包了。

1)*args:把元组中的数据进行拆包,也就是把元组中的数据拆成单个数据。

def run(a,b,c):
    print(a)
    print(b)
    print(c)
 
args = [6,7,8]
# *args 是把所有的列表/元组元素拆分,脱衣服
run(*args)

2)**kwargs:用来接收key=value这种类型的命名参数,把字典中的数据进行拆包。

def run(a,b,c):
    print(a)
    print(b)
    print(c)
 
# 关键字参数调用
kwargs = {"a":6,"b":7,"c":8}
# **是把字典转化成关键字参数的
run(**kwargs)   

8、函数的返回值

上面我们写的函数,调用函数的结果都直接输出在控制台,其实并非所有的函数都会直接输出在控制台,如果我们要拿到这个函数的运行结果,那么就需要用return语句,将函数的运行结果返回来,由你去做进一步的处理。

def run_cases(a=1,b=3,c=3):
    for case in range(a):
        print(f'正在执行第{case}条用例')
    print(b + c)
    return 5
    # 不会执行下面这条语句
    print('函数执行完了吗')
print(run_cases())

返回值需要注意:

  • 如果你想拿到函数的运行结果,那么必须用return语句。
  • return后面的语句,都不会再执行,可以自己去尝试下。

9、函数的局部变量和全局变量

Python中的全局变量与局部变量的区别:全局变量与局部变量两者的本质区别就是在于作用域。

全局变量是在整个py文件中声明,全局范围内都可以访问;局部变量是在某个函数中声明,只能在该函数中调用它,如果试图在超出范围的地方调用,程序就会报错。

一般全局变量会用大写字母来标志,如果是局部变量,就会用小写字母来标志。

  • 全局变量在函数内部和外部都可以调用,局部变量只能在函数内调用,否则会报错。
A = 66    # 全局变量
def add():
    a = 100    # 局部变量
    print(a+A)
 
add() # 打印结果是166
print(A) # 打印结果是66
print(a) # 报错:NameError:name 'a' is not defined
  • 函数的外部无法直接获取局部变量,可以间接获取,通过return(返回值)。
a = 1    # 全局变量
def run():
    b = 2    # 局部变量
    print(b)
    return b
print(a)
run()
  • 如果全局变量和局部变量不一样,那么会优先调用局部变量。
A = 66   # 全局变量
def add():
    a = 100 # 局部变量
    print(A+A)
 
add() # 打印结果是200
print(A) # 打印结果是66
  • 如果想在函数内部改变全局变量的值,那么在全局变量之前加global关键字。
A = 66   # 全局变量
def add():
    global A
    A = 100 # 局部变量
    print(A+A)
 
add() # 打印结果是200
print(A) # 打印结果是100
  • 如果全局变量是列表类型,那么我们可以通过append等列表方法去对列表进行修改,否则修改不成功。
list_1 = ['hello',20]
def add():
    list_1.append(99)
    print(list_1)
add()    # 打印结果是['hello',20,99]
print(list_1)    # 打印结果是['hello',20,99]

10、内部函数

内置函数:Python官方自带的函数,不需要自己定义。

  • eval() 函数用来执行一个字符串表达式,并返回表达式的值。

可看以下示例:对表达式的结果进行计算,返回计算后的值

a = "1 + 5 + 3"
print(eval(a))  # 脱掉字符串左右两边的衣服

将输入的字符串转为对应的数据类型,列表、元组、字典等数据类型都可以使用这种方式输入

response = '{"username":"sun","age":16}'
print(type(response))
a = eval(response)
print(type(a))
  • sum() 方法对序列进行求和计算,并返回计算结果。
a = sum([3,4,5,6])
print(a)

相关推荐

Linux 网络协议栈_linux网络协议栈

前言;更多学习资料(包含视频、技术学习路线图谱、文档等)后台私信《资料》免费领取技术点包含了C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,Z...

揭秘 BPF map 前生今世_bpfdm

1.前言众所周知,map可用于内核BPF程序和用户应用程序之间实现双向的数据交换,为BPF技术中的重要基础数据结构。在BPF程序中可以通过声明structbpf_map_def...

教你简单 提取fmpeg 视频,音频,字幕 方法

ffmpeg提取视频,音频,字幕方法(HowtoExtractVideo,Audio,SubtitlefromOriginalVideo?)1.提取视频(ExtractVi...

Linux内核原理到代码详解《内核视频教程》

Linux内核原理-进程入门进程进程不仅仅是一段可执行程序的代码,通常进程还包括其他资源,比如打开的文件,挂起的信号,内核内部的数据结构,处理器状态,内存地址空间,或多个执行线程,存放全局变量的数据段...

Linux C Socket UDP编程详解及实例分享

1、UDP网络编程主要流程UDP协议的程序设计框架,客户端和服务器之间的差别在于服务器必须使用bind()函数来绑定侦听的本地UDP端口,而客户端则可以不进行绑定,直接发送到服务器地址的某个端口地址。...

libevent源码分析之bufferevent使用详解

libevent的bufferevent在event的基础上自己维护了一个buffer,这样的话,就不需要再自己管理一个buffer了。先看看structbufferevent这个结构体struct...

一次解决Linux内核内存泄漏实战全过程

什么是内存泄漏:程序向系统申请内存,使用完不需要之后,不释放内存还给系统回收,造成申请的内存被浪费.发现系统中内存使用量随着时间的流逝,消耗的越来越多,例如下图所示:接下来的排查思路是:1.监控系统中...

彻底搞清楚内存泄漏的原因,如何避免内存泄漏,如何定位内存泄漏

作为C/C++开发人员,内存泄漏是最容易遇到的问题之一,这是由C/C++语言的特性引起的。C/C++语言与其他语言不同,需要开发者去申请和释放内存,即需要开发者去管理内存,如果内存使用不当,就容易造成...

linux网络编程常见API详解_linux网络编程视频教程

Linux网络编程API函数初步剖析今天我们来分析一下前几篇博文中提到的网络编程中几个核心的API,探究一下当我们调用每个API时,内核中具体做了哪些准备和初始化工作。1、socket(family...

Linux下C++访问web—使用libcurl库调用http接口发送解析json数据

一、背景这两天由于一些原因研究了研究如何在客户端C++代码中调用web服务端接口,需要访问url,并传入json数据,拿到返回值,并解析。 现在的情形是远程服务端的接口参数和返回类型都是json的字符...

平衡感知调节:“系统如人” 视角下的架构设计与业务稳定之道

在今天这个到处都是数字化的时代,系统可不是一堆冷冰冰的代码。它就像一个活生生的“数字人”,没了它,业务根本转不起来。总说“技术要为业务服务”,但实际操作起来问题不少:系统怎么才能快速响应业务需求?...

谈谈分布式文件系统下的本地缓存_什么是分布式文件存储

在分布式文件系统中,为了提高系统的性能,常常会引入不同类型的缓存存储系统(算法优化所带来的的效果可能远远不如缓存带来的优化效果)。在软件中缓存存储系统一般可分为了两类:一、分布式缓存,例如:Memca...

进程间通信之信号量semaphore--linux内核剖析

什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。信号量的值为正的时候,说明它空闲。所测试的线程可以锁定而使用它。若为0,说明它被占用,测试的线程要进入睡眠...

Qt编写推流程序/支持webrtc265/从此不用再转码/打开新世界的大门

一、前言在推流领域,尤其是监控行业,现在主流设备基本上都是265格式的视频流,想要在网页上直接显示监控流,之前的方案是,要么转成hls,要么魔改支持265格式的flv,要么265转成264,如果要追求...

30 分钟搞定 SpringBoot 视频推拉流!实战避坑指南

30分钟搞定SpringBoot视频推拉流!实战避坑指南在音视频开发领域,SpringBoot凭借其快速开发特性,成为很多开发者实现视频推拉流功能的首选框架。但实际开发中,从环境搭建到流处理优...

取消回复欢迎 发表评论: