Python入门(十五)函数(三)

函数(三)

  • 1.返回值
    • 1.1 返回简单值
    • 1.2 让实参变成可选的
    • 1.3 返回字典
    • 1.4 结合使用函数和while循环

作者:Xiou

1.返回值

函数并非总是直接显示输出,它还可以处理一些数据,并返回一个或一组值。函数返回的值称为返回值。在函数中,可使用return语句将值返回到调用函数的代码行。返回值让你能够将程序的大部分繁重工作移到函数中去完成,从而简化主程序。

1.1 返回简单值

下面来看一个函数,它接受名和姓并返回整洁的姓名:

  def get_formatted_name(first_name, last_name):"""返回整洁的姓名。"""full_name = f"{first_name} {last_name}"return full_name.title()musician = get_formatted_name('jimi', 'hendrix')print(musician)

函数get_formatted_name()的定义通过形参接受名和姓。它将姓和名合而为一,在中间加上一个空格,并将结果赋给变量full_name。然后,将full_name的值转换为首字母大写格式,并将结果返回到函数调用行。

调用返回值的函数时,需要提供一个变量,以便将返回的值赋给它。在这里,将返回值赋给了变量musician。输出为整洁的姓名:

在这里插入图片描述

原本只需编写下面的代码就可输出整洁的姓名,相比于此,前面做的工作好像太多了:

print("Jimi Hendrix")

但在需要分别存储大量名和姓的大型程序中,像get_formatted_name()这样的函数非常有用。可以分别存储名和姓,每当需要显示姓名时都调用这个函数。

1.2 让实参变成可选的

有时候,需要让实参变成可选的,这样使用函数的人就能只在必要时提供额外的信息。可使用默认值来让实参变成可选的。

例如,假设要扩展函数get_formatted_name(),使其同时处理中间名。为此,可将其修改成类似于下面这样:

def get_formatted_name(first_name, middle_name, last_name):"""返回整洁的姓名。"""full_name = f"{first_name} {middle_name} {last_name}"return full_name.title()musician = get_formatted_name('john', 'lee', 'hooker')
print(musician)

只要同时提供名、中间名和姓,这个函数就能正确运行。它根据这三部分创建一个字符串,在适当的地方加上空格,并将结果转换为首字母大写格式:

在这里插入图片描述
并非所有的人都有中间名,但如果调用这个函数时只提供了名和姓,它将不能正确运行。为了让中间名变成可选的,可给形参middle_name指定一个空的默认值,并在用户没有提供中间名时不使用这个形参。为让get_formatted_name()在没有提供中间名时依然可行,可将形参middle_name的默认值设置为空字符串,并将其移到形参列表的末尾:

  def get_formatted_name(first_name, last_name, middle_name=''):"""返回整洁的姓名。"""if middle_name:full_name = f"{first_name} {middle_name} {last_name}"else:full_name = f"{first_name} {last_name}"return full_name.title()musician = get_formatted_name('jimi', 'hendrix')print(musician)musician = get_formatted_name('john', 'hooker', 'lee')print(musician)

在本例中,姓名是根据三个可能提供的部分创建的。由于人都有名和姓,因此在函数定义中首先列出了这两个形参。中间名是可选的,因此在函数定义中最后列出该形参,并将其默认值设置为空字符串。

在函数体中,检查是否提供了中间名。Python将非空字符串解读为True,因此如果函数调用中提供了中间名,ifmiddle_name将为True。如果提供了中间名,就将名、中间名和姓合并为姓名,再将其修改为首字母大写格式,并返回到函数调用行。在函数调用行,将返回的值赋给变量musician,然后这个变量的值被打印出来。如果没有提供中间名,middle_name将为空字符串,导致if测试未通过,进而执行else代码块:

只使用名和姓来生成姓名,并将格式设置好的姓名返回给函数调用行。在函数调用行,将返回的值赋给变量musician,然后这个变量的值被打印出来。

这个修改后的版本不仅适用于只有名和姓的人,而且适用于还有中间名的人:

Jimi Hendrix
John Lee Hooker

可选值让函数能够处理各种不同的情形,同时确保函数调用尽可能简单。

1.3 返回字典

函数可返回任何类型的值,包括列表和字典等较复杂的数据结构。例如,下面的函数接受姓名的组成部分,并返回一个表示人的字典:

  def build_person(first_name, last_name):"""返回一个字典,其中包含有关一个人的信息。"""person = {'first': first_name, 'last': last_name}return personmusician = build_person('jimi', 'hendrix')print(musician)

函数build_person()接受名和姓,并将这些值放到字典中。存储first_name的值时,使用的键为’first’,而存储last_name的值时,使用的键为’last’。最后,返回表示人的整个字典。
打印这个返回的值,此时原来的两项文本信息存储在一个字典中:

在这里插入图片描述

这个函数接受简单的文本信息,并将其放在一个更合适的数据结构中,让你不仅能打印这些信息,还能以其他方式处理它们。当前,字符串’jimi’和’hendrix’被标记为名和姓。你可以轻松地扩展这个函数,使其接受可选值,如中间名、年龄、职业或其他任何要存储的信息。例如,下面的修改让你能存储年龄:

def build_person(first_name, last_name, age=None):"""返回一个字典,其中包含有关一个人的信息。"""person = {'first': first_name, 'last': last_name}if age:person['age'] = agereturn personmusician = build_person('jimi', 'hendrix', age=27)
print(musician)

在函数定义中,新增了一个可选形参age,并将其默认值设置为特殊值None(表示变量没有值)。可将None视为占位值。在条件测试中,None相当于False。如果函数调用中包含形参age的值,这个值将被存储到字典中。在任何情况下,这个函数都会存储人的姓名,但可进行修改,使其同时存储有关人的其他信息。

1.4 结合使用函数和while循环

可将函数同前面介绍的任何Python结构结合起来使用。例如,下面将结合使用函数get_formatted_name()和while循环,以更正式的方式问候用户。下面尝试使用名和姓跟用户打招呼:

  def get_formatted_name(first_name, last_name):"""返回整洁的姓名。"""full_name = f"{first_name} {last_name}"return full_name.title()# 这是一个无限循环!while True:print("\nPlease tell me your name:")f_name = input("First name: ")l_name = input("Last name: ")formatted_name = get_formatted_name(f_name, l_name)print(f"\nHello, {formatted_name}!")

在本例中,使用的是get_formatted_name()的简单版本,不涉及中间名。while循环让用户输入姓名:依次提示用户输入名和姓。

但这个while循环存在一个问题:没有定义退出条件。请用户提供一系列输入时,该在什么地方提供退出途径呢?要让用户能够尽可能容易地退出,因此每次提示用户输入时,都应提供退出途径。每次提示用户输入时,都使用break语句提供退出循环的简单途径:

def get_formatted_name(first_name, last_name):"""返回整洁的姓名。"""full_name = f"{first_name} {last_name}"return full_name.title()while True:print("\nPlease tell me your name:")print("(enter 'q' at any time to quit)")f_name = input("First name: ")if f_name == 'q':breakl_name = input("Last name: ")if l_name == 'q':breakformatted_name = get_formatted_name(f_name, l_name)print(f"\nHello, {formatted_name}!")

我们添加了一条消息来告诉用户如何退出,然后在每次提示用户输入时,都检查他输入的是否是退出值。如果是,就退出循环。现在,这个程序将不断地问候,直到用户输入的姓或名为’q’:

在这里插入图片描述

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

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

相关文章

Photoshop使用教程 如何在线抠图

PS软件已经越来越普及,不管是拍什么类型的照片都少不了修图,而PS是相较易操作而且很专业的一个PS软件,但是很多人可能在电脑上无法安装Photoshop软件,遇到这样的问题应该怎么办呢?今天小编和大家一起看看没有Photoshop…

花33元租号玩2小时王者荣耀,居然还有这样的App

梦晨 发自 凹非寺量子位 报道 | 公众号 QbitAI 史上最严防沉迷规定的第一周,已经有小学生租号玩王者荣耀了。 据央视新闻曝光,租一个等级高、皮肤多的账号玩2小时就要花费33元。 而且不是店家发账号密码给你登录这么简单。 拍下账号后得到的是一串解锁码…

计算机游戏软件使用说明书,虚贝游戏上号器怎么用 使用方法详解

虚贝上号器是专为虚贝租号平台打造的上号软件,可以方便的进行选号下单、商品收藏、订单管理等功能,帮助您实现电脑游戏租赁后的自动登录,下面就跟小编一起了解下具体用法吧。 第一步 注册并登录 下载安装,并注册一个虚贝网帐号并登…

网路安全技能竞赛——【Linux操作系统渗透提权】解析(超级详细)

Linux操作系统渗透提权 任务环境说明: 服务器场景:Server2202(关闭链接)用户名:hacker 密码:123456 使用渗透机对服务器信息收集,并将服务器中SSH服务端口号作为flag提交;…

数据挖掘学习(三)——文本挖掘

笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值,找寻数据的秘密,笔者认为,数据的价值不仅仅只体现在企业中,个人也可以体会到数据的魅力,用技术力量探索行为…

七种方法计算文本相似度方法

简单讲解 基于关键词的空间向量模型的算法,将用户的喜好以文档描述并转换成向量模型,对商品也是这么处理,然后再通过计算商品文档和用户偏好文档的余弦相似度。 文本相似度计算在信息检索、数据挖掘、机器翻译、文档复制检测等领域有着广泛…

java基础知识点总结

java基础知识点总结 文章目录 java基础知识点总结一、JDK常用的包二、Get和Post的区别三、Java多态的具体体现四、StringBuffer StringBuilder String 区别五、Hashtable与HashMap的区别六、九大隐式对象七、Forword(请求转发)与Redirect(重定向)八、JQurey总结九、XML和Json的…

java学习进阶之路

一、下面是一个java学习路线图,以供参考 二、下面是java工作之路,以供参考: 三、下面给出阶段性细化需要掌握的技能: 1.第一阶段 2.第二阶段 3.第三阶段 4.第四阶段 5.第五阶段 四、更加细化的细节如下: 1&#xff1…

拓扑排序 php,数据结构与算法(周测7-拓扑排序和AOV网络)

判断题 1.AOE图的关键路径就是最长的路径 T F 2.AOE图的权值最大的边(活动)一定是关键活动。 T F 两条边相加可能比最大的边还要大。 3.在AOE-网工程中,减少任一关键活动上的权值后,整个工期也就会相应的减小。 T F 关键路径有多条时不一定。 4.AOE-网工程工期为关键活动上的…

Java字符串的处理

文章目录 本章学习要点 Java定义字符串(2种方式)直接定义字符串例 1 使用 String 类定义1. String()2. String(String original)3. String(char[ ]value)4. String(char[] value,int offset,int count) 小白如何使用Java API帮助文档?Java St…

华为java面试题

1、Java 常用集合及特点? List:ArrayList、LinkedList、Vector、Stack Set:LinkedSet、HashSet、TreeSet Queue->Deque->LinkedList。 Map:HashMap、LinkedHashMap、TreeMap Dictionary->HashTable->Properties…

快速排序基本思路(通俗易懂+例子)

快速排序 【内推】日常实习和社招也可以简历发送到我邮箱,长期接受简历,部门做搜索产品研发,主要php和go语言! 【2022百度提前批招聘】填写内推码可以免专业笔试,部门直接发起面试,有想去的部门可以发送简…

java面试八股文

目录 一、java(1)集合1.list:LinkedList、ArrayList和Vector2.set:HashSet和TreeSet3.map:HashMap、TreeMap和HashTable4.list、set和map的区别5.HashMap扩容机制6.HashMap中的循环链表是如何产生的(jdk1.7…

十大排序算法之(二)快速排序--JAVA+C++实现(简单易懂)

文章目录 快速排序(Quicksort)1、实现原理:1.1、动图展示:1.2、实现步骤: 2、时间复杂度3、代码实现:3.1、JAVA 实现3.2、C实现3.3、C语言实现3.4、C语言递归实现: 快速排序(Quickso…

《数据结构与算法》(二十五)- 排序算法:快速排序

目录 前言1. 快速排序1.1 快速排序算法1.2 快速排序算法复杂度分析1.3 快速排序优化 2. 总结 原文地址:https://program-park.github.io/2021/11/24/algorithm_25/ 前言 部分内容摘自程杰的《大话数据结构》 1. 快速排序 快速排序算法最早由图灵奖获得者 Tony Hoar…

c语言的快速排序,C语言实现快速排序法(分治法)

title: 快速排序法(quick sort) tags: 分治法(divide and conquer method) grammar_cjkRuby: true 算法原理 分治法的基本思想:将原问题分解为若干个更小的与原问题相似的问题,然后递归解决各个子问题,最后再将各个子问题的解组合成原问题的解。 利用分治法可以将解决办法分…

面了个蚂蚁金服拿38K出来的,真是砂纸擦屁股,给我露了一手啊

今年的春招结束,很多小伙伴收获不错,拿到了心仪的 offer。 各大论坛和社区里也看见不少小伙伴慷慨地分享了常见的面试题和八股文,为此咱这里也统一做一次大整理和大归类,这也算是划重点了。 俗话说得好,他山之石&…

10:mysql----存储引擎--进阶篇

目录 1:MySQL体系结构 2:存储引擎简介 3:存储引擎特点 4:存储引擎选择 1:MySQL体系结构 连接层 : 最上层是一些客户端和链接服务,主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。 服务层 :…

vivo android 6.0 root,vivo X6 A(全网通)如何获取ROOT权限教程

vivo X6 A(全网通)怎么ROOT?vivo X6 A(全网通)ROOT工具选用哪些?如何避免vivo X6 A(全网通)ROOT失败?带着这些疑问来搜索vivo X6 A(全网通)ROOT方法的机友很多。小编推荐这篇vivo X6 A(全网通)一键ROOT教程,具体步骤如下: 1.首先打开奇兔刷机软件&…