python函数参数学习_python学习笔记-11.函数参数和返回值进阶

1. 函数参数和返回值的作用

函数根据有没有参数以及有没有返回值,可以相互组合,共有4种形式:

无参数,无返回值

无参数,有返回值

有参数,无返回值

有参数,有返回值

定义函数时,是否接收参数,或者是否返回结果,是根据实际的功能需求决定的。

如果函数内部处理的数据不确定,就可以将外界的数据以参数传递到函数内部。

如果希望一个函数执行完成后,向外界汇报执行结果,就可以增加函数的返回值。

a616a4083169b0552c0b928d0d7b21b9.png

2. 函数的返回值进阶

问题:一个函数执行后能否返回多个结果?

元组-可以包含多个数据,因此可以使用元组让函数一次返回多个值;

如果函数返回的类型是元组,小括号可以省略;

如果函数返回的类型是元组,同时希望单独处理元组种的元素,可以使用多个变量,一次接收函数的返回结果;

注意,使用多个变量接收结果时,变量的个数应和元组中元素的个数保持一致。

举个栗子

# 测量温度和湿度

def measure():

print("测量开始")

temp = 39

wet = 56

print("测量结束")

return temp,wet # 返回的数据类型为元组,可省略'()'

gl_temp, gl_wet = measure() # 定义两个变量接收返回的结果

print(gl_temp)

output:

测量开始

测量结束

39

56

举个栗子-交换数字(经典面试题)

在不使用其他变量的情况下,交换a和b的值。

a = 6

b = 100

a,b = b,a # python专有,利用元组。等号右边是一个元组,只是把小括号省略了

print(a)

print(b)

output:

100

6

3. 函数的参数进阶

3.1 不可变和可变的参数

问题1:在函数内部,针对参数使用赋值语句,会不会影响调用函数时传递的实参变量?——不会!

无论传递的参数是可变还是不可变,只要针对参数使用赋值语句,会在函数内部修改局部变量的引用,不会影响到外部变量的引用。

举个栗子

def demo(num,num_list):

print("函数内部的代码")

# 在函数内部,针对参数使用赋值语句

num = 100 # 不可变的参数

num_list = [1,2,3] # 可变的参数

print(num)

print(num_list)

print("函数执行完成")

gl_num = 99

gl_list = [4,5,6]

demo(gl_num,gl_list)

print(gl_num)

print(gl_list)

output:

函数内部的代码

100

[1, 2, 3]

函数执行完成

99

[4, 5, 6]

问题2:如果传递的参数是可变类型,在函数内部,使用方法修改了数据的内容,同样会影响到外部的数据。

举个栗子

def demo(num_list):

print("函数内部的代码")

# 使用方法修改列表的内容,此时并不会修改列表的引用

num_list.append(9)

print(num_list)

print("函数执行完成")

gl_list = [1,2,3]

demo(gl_list)

print(gl_list)

output:

函数内部的代码

[1, 2, 3, 9]

函数执行完成

[1, 2, 3, 9]

举个栗子- += (面试题)

在python中,列表变量调用 += 本质上实在执行列表变量的extend方法,不会修改变量的引用。

def demo(num,num_list):

print("函数开始")

# num = num + num

num += num

# 列表变量使用 += 不会做相加再赋值的操作!

# num_list = num_list + num_list

# 本质上是在调用列表的extend方法

# num_list.extend(num_list)

num_list += num_list

print(num)

print(num_list)

print("函数完成")

gl_num = 9

gl_list = [1,2,3]

demo(gl_num,gl_list)

print(gl_num)

print(gl_list)

output:

函数开始

18

[1, 2, 3, 1, 2, 3]

函数完成

9

[1, 2, 3, 1, 2, 3]

3.2 缺省参数

3.2.1 什么是缺省参数

定义函数时,可以给某个参数指定一个默认值,具有默认值的参数就叫做缺省参数;

调用函数时,如果没有传入缺省参数的值,则在函数内部使用定义函数时指定的参数默认值;

函数的缺省参数,将常见的值设置为参数的缺省值,从而简化函数的调用。

举个栗子-对列表排序的方法

sort方法中的reverse即为缺省参数。

gl_list = [6,3,9]

# 默认按照升序排序 - 日常使用可能会更多

gl_list.sort()

print(gl_list)

# 如果需要降序排序,需要指定reverse参数

gl_list.sort(reverse=True)

print(gl_list)

output:

[3, 6, 9]

[9, 6, 3]

3.2.2 怎么指定函数的缺省参数

在参数后使用赋值语句,可以指定参数的缺省值。

– 缺省参数,需要使用最常见的值作为默认值。

– 如果一个参数的值不能确定,则不应该设置默认值,具体的数值在调用函数时,由外界传递!

举个栗子

def print_info(name, gender=True):

"""

:param name: 班上同学的姓名

:param gender: True 男生 False 女生

"""

gender_text = "男生"

if not gender: # not取反

gender_text = "女生"

print("%s 是 %s" % (name, gender_text))

# 假设班上的同学,男生居多!

# 提示:在指定缺省参数的默认值时,应该使用最常见的值作为默认值。

print_info("小明")

print_info("老王")

print_info("小丽",False)

output:

小明 是 男生

老王 是 男生

小丽 是 女生

3.2.3 缺省参数的注意事项

1) 缺省参数的定义位置

必须保证带有默认值的缺省参数在参数列表的末尾。

2)调用带有多个缺省参数的函数

在调用函数时,如果有多个缺省参数,需要指定参数名,这样解释器才能够知道参数的对应关系。

举个栗子

def print_info(name, title="", gender=True):

"""

:param title: 职位

:param name: 班上同学的姓名

:param gender: True 男生 False 女生

"""

gender_text = "男生"

if not gender: # not取反

gender_text = "女生"

print("[%s] %s 是 %s" % (title, name, gender_text))

# 假设班上的同学,男生居多!

# 提示:在指定缺省参数的默认值时,应该使用最常见的值作为默认值。

print_info("小明")

print_info("老王")

print_info("小丽",gender=False) # 如果有多个缺省参数,需指定参数名

output:

[] 小明 是 男生

[] 老王 是 男生

[] 小丽 是 女生

3.3 多值参数(了解)

定义支持多值参数的函数

有时候可能需要一个函数能够处理的参数个数是不确定的,这时就可以使用多值参数。

python有两种多值参数:

– 参数名前增加一个*可以接收元组

– 参数名前增加一个**可以接收字典

一般在给多值参数命名时,习惯使用以下两个名字

– *args 存放元组参数,前面有一个*

– **kwargs 存放字典参数,前面有两个*

args 是 arguments的缩写,有变量的含义

kw 是 keyword的缩写,kwargs可以记忆键值对参数

举个栗子

def demo(num, *nums, **person):

print(num)

print(nums)

print(person)

demo(1,2,3,4,5,name="小明",age=18)

output:

1

(2, 3, 4, 5)

{‘name’: ‘小明’, ‘age’: 18}

举个栗子-计算任意多个数字的和

def sum_nums(*args):

num = 0

print(args)

# 循环遍历

for n in args:

num += n

return num

result = sum_nums(1,2,3,4,5,6)

print(result)

output:

(1, 2, 3, 4, 5, 6)

21

3.4 元组和字典的拆包(了解)

在调用带有多值参数的函数时,如果希望:

– 将一个元组变量,直接传递给args

– 将一个字典变量,直接传递给kwargs

就可以使用拆包,简化参数的传递,拆包的方式为:

– 在元组变量前,增加一个*

– 在字典变量前,增加两个*

def demo(*args,**kwargs):

print(args)

print(kwargs)

# 元组变量/字典变量

gl_nums = (1,2,3)

gl_dict = {"name":"小明","age":18}

# 拆包语法,简化元组变量/字典变量的传递

demo(*gl_nums,**gl_dict)

output:

(1, 2, 3)

{‘name’: ‘小明’, ‘age’: 18}

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

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

相关文章

java spr_Java中的42行代码中的URL缩短器服务(Java(?!)Spring Boot + Redis

java spr显然,编写URL缩短服务是新的“ Hello,world! ”在IoT /微服务/时代的世界中。 一切始于在45行Scala中的URL缩短服务 -整洁的Scala,以Spray和Redis进行调味以进行存储。 紧随其后的是, 在35行Clojure中提供了ur…

python邮件发送哪个好_python发邮件(一)

复习模块如果我们要发送邮件,就需要用到smtplib模块的以下方法:1、import smtplib #引入smtplib模块2、server smtplib.SMTP() #server为变量,通过SMTP指定一个服务器,这样才能把邮件送到另一个服务器,SMTP…

SSL Kafka经纪人从Kafka Mirror Maker迁移到Brooklin的挑战

问题 从卡夫卡镜子制造商转移到布鲁克林有我在这里所写的优势。 但是,进行这种迁移并不容易,因为它本来应该如此。 我面临的主要挑战是:在消费者Kafka经纪人和Brooklin之间建立SSL连接 解 SSL问题 事实证明,这个问题比我预期的要…

mysql移动数据的语句是_mysql基本语句

MySQL关系型数据库RDS中的老大哥,增删改查是MySQL入门的基础增删改查语句增删改查的语句命令为增:insert删:delete改:update查:SELECT或者show库操作创建数据库:create database shujukuba;创建带字符集的数…

jetty嵌入式容器_嵌入式Jetty和Apache CXF:借助Spring Security来保护REST服务

jetty嵌入式容器最近,我遇到了一个非常有趣的问题,我认为这只需要几分钟就可以解决:在Linux中使用Spring Security (当前稳定版本3.2.5 )保护Apache CXF (当前版本3.0.1 )/ JAX-RS REST服务。在…

python逻辑运算符的使用_总结Python中逻辑运算符的使用

下表列出了所有python语言支持的逻辑运算符。假设变量a持有10和变量b持有20,则:示例:试试下面的例子就明白了所有的python编程语言提供了逻辑运算符:#!/usr/bin/pythona 10b 20c 0if ( a and b ):print "line 1 - a and b are true&q…

如何使用用户数据脚本在EC2实例上安装Apache Web Server

你好朋友, 在本教程中,我们将看到如何使用用户数据脚本在EC2实例上安装Apache Web Server。 在我以前的教程之一中,我已经解释了如何使用AWS控制台启动EC2实例。如果您还没有完成该操作,我建议您先进行一下操作。 首先&#xf…

java 常量接口_java接口定义常量研究

背景和同事讨论到,在接口中定义常量的问题,引发了争论,即,假如在接口中定义变量,是否需要用static来限定的问题,或者说用static和不用static会有什么区别。引论package spring.interfaceTest;public interf…

spring 多租户_使用Spring Security的多租户应用程序的无状态会话

spring 多租户从前, 我发表了一篇文章,解释了构建无状态会话的原理 。 巧合的是,我们再次为多租户应用程序执行同一任务。 这次,我们将解决方案集成到Spring Security框架中,而不是自己构建身份验证机制。 本文将解释…

java api 1.6 下载_Java JDK API

JDKJavaDevelopmentKit是SunMicrosystems针对Java开发员的产品。自从Java推出以来,JDK已经成为使用最广泛的JavaSDK。JDK是整个Java的核心,包括了Java运行环境。相关软件软件大小版本说明下载地址jdk(Java Development Kit)是Sun Microsystems针对java开…

Java / Cloud:如何快速创建支持Kubernetes的REST微服务

可以肯定地说,如今微服务与云的结合风靡一时。 微服务的开发比以往任何时候都多,从而导致应用程序部署数量增加。 在过去的十年中,开发了诸如Docker和Kubernetes之类的容器化和编排工具,从而使微服务模式真正易于采用。 本文将教…

java考试安徽工业大学_2011~2012《Java语言程序设计》试卷A及答案(安徽工业大学)...

《2011~2012《Java语言程序设计》试卷A及答案(安徽工业大学)》由会员分享,可在线阅读,更多相关《2011~2012《Java语言程序设计》试卷A及答案(安徽工业大学)(6页珍藏版)》请在人人文库网上搜索。1、装 订 线 安 徽 工 业 大 学 试 题 纸(一)20112012学年第…

jsr303自定义验证_JSR 310新日期/时间API的自定义JSR 303 Bean验证约束

jsr303自定义验证借助JSR 310,Java 8终于为我们带来了不错的日期和时间API。 对于仍在使用Java 7的那些人(就像我目前在我的当前项目中一样),有很好的反向移植,请访问www.threeten.org了解更多详细信息。 但是&#xf…

java spring注入 静态方法_JAVA静态方法中如何使用spring@Value进行注入的成员变量...

背景:一个旧项目原本集成有spring-session,现需要临时添加缓存的操作,需要复用spring-session中的一些缓存配置。实现方法:一、类上添加注解Component二、定义静态成员变量private static String redisUrl;private static String …

使用Testcontainers和PostgreSQL,MySQL或MariaDB的Spring Boot测试

Testcontainers是一个Java库,可轻松将Docker容器集成到JUnit测试中。 在Containerized World中 ,将测试配置与嵌入式数据库和服务复杂化几乎没有意义。 而是使用在Docker中运行您的服务,并让Testcontainers为您管理此服务。 在此博客文章中&…

使用Spring Boot和Project Reactor处理SQS消息-第2部分

这是我关于使用Spring Boot和Project Reactor有效处理SQS消息的博客文章的后续文章 我在第一部分中列出了一些方法上的差距。 1.处理SQS客户端调用中的失败 2.该方法一次只能处理来自SQS的一条消息,如何并行化 3.它不处理错误,管道中的任何错误都会中…

java爬虫jsoup_Java爬虫之利用Jsoup自制简单的搜索引擎

内容导读在上述代码中,url为输入词条(暂时仅限于英文),进入while循环可一直搜索,当输入为’exit’时退出。contentText为该词条的百度百科简介的网页形式,通过正则表达式将其中的文字提取出来。代码虽然简洁,但是功能还…

shader weaver_具有自定义汇编程序,Weaver和运行时的可插拔知识

shader weaver作为贝叶斯工作的一部分,我对Kie进行了很多重构,使其具有清晰的扩展点。 我想确保可以完成贝叶斯系统的所有工作部件,而无需在现有内核中添加任何代码。 因此,现在每种知识类型都可以拥有自己的包,汇编器…

matplotlib的默认字体_浅谈matplotlib默认字体设置探索

控制默认字体的设置根据官方文档https://matplotlib.org/tutorials/text/text_props.html#default-font可知:The base default font is controlled by a set of rcParams默认字体是由一组rcParams控制的。rcParamusage‘font.family"List of either names of f…

如何使用Apache Camel,Quarkus和GraalVM快速运行100个骆驼

今天,我继续在youtube上练习,并录制了10分钟的视频,介绍了如何创建一个新的Camel and Quarkus项目,该项目包括Rest和HTTP服务以及开箱即用的健康检查和指标。 然后比较以JVM模式运行示例与使用GraalVM编译的本机内存的使用情况。…