更新时间: 试题数量: 购买人数: 提供作者:

有效期: 个月

章节介绍: 共有个章节

收藏
搜索
题库预览
else子句 for循环可以与else子句结合使用,当循环正常退出时执行else子句。 for循环中else子句的语法格式 for 变量 in 可迭代对象 循环体语句块1 else: 语句块2 执行过程: 当for循环已遍历完可迭代对象中所有的元素后,执行else后面的语句块2。 如果循环被break语句中止,则不会执行else后面的语句块2。 程序举例1: city=['Beijing','Shanghai','Shenzhen'] for c in city: print(c) else: print('中国一线城市!') 输出: Beijing Shanghai Shenzhen 中国一线城市! 程序举例2: city=['Beijing','Shanghai','Shenzhen'] for c in city: if 'S' in c: break print(c) else: print("中国一线城市!") 输出: Shanghai 【注:这里写错了,应该是Beijing】 编程要求 从键盘输入一个正整数,判断它是否为素数,若是素数,输出“是素数”,否则输出“不是素数”。 题目分析 素数即质数,它除了能被1和它本身整除外,不能被其他任何整数整除(1不是素数)。 例如,7是素数,除了1和7以外,它不能被2~6之间的任何整数整除。 判断素数的方法:把 n 作为被除数,i=2~n-1依次作为除数,判断 n 与 i 相除的结果,若都除不尽,即余数都不为0,则 n 为素数;反之,只要有一次能除尽(余数为0),则说明 n 存在一个1和它本身以外的因子,它就不是素数。 输入输出样例 输入 9 输出 9 不是素数! 输入 7 输出 7 是素数! 注意:输出的数字后有一个空格。
打印如图所示的九九乘法表。 注意:输出语句使用end参数,end=“\t”,使每个表达式后有一个tab符号,从而使乘法表每列对齐。可参考下面补充知识。 补充知识 print() 函数的参数说明如下: print()函数是Python中用于输出内容的内置函数,它可以接受多个参数并将它们打印到标准输出(通常是控制台)。 下面是print()函数的参数说明: print(*objects, sep=’ ‘, end=’\n’, file=sys.stdout, flush=False) *objects:要打印的对象,可以是一个或多个参数。它们将按顺序打印在一行上。使用逗号分隔多个对象。 sep=’ ‘(可选):用于分隔多个对象之间的字符串。默认情况下,它是一个空格字符。 end=’\n’(可选):用于表示打印结束的字符串。默认情况下,它是一个换行符 \n,表示在输出内容的末尾打印一个换行符,使下一行输出位于新的一行。 file=sys.stdout(可选):指定要将输出发送到的文件对象。默认情况下,输出被发送到标准输出流(通常是控制台)。你可以将其设置为一个文件对象,以将输出写入文件。 flush=False(可选):控制是否刷新输出缓冲区。默认情况下,缓冲区会自动刷新。如果将其设置为True,则立即刷新缓冲区,将内容输出到目标文件或终端。 通过使用这些参数,你可以控制打印输出的格式、分隔符和结束字符。下面是几个示例: print("Hello", "World") # 输出:Hello World print("Hello", "World", sep=" ") # 输出:Hello World print("Hello", "World", end="!") # 输出:Hello World! print("Hello", "World", sep="-", end="!") # 输出:Hello-World!
字符串:用单引号‘或双引号“或三个单引号或三个双引号括起来的任何字符。 字符串的拼接:在很多情况下,我们需要将两个字符串拼接起来。 任务描述:本关任务是将两个不同的字符串,拼接形成一个字符串,并将新字符串输出来。 例如,一个人的姓名,通常是由“姓氏”+“名字”组成的。在很多程序中,为了方便后续处理,通常将姓氏和名字分别存在两个变量中。然后在显示时,要将姓氏和名字拼接起来,按全名显示。 first_name = 'Zhang' last_name = 'san' 输出如下: full_name = 'Zhang san' 相关知识 字符串拼接方法 在Python中,有多种方式可以进行字符串拼接。以下是几种常见的方法: 1.使用加号(+)运算符: first_name = "John" last_name = "Doe" full_name = first_name + " " + last_name print(full_name) # 输出:John Doe 2.使用逗号(,)将多个字符串作为参数传递给print()函数: first_name = "John" last_name = "Doe" print(first_name, last_name) # 输出:John Doe 3.使用字符串的format()方法: first_name = "John" last_name = "Doe" full_name = "{} {}".format(first_name, last_name) print(full_name) # 输出:John Doe 4.使用f-string(格式化字符串): first_name = "John" last_name = "Doe" full_name = f"{first_name} {last_name}" print(full_name) # 输出:John Doe 注意 Python 2.6及更高版本中使用字符串的 format() 方。 Python 3.6及更高版本中,推荐使用更简洁的f-string来进行字符串格式化。 程序举例 # 将姓氏和名字分别保存在两个变量中 first_name = 'Zhang' last_name = 'san' # 将姓氏和名字拼接,将结果存储在full_name变量中 full_name = first_name + " " + last_name print(full_name) 输出结果: Zhang san 输入字符串的读入 由于我们写的程序需要处理不同的姓氏和名字,因此有必要从系统读入用户提供的相关字符串,下面介绍输入字符串的读入方法: first_name = input() last_name = input() 上面两行程序的含义是: 读入第一行输入对应的字符串,并保存到first_name变量中。 读入第二行输入对应的字符串,并保存到last_name变量中。 编程要求 本关的编程任务是补全代码,实现如下功能: 将存放姓氏的字符串变量和存放名字的字符串变量拼接起来,中间用一个空格隔开,并将结果存储在full_name变量中; 打印输出full_name变量。 以下是样例测试集: 测试输入: Hu dong 预期输出: Hu dong
对给定的字符串进行处理,包括字符串长度计算、大小写转换以及去除字符串前后空格等。 在字符串处理中,经常需要统计字符串的长度、进行大小写转换以及去除字符串前后空格等操作。例如,在基于关键词的搜索引擎中,要查询关键词是否在文档或者网页中出现,搜索引擎并不需要区分关键词中字符的大小写以及关键词前后的空格等。这时就需要对字符串进行处理,将其中的大写字符都转换为小写,并剔除字符串开头和结尾处的空格,然后再统一进行字符串匹配。 相关知识:Python 标准库提供了一系列关于字符串处理的函数。本关的小目标是让大家学习并掌握 Python 常用字符串方法中的len()、lower()和strip()函数的用法,并完成相应字符串处理任务。 字符串长度获取:Python 提供了len()函数来计算,并返回字符串的长度,即字符串中单个元素的个数。其基本语法如下: length = len(target_string) 其中: target_string: 目标字符串变量; length: 保存字符串长度的变量; len: 获取字符串长度的语法关键词。 下面给出了具体的使用示例: # 创建一个字符串变量,获取其长度并打印出来 color = 'It is red' length = len(color) print (length) # 直接在len函数中引入字符串内容获得其长度,然后打印出来 print(len('This is a circle!')) 输出结果: 9 17 注意: 从输出结果可以看到,空格也占一个字符元素的位置。 大小写转换 Python 提供了upper()和lower()方法,来对字符串进行大小写转换。其中,upper()会将字符串中的所有字符都转换为大写,lower()则将所有字符转换为小写。除此之外,Python 还贴心的提供了title()方法,将字符串所有单词的首字母变成大写,而其他字母依然小写。各个方法的具体语法如下: # 将源字符串转换为大写并存入upper_string变量 upper_string = source_string.upper() # 将源字符串转换为小写并存入lower_string变量 lower_string = source_string.lower() # 将源字符串每个词首字母转换为大写并存入title_string变量 title_string = source_string.title() 其中,source_string为待处理的源字符串。具体使用示例如下: # 创建一个字符串say_hello say_hello = 'Dear my Daughter' # 使用upper()方法对say_hello字符串进行处理 upper_say_hello = say_hello.upper() # 使用lower()方法对say_hello字符串进行处理 lower_say_hello = say_hello.lower() # 使用title()方法对say_hello字符串进行处理 title_say_hello = say_hello.title() # 打印输出四个字符串 print (say_hello+ "\n") print (upper_say_hello+ "\n") print (lower_say_hello+ "\n") print (title_say_hello+ "\n") 输出结果: Dear my Daughter DEAR MY DAUGHTER dear my daughter Dear My Daughter 注意: 由上述打印结果可以看出,上述方法的调用,并不会对原始的 say_hello字符串产生影响,转换后的字符串会存入新的变量中。 去除字符串首尾空格:Python 提供了strip()方法,可以去除字符串两侧(不包含内部)全部的空格。使用该方法,也可以通过指定参数,去除两侧指定的特定字符。 注意:在指定参数时,如果参数是多个字符,则该方法会将多个字符逐个去比对,进行删除(区分大小写),直到首尾两侧没有匹配的字符为止。但是,该方法对字符串中间的字符没有影响。 其基本语法如下: strip_string1 = source_string.strip() string_strip2 = source_string.strip(target_char) 其中: source_string:待处理的源字符串; strip_string1和strip_string2:处理后的字符串; target_char:需要从源字符串首尾去除的特定字符。 具体使用示例如下: # 创建一个字符串hello_world hello_world = ' **The world ** is big!* ' # 利用strip()方法处理hello_world字符串 blank_hello_world = hello_world.strip() char_hello_world = hello_world.strip('TH *') # 打印输出转换后的字符串 print(blank_hello_world) print(char_hello_world) 输出结果: **The world ** is big!* he world ** is big! 输出结果分析: 从第一行打印结果可以看到,strip()方法去除了源字符串首尾的所有空格,但是并没有去除字符串中间的空格; 从第二行打印结构可以看出,strip()方法将源字符串首尾所有空格、* 以及字符T去掉了,而源字符串中头部的h因为是小写并没有去除。 编程要求 本关的编程任务是,补全代码,实现给定字符串的转换功能,具体要求如下: step1 :将输入的源字符串source_string首尾的空格删除; step2 :将 step1 处理后的字符串的所有单词的首字母变为大写,并打印输出; step3 :将 step2 转换后的字符串的长度打印输出。 样例测试集: 测试输入: Where there is a will 预期输出: Where There Is A Will 36
本关的任务是,给定一个字符串,要利用 Python 提供的字符串处理方法,从该字符串中,查找特定的词汇,并将其替换为另外一个更合适的词。例如,给定一个字符串Where there are a will, there are a way,我们发现这句话中存在语法错误,其中are应该为is,需要通过字符串替换将其转换为Where there is a will, there is a way。 在大家日常工作使用 Word 编写文档的过程中,经常会遇到一个问题,发现前面写的文档中某个词用错了,需要换为另外一个词来表达。Word 提供了全文查找与替换的功能,可以帮助用户很方便的处理这一问题。那么,这一功能最基础和核心的就是字符替换,如果我们要自己基于 Python 来实现,该怎么做呢? 编程要求:本关的编程任务是,补全代码,实现如下功能: step1 :查找输入字符串source_string中,是否存在day这个子字符串,并打印输出查找结果; step2 :对输入字符串source_string执行字符替换操作,将其中所有的 day替换为time,并打印输出替换后的字符串; step3 :对 step2 进行替换操作后的新字符串,按照空格进行分割,并打印输出分割后的字符列表。 样例测试集: 测试输入: All day is no day when it is past. 预期输出: 4 All time is no time when it is past. ['All', 'time', 'is', 'no', 'time', 'when', 'it', 'is', 'past.'] 第一行输出结果即为"day"在source_string字符串中的位置; 第二行输出结果即为将其中所有的 day替换为time后的字符串; 第三行输出结果即为对 step2 进行替换操作后的新字符串,按照空格进行分割后的字符列表。
本关任务:简单的人名对话。 相关知识:为了完成本关任务,你需要掌握: 格式化输入输出; Python 字符串。 格式化输入输出 input()函数将用户输入的内容当做一个字符串类型,这是获得用户输入的常用方式。print()函数可以直接打印字符串,这是输出字符串的常用方式。 如下例子展示了如何用变量name来存储用户的名字,再输出这个变量的内容: >>>name=input('请输入名字:') 请输入名字:郭靖 >>>print(name) 郭靖 采用格式化输出方式,通过format()方法将待输出变量整理成期望输出的格式,如: >>>name=input("请输入一个人的名字:") 请输入一个人的名字:郭靖 >>>country=input("请输入一个国家的名字:") 请输入一个国家的名字:中国 >>>print("{}来自于{}".format(name,country)) 郭靖来自于中国 Python 字符串 文本在程序中用字符串类型来表示。Python 语言中,字符串是用两个双引号““或者单引号’'括起来的零个或多个字符。如上例中的”请输入一个人的名字:”。 字符串是字符的序列,可以按照单个字符或字符片段进行索引,字符串包括两种序号体系:正向递增序号和反向递减序号。 如上图中字符串Hello World长度为11(注意,空格也是一个字符),正向递增以最左侧字符H序号为0,向右侧依次递增,最右侧字符d序号为11-1=10;反向递减序号以最右侧字符d序号为-1,向左依次递减,最左侧字符H序号为-11。这两种索引字符的方法可以同时使用。 Python 字符串也提供区间访问方式,采用[N:M]格式,表示字符串中从N到M(不包含M)的子字符串,其中,N和M为字符串的索引序号,可以混合使用正向递增序号和反向递减序号。如果表示中N或者M索引缺失,则表示字符串把开始或结束索引值设为默认值。 注意:字符串中的英文字符和中文字符都算作1个字符。 示例如下: >>>name="Python语言程序设计" >>>name[0] 'P' >>>print(name[0], name[7], name[-1]) P 言 计 >>>print(name[2:-4]) thon语言 >>>print(name[:6]) Python >>>print(name[6:]) 语言程序设计 >>>print(name[:]) Python语言程序设计 编程要求 根据提示,在右侧编辑器 Begin-End 区间补充代码,根据用户输入的人名给出一些不同的回应。 提示:第二句和第三句可以模仿已经给出的第一句的部分代码,注意观察后两句话的特点,可以发现第一个字,是通过字符串索引提取。 例如: 郭靖 输出: 郭靖同学,学好Python,前途无量! 郭大侠,学好Python,大展拳脚! 靖哥哥,学好Python,人见人爱! 测试说明 平台会对你编写的代码进行测试: 测试输入: 风清扬 预期输出: 风清扬同学,学好Python,前途无量! 风大侠,学好Python,大展拳脚! 清扬哥哥,学好Python,人见人爱!
Python的序列 Python中基本的数据结构是序列。序列中的每个元素都有位置编号,即元素的索引。其中,第一个元素的索引号为0,之后的索引号为1,2,3,…。 Python序列主要有字符串( str),列表(list),元组(tuple)。 这三种序列的示例如下: #字符串示例: 'Hello' #列表示例: [12, 33.5, 'abc', 7] #元组示例: ('kk',99.7,75) 从这些示例可以看出,字符串是用引号括起来的一串字符(可以是单引号,双引号、三引号),这些字符有先后顺序,也就是有索引。列表和元组从表面上看,一个是用中括号括起来,一个是用圆括号括起来,但是它们有本质的差别。还可以看到列表或元组中不要求元素的类型相同。 通用序列操作 适用于所有序列的操作主要有索引、切片、相加、相乘和成员资格检查等。 通用序列常用操作符入下图所示: Description 索引 序列中的索引正方向从0开始递增,反方向从一1开始递减。设t = ['a','b','c','d'],其元素的索引值如下图所示。其可以用索引来访问序列中的元素,也可以用切片来访问序列中连续的若干元素。 Description 切片 序列切片设置左边界和右边界来截取序列中的一段。其基本格式为: 序列名[左边界:右边界:步长] 其中,左边界、右边界和步长均可以省略。步长的默认值为1,具体意义可以参照下面列表索引与切片的例子。 Description 下面是元组和字符串索引与切片的例子。 Description 加法与乘法 序列的加法表示序列连接,序列的乘法表示序列重复。 Description 成员资格检查 判定某元素是否在一个序列中,使用in或者not in,计算结果为布尔型true或false。 Description 通用序列函数 序列的内置函数主要有len() , min() , max() , sum() , sorted()等。 其中len()函数返回序列包含的元素个数, min()和 max()函数分别返回序列中的最小元素和最大元素, sum()函数返回数值型序列中所有元素的和。另外, range()函数是一个与序列非常相关,也很常用的函数。 Description sorted()函数是将一个序列排序,排序后形成一个列表,返回列表,但是原序列不变。 Description 遍历序列 for循环可以遍历可迭代对象中的元素。字符串、列表、元组这样的序列是可迭代对象。 for循环结构的语法格式 for 循环变量 in 可迭代对象: 循环体 程序举例 for i in 'abc': print(i) 输出 a b c 程序举例 for i in [1,2,'a']: print(i) 输出 1 2 a【缺少答案,请补充】
本关的任务是学会列表排序相关操作的使用方法,实现对列表元素的排序。一般情况下我们创建的列表中的元素可能都是无序的,但有些时候我们需要对列表元素进行排序。 例如,我们想将参加会议的专家名单guests列表中的五个名字元素[‘zhang san’,‘li si’,‘wang wu’,‘sun qi’,‘qian ba’],分别按照首字母从小到大的顺序和从大到小的顺序分别排序。排序后的输出分别为: ['li si','qian ba','sun qi','wang wu','zhang san'] ['zhang san','wang wu','sun qi','qian ba','li si'] 相关知识:Python 针对列表数据结构内置提供了sort()方法,实现对列表元素的排序功能。其基本语法如下: source_list.sort(reverse=True) 其中: source_list:待排序的列表; sort:列表排序函数的语法关键词; reverse:sort函数的可选参数。如果设置其值为True,则进行反向从大到小排序,如果设置为False或者不填写该参数,则默认进行正向从小到大排序。 例如,给定一个客人列表guests,我们对其按照字母排序如下: guests = ['zhang san','li si','wang wu','sun qi','qian ba'] guests.sort() print(guests) guests.sort(reverse=True) print(guests) 程序输出结果: ['li si','qian ba','sun qi','wang wu','zhang san'] ['zhang san','wang wu','sun qi','qian ba','li si'] 注意:sort函数会直接作用于待排序的列表并修改其排序。 编程要求 本关的编程任务是补全代码,要求实现对输入列表source_list中的元素按照首字母从小到大的顺序进行排序,并且输出排序后的列表。 本关代码框架如下: # 创建并初始化source_list列表 source_list = input().split(',') # 请在此添加代码,对source_list列表进行排序等操作并打印输出排序后的列表 样例测试集: 测试输入: zhang san,li si,wang wu,tan qi,hu ba 预期输出: [‘hu ba’, ‘li si’, ‘tan qi’, ‘wang wu’, ‘zhang san’]
本关任务是利用合适的方法快速创建数值列表,并能够对列表中的元素数值进行简单的统计运算。在数据可视化的背景下,数值列表在 Python 列表中的应用十分广泛,列表十分适合存储数字集合。 本关目标是让学习者掌握一些处理数字列表的基本方法,主要包括数字列表的创建、对数字列表进行简单的统计运算等。例如,我们要创建一个从2到10的偶数的数字集合,然后计算出该集合的数值之和: data_set = [2,4,6,8,10] sum=30 相关知识:本关可以利用range()、list()、sum()等函数方法来实现我们的目标。 range()函数 Python 提供了range()函数,能够用来生成一系列连续增加的数字。其基本使用语法有如下三种: range(lower_limit,upper_limit,step) 其中: lower_limit: 生成系列整数的下限整数,不填该参数则默认为从0开始,生成的整数从此数开始,包括该数; upper_limit:生成系列整数的上限整数,必填参数,生成的整数要小于该上限; step:在下限和上限之间生成系列整数之间的间隔步长,不填该参数则默认步长为1。 注意:range()函数的三个参数都只能为整数。如果range()函数中仅一个参数,则该参数表示upper_limit,如果仅两个参数,则分别表示lower_limit和upper_limit。 例如,要生成1~6之间步长为2的系列整数: for i in range(1,6,2): print(i) 输出结果: 1 3 5 基于range()函数创建数字列表 我们可以通过range()函数,利用 Python 列表提供的append()插入功能创建一个列表。 例如,我们要创建一个包含10个0~9整数的平方的列表: # 声明一个列表变量 numbers = [] # 利用append()函数和range()函数向列表插入目标元素 for i in range(10): number = i**2 numbers.append(number) print(numbers) 输出结果: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 使用list()函数和range()函数创建数字列表 我们可以利用list()函数将range()生成的系列数字直接转为列表,这时range()函数的返回值将会作为list()函数的参数,输出为一个数字列表。其基本使用语法如下: data_list = list(range(lower_limit,upper_limit,step)) 其中: list:列表函数的语法关键词; range:函数语法关键词; data_list:最终生成的列表变量。 例如,我们要生成并输出1~5的数字列表: data_list = list(range(1,6)) print(data_list) 输出结果: [1,2,3,4,5] 对数字列表进行简单的统计运算 Python 中有一些专门处理数字列表简单的统计运算的函数,利用这些函数可以轻松找到数字列表的最小值、最大值及进行总和等一系列统计运算。其基本语法如下: min_value = min(data_list) max_value = max(data_list) sum_value = sum(data_list) 其中: min:数字列表求最小值的语法关键字; max:数字列表求最大值的语法关键字; sum:数字列表求和的语法关键字。 具体使用示例如下: numbers = [2,4,11,1,21,32,5,8] print('The min number is',min(numbers)) print('The max number is',max(numbers)) print('The sum is',sum(numbers)) 输出结果: The min number is 1 The max number is 32 The sum is 84 编程要求 编程任务是补全文件的代码,实现如下功能: step1:根据给定的下限数lower, 上限数upper以及步长step,利用range函数生成一个列表; step2:计算该列表的长度; step3:求该列表中的最大元素与最小元素之差。 本关的代码文件代码框架如下: # 创建并读入range函数的相应参数 lower = int(input()) upper = int(input()) step = int(input()) # 请在此添加代码,实现编程要求 评测说明 样例测试集: 测试输入: 25 90 4 预期输出: 17 64
我们在前三关中学习了如何处理单个列表元素和所有列表元素,在这一关中我们还将学习如何处理部分列表元素(Python 中称为切片)。例如,当我们去餐馆吃饭点菜时,你的菜单和我的菜单有些时候是一模一样,也有些时候是部分菜名一样。那么如何根据我已经点好的菜单生成你的菜单呢? 本关将通过菜名列表的部分复制,让学习者了解并掌握列表切片的基础知识。 相关知识:Python 切片是对一个列表取其部分元素获得一个子序列的常见操作,切片操作的返回结果类型与被切片的对象一致。要创建一个已有列表的切片,通过指定切片的第一个列表元素和最后一个列表元素的索引号即可。其基本语法如下: list_slice = source_list[start:end:step] 其中: source_list:被切片的源列表; list_slice:切片后生成的子序列列表; start:切片起始索引位置,省略则从头开始; end:切片结束索引位置,省略则切至列表末尾; step:切片步长,可选参数,表示每N个元素取一个,默认为1。 注意:切片和range()函数一样,Python 会自动到达所指定切片结束索引位置的前面一个元素停止。 例如,下面是我已经点好的菜名列表,现在朋友点的菜单中包含我的前三个菜名,输出朋友的菜单: my_menu = ['fish','pork','pizza','carrot'] print(my_menu[1:4:2]) print(my_menu[:3]) print(my_menu[2:]) 输出结果: ['pork','carrot'] ['fish','pork','pizza'] ['pizza','carrot'] 负数索引返回的是离列表末尾相应间隔的元素,列表末尾元素的索引是从-1开始的。例如,朋友的菜单是包含我的菜单最后3个菜名: my_menu=['fish','pork','pizza','carrot'] print(my_menu[-3:]) 输出结果: ['pork','pizza','carrot'] 编程要求:本关的编程任务是补全文件的代码内容,实现如下功能: 利用切片方法从my_menu列表中每3个元素取1个,组成子序列并打印输出; 利用切片方法获取my_menu列表的最后三个元素组成子序列并打印输出。 本关涉及的代码框架如下: # 创建并初始化my_munu列表 my_menu = input().split(',') # 请在此添加代码,对my_menu列表进行切片操作
元组看起来犹如列表,但元组使用圆括号()而不是[]来标识,而且列表的元素可以修改,但元组的元素不能修改。本关介绍元组的常见使用方法以及元组和列表的使用区别。 下面用饭店菜单的例子来说明列表和元组使用的应用场景: 现在有一个餐馆要向每个包厢都投放两份菜单,菜单上有4种菜名。我们想将两个菜单上最后一道菜名互换一下,也想快速知道改变后的两份菜单上单词首字母最大的菜名。而我们首先需要判断该用列表的方法还是元组的方法实现这个目标。为了实现这个目标,我们需要先学习元组的相关使用知识以及元组与列表的区别。 相关知识 元组与列表 元组与列表很相似,两者之间的差别在于: 列表在初始化后其中的元素还可以进行增删改等操作,但是元组在初始化后其中的元素不能进行更改; 列表在赋值时使用方括号[],而元组在赋值时使用小括号()。 因为元组具有不可变的特性,所以在能用元组替代列表的地方最好都使用元组,这样代码更安全。 创建元组:元组创建很简单,只需要在括号()中添加元素,元素之间用逗号隔开。元组中只包含单个元素时,需要在该元素后面添加逗号。例如: menu1 = ('meat','fish','chicken') menu2 = ('meat',) 访问元组 元组和列表一样,可以使用下标索引来访问元组中的值。例如: menu = ('meat','fish','chicken','carrot') print(menu[0]) print(menu[1:3]) 输出结果: meat ('fish', 'chicken') 修改元组 元组中的元素值是不可以修改的,如果强行修改会报错。例如我们想修改元组menu中的某个值: menu = ('meat','fish','chicken','carrot') menu[0] = 'pizza' print(menu[0]) 输出结果: TypeError: 'tuple' object does not support item assignment 系统会自动报错,元组中的元素值不支持修改。 元组内置函数:元组和列表一样,都有一些内置函数方便编程。例如: len(tuple):计算元组中元素个数; max(tuple):返回元组中元素的最大值; min(tuple):返回元组中元素的最小值; tuple(seq):将列表转换为元组。 元组中的元素是不能改变的,它也没有append()、insert()这样的方法,但其他获取元素的方法和列表是一样的。 编程要求 本关的编程任务是补全文件的代码内容,实现如下功能: 将输入的菜单menu_list转换为元组类型; 打印输出生成的元组; 打印输出元组中首字母最大的元素。 本关涉及的代码文件的代码框架如下: # 创建并初始化munu_list列表 menu_list = input().split(',') # 请在此添加代码,对menu_list进行元组转换以及元组计算等操作,并打印输出元组及元组最大的元素
字典和列表一样,都是 Python 中十分重要的可变容器模型,都可以存储任意类型元素。我们将以菜单的例子来说明字典使用的基本知识,餐馆的菜单上不仅包含菜名,菜名后面还必须包含该道菜的价格。如果要用列表实现,就需要两个列表,例如: list_menu = ['fish','pork','potato','noodles'] list_price = [40,30,15,10] 给定一个菜名,要查找相应的价格,就先要在list_menu中找到相应的位置,再在list_price中找到相应的价格。这种方式效率低下,那么我们是否可以将菜名和价格都存储在一个可变容器中呢?答案是可以的。 在本关中,我们将学习和掌握能够将相关信息关联起来的 Python 字典的相关知识,并完成对包含菜名和价格的菜单的处理操作。 相关知识:字典是 Python 最强大的数据类型之一,通过键-值对的方式建立数据对象之间的映射关系。字典的每个键-值对用冒号:分割,每个键-值对间用逗号,分隔开,字典则包含在{}中。列表格式如下: d = { key1 : value1, key2 : value2 } 每个键都与一个值相关联,我们可以使用键来访问与之相关联的值。与键相关联的值可以是数字、字符串、列表乃至字典。事实上,可将任何Python 对象用作字典中的值。 访问字典中的值:要获取与键相关联的值,可依次指定字典名和放在方括号内的键,如下所示: # 创建并初始化menu字典 menu = {'fish':40, 'pork':30, 'potato':15, 'noodles':10} # 获取并返回menu字典中键'fish'键对应的值 print(menu['fish']) 输出结果: 40 添加键-值对 字典是一种动态数据结构,可随时在字典中添加键-值对。要添加键-值对时,可依次指定字典名、键和键对应的值。下面在字典menu中添加两道菜的菜名和价格: # 创建并初始化menu字典 menu = {'fish':40, 'pork':30, 'potato':15, 'noodles':10} # 向menu字典中添加菜名和价格 menu['juice'] = 12 menu['egg'] = 5 # 输出新的menu print(menu) 输出结果: {'fish': 40,'pork': 30,'potato': 15,'noodles': 10, 'juice': 12,'egg': 5} 新的menu字典包含6个键-值对,新增加的两个键-值对(菜名和对应价格)添加在了原有键-值对的后面。 注意:字典中键-值对的排列顺序和添加顺序没有必然联系。Python 不关心字典中键-值对的排列顺序,而只关心键与值的对应关系。 同理,字典和列表一样,可以先创建一个空字典,然后可以不断向里面添加新的键-值对。 修改字典中的值:字典和列表一样,里面的值都是可以修改的。要修改字典中的值,可直接指定字典中的键所对应的新值。例如,将menu中的fish价格改为50: # 创建并初始化menu字典 menu = {'fish':40, 'pork':30, 'potato':15, 'noodles':10} # 修改menu字典中菜fish的价格 menu['fish'] = 50 # 打印输出新的menu print(menu) 输出结果: {'fish': 50, 'pork': 30, 'potato': 15, 'noodles': 10} 删除键-值对 我们可以通过del方法删除字典中不需要的键-值对。使用del方法时,要指定字典名和要删除的键。例如,在menu菜单中删除键noodles和它的值: # 创建并初始化menu字典 menu = {'fish':40, 'pork':30, 'potato':15, 'noodles':10} # 删除noodles键值对 del menu['noodles'] # 打印输出新的menu print(menu) 输出结果: {'fish': 40, 'pork': 30, 'potato': 15} 编程要求 本关的编程任务是补全文件的代码,实现相应的功能。具体要求如下: 向menu_dict字典中添加一道菜名lamb,它的价格是50; 获取menu_dict字典中的fish的价格并打印出来; 将menu_dict字典中的fish的价格改为100; 删除menu_dict字典中noodles这道菜; 输出新的menu_dict菜单。 本关涉及的代码框架如下: # 创建并初始化munu_dict字典 menu_dict = eval(input()) # 请在此添加代码,实现对menu_dict的添加、查找、修改等操作,并打印输出相应的值 测试说明 平台自动编译并运行stu.py,并以标准输入方式提供测试输入; 平台获取程序输出,并将其输出与预期输出对比。如果一致则测试通过,否则测试失败。 样例测试集: 测试输入: {'pizza': 40, 'noodles':30,'carrot': 20, 'turkey': 34, 'fish': 37} 预期输出: 37 {'pizza': 40, 'carrot': 20, 'turkey': 34, 'fish': 100, 'lamb': 50}
Python 字典中包含大量数据,它和列表一样,支持遍历操作。 Python有多种遍历字典的方式,可以遍历字典的所有键-值对、键或值。 例如,餐馆的菜单包含了菜名和价格等信息,餐馆需要将菜名和价格都展示给顾客,但也有些时候只需要将菜名都展示给厨师,还有些时候只需要将价格展示给收银员,这三种情况就用到了字典不同的遍历方式。 本关的目标是让学习者掌握字典遍历的相关知识和用法,并基于这些知识实现对菜单不同的查找和展示处理。 相关知识:遍历字典中的键-值对 Python 为字典类型提供了items()方法,items()方法会将字典里的所有的键与值一起返回。例如,餐馆有一个菜单包含了菜名和价格信息,菜名和价格顾客都需要知道,可以通过遍历输出menu字典的键和值来实现: # 创建并初始化menu菜单字典 menu={'fish':40,'pork':30,'potato':20,'lamb':50} # 利用items()方法遍历输出键和值 for key,value in menu.items(): print('key:',key) print('value:',value) 输出结果: key: fish value: 40 key: pork value: 30 key: potato value: 20 key: lamb value: 50 输出结果表示,items()方法每次都将对应的键和值指定到key和value变量中,然后用for循环输出。 遍历字典中的键 对于餐馆中的厨师来说,他们并不想要知道菜的价格,只需要知道菜名然后将其做出来就行。所以对于厨师来说,我们需要遍历menu字典中的所有菜名。 Python 为字典类型内置了keys()方法,该方法会将字典里的键遍历出来。例如: # 创建并初始化menu菜单字典 menu={'fish':40,'pork':30,'potato':20,'lamb':50} # 利用keys()方法遍历输出键 for key in menu.keys(): print('food_name:'+key) 输出结果: food_name:fish food_name:pork food_name:potato food_name:lamb 输出结果表示,keys()方法每次都是将menu菜单中的键输出,显示菜名。 遍历字典中的值 对于餐馆中的收银员来说,他们可能并不想知道菜单的菜名,只需要知道菜的价格,然后收账即可。所以对于收银员来说,我们需要遍历menu字典中的所有菜的价格。 Python 为字典类型内置了values()方法,该方法会将字典里的值遍历出来。例如: # 创建并初始化menu菜单字典 menu={'fish':40,'pork':30,'potato':20,'lamb':50} # 利用values()方法遍历输出值 for value in menu.values(): print('food_price:',value) # 可以对values()方法返回值使用max、min、sum等函数计算。 print(max(menu.values())) print(min(menu.values())) print(sum(menu.values())) 输出结果: food_price:40 food_price:30 food_price:20 food_price:50 50 20 140 输出结果表示,values()方法每次都是将menu菜单中的值输出,显示菜的价格。 编程要求:本关的编程任务是补全代码,实现相应的功能。具体要求如下: 将menu_dict菜单的键遍历输出; 将menu_dict菜单的值遍历输出。 本关涉及的代码框架如下: # 创建并初始化munu_dict字典 menu_dict = eval(input()) # 请在此添加代码,实现对menu_dict的遍历操作并打印输出键与值,最后打印所有价格的和、最大值和最小值 样例测试集: 测试输入: {'Spring Rolls':40,'pork':30,'Fried Wonton':15} 预期输出: Spring Rolls pork Fried Wonton 40 30 15 85 40 15
Python 的列表和字典可以存储任意类型的元素,所以我们可以将字典存储在列表中,也可以将列表存储在字典中,这种操作称为嵌套。 例如,餐馆中的菜单不仅仅包含菜名和价格,可能还会包含很多其他信息,这时候我们可能就需要采取嵌套的存储方式。 本关任务是让学习者利用嵌套方式存储菜单,让读者掌握 Python 嵌套的基本操作。 相关知识:列表中存储字典 餐馆中已经有了3份菜单,每份菜单都会有菜名和价格。我们要将这些信息存储在一起,可以采取如下方法:将3份菜单用字典的方式存储菜名和价格,然后将这3份菜单字典存储在一个列表中,例如: # 创建3个菜单字典,包含菜名和价格 menu1 = {'fish':40, 'pork':30, 'potato':20,'noodles':15} menu2 = {'chicken':30, 'corn':55, 'lamb':65,'onion':12} menu3 = {'bacon':36, 'beaf':48, 'crab':72,'eggs':7} # 将3个菜单字典存储到列表menu_total中 menu_total = [menu1,menu2,menu3] # 输出列表 print(menu_total) 输出结果: [{'fish': 40, 'pork': 30, 'potato': 20, 'noodles': 15}, {'chicken': 30, 'corn': 55, 'lamb': 65, 'onion': 12}, {'bacon': 36, 'beaf': 48, 'crab': 72, 'eggs': 7}] 字典中存储列表 我们也可以在字典中存储列表。比如我们对于一份菜单,菜名作为键,而值我们想是这道菜的配料,那么我们就可以将这些配料作为列表存储,然后作为值存储在字典中。例如: # 初始化menu菜单,里面包含配料列表 menu = {'fish':['vinegar','soy','salt'], 'pork':['sugar','wine']} # 输出pork这道菜的配料 print('The burding of pork is:',menu['pork']) 输出结果: The burding of pork is: ['sugar', 'wine'] 字典中存储字典 我们也可以在字典中存储字典。例如我们有一份总菜单,包含2个子菜单,每个子菜单都包含菜名和价格。例如: # 创建一个字典menu_sum,里面包含两个子菜单字典menu1和menu2 menu_sum = { 'menu1':{'fish':40, 'pork':30, 'potato':20,'noodles':15}, 'menu2':{'chicken':30, 'corn':55, 'lamb':65,'onion':12} } # 输出menu1和menu2中的菜名和价格 print(menu_sum['menu1']) print(menu_sum['menu2']) 输出结果: {'fish': 40, 'pork': 30, 'potato': 20, 'noodles': 15} {'chicken': 30, 'corn': 55, 'lamb': 65, 'onion': 12} 编程要求 本关的编程任务是补全代码,实现相应的功能。具体要求如下: menu_total列表中初始时只包含menu1字典,menu1字典中包含两道菜和两道菜的价格; 编程要求是向menu_total列表中添加另外一个菜单字典menu2,menu2菜单中的菜名和menu1菜单一样,菜的价格是menu1菜的价格的2倍; 输出新的menu_total列表。 本关涉及的代码框架如下: # 初始化menu1字典,输入两道菜的价格 menu1 = {} menu1['fish']=int(input()) menu1['pork']=int(input()) # menu_total列表现在只包含menu1字典 menu_total = [menu1] # 请在此添加代码,实现编程要求 # 输出menu_total列表 print(menu_total)
当函数定义里有多个参数时,其参数的传递形式主要有以下五种:位置传递、关键字、默认值传递、包裹传递和解包裹传递。 默认情况下,参数可以按位置或显式关键字传递给 Python 函数。为了让代码易读、高效,最好限制参数的传递方式,这样,开发者只需查看函数定义,即可确定参数项是仅按位置、按位置或关键字,还是仅按关键字传递。 1 位置传递 位置固定,参数传递时按照形式参数定义的顺序提供实际参数。 其优点是使用方便,缺点是当参数数目较多时,参数对应容易混淆。且要求传入参数的数量必须和定义函数时参数的数量相同。 def fun(name, city, hobby): '''接收三个字符串作为参数,返回一个进行自我介绍的字符串''' return '我的名字是{},来自{},我的爱好是{}。 '.format(name, city, hobby) n,c,h = input().split() # 根据空格切分输入字符串,分别赋值给n,c,h print(fun(n,c,h)) # 根据实参变量n,c,h的顺序传递参数或值给形参name, city, hobby 在定义fun()函数时,参数name、city、hobby尚未绑定对象,没有值。 只有经过函数调用,才会把调用时的参数值赋值给形式参数,函数体中的变量才有了值。 定义一个求解一元二次方程根的函数 def solve(a, b, c): """接收三个参数,返回一元二次方程的根""" d = b ** 2 - 4 * a * c if d > 0: disc = d ** 0.5 root1 = (-b + disc) / (2 * a) root2 = (-b - disc) / (2 * a) return root1, root2 elif d == 0: return -b / (2 * a) else: return "此方程无实数根" # 输入系数 a,b,c = map(float,input("请输入一元二次方程的系数(空格分隔):").split()) # 输出结果 print(solve(a,b,c)) 2 关键字传递 关键字传递是指,在函数调用时提供实际参数所对应的形式参数的名称,根据参数名称来传递参数。 关键字并不需要遵守位置的对应关系。其优点是明确标示实际参数和形式参数的对应关系,参数的书写顺序更灵活。缺点是增加了函数调用时的代码书写量。 def fun(name, city, hobby): return '我的名字是{},来自{},我的爱好是{}'.format(name, city, hobby) n,c,h = input().split() # 切分字符串,分别赋值给n,c,h print(fun(hobby = h, city = c,name = n)) # 根据关键字name, city, hobby来传递参数,关键字传递时顺序无关 位置传递和关键字传递可以混用。但要注意的是,混用时,按位置传递的参数要出现在按关键字传递的参数之前。否则,编译器无法明确知道除关键字以外的参数出现的顺序。 def fun(name, city, hobby): return '我的名字是{},来自{},我的爱好是{}'.format(name, city, hobby) n,c,h = input().split() # 切分字符串,分别赋值给n,c,h print(fun(n, hobby = h, city = c)) # 位置参数n出现在关键字参数h和c之前 3 默认值传递 在定义函数的时候,使用形如city='武汉’的方式,可以给形式参数赋予_默认值(default)__。在函数调用时,如果该参数得到传入值,按传入值进行计算,否则使用默认值。 def fun(name, city, hobby='唱歌'): return '我的名字是{},来自{},我的爱好是{}。'.format(name, city, hobby) n,c = input().split() # 切分字符串,分别赋值给n,c,例如输入:夏琪 武汉 print(fun(n, c)) # 默认值参数可以不传值 # 输出: 我的名字是夏琪,来自武汉,我的爱好是唱歌。 print(fun(n, c, '游泳')) # 传值时,默认值会被传入的值替换 # 输出: 我的名字是夏琪,来自武汉,我的爱好是游泳。 需要注意的是,默认值参数必须放在必选参数之后。当函数的参数有多个时,默认值参数必须在后面,非默认值参数在前面。 也就是说,一旦出现了带默认值的参数,后面的其他参数都必须带默认值了。 def fun(name='夏琪', city, hobby='唱歌'): #语法错误,city 是非默认值参数,出现在默认值参数hobby的前面了 return '我的名字是{},来自{},我的爱好是{}。'.format(name, city, hobby) # 以下为主程序,观察输出结果 n,c,h = input().split() # 切分字符串,分别赋值给n,c,h print(fun(n,c,h)) # 调用函数 4 包裹传递 包裹传递也称为不定参数传递,用于在定义函数时不能确定函数调用时会传递多少个参数时使用。函数每次调用时,传递的参数数量可以不同。 1)当传入参数是位置传递时,所有传入参数被收集打包合并成一个元组,再传递给函数。 def add(*number): """接收不确定数量位置传递的参数,合并为一个元组number在函数体内使用""" print(number) # 输出传入的对象,查看参数类型,元组,形如(1,3,5,7, 9) result = 0 # 定义一个变量,用于存储求和结果 for i in number: # 遍历元组中的每个元素 if type(i) in (int, float): # 对参数进行了类型检查(数值型的才能求和) result = result + i # 求和 return result # 返回求和结果 # 以下为主程序,调用函数add传入不同参数,观察输出结果 print(add(1,3,5,7, 9)) # 输出25 print(add(1,2,3,4,5,6,7,8,9, 10)) # 输出55 print(add(1,2, 'hello',3.45, 6)) # 输出12.45 2)当传入参数是关键字传递时,所有传入的关键字参数被收集打包合并成一个字典,再传递给函数。 def add(**number): """接收不确定数量的关键字参数,合并为字典number在函数体内使用""" print(number) # 输出形如{'a': 1, 'b': 3, 'c': 5}的字典 return sum(number.values()) # 对字典的值求和,返回结果 # 以下为主程序,调用函数add传入不同参数,观察输出结果 print(add(a=1, b=3, c=5)) # 输出9 print(add(m=1, n=2, o=3, p=4, q=5, i=6, j=7, k=8)) # 输出36 下面例子中,参数列表中的**kwargs可以接收0个或任意多个关键字参数 调用函数时传入的关键字参数会组装成一个字典(参数名是字典中的键,参数值是字典中的值) 如果一个关键字参数都没有传入,那么kwargs会是一个空字典 def foo(*args, **kwargs): print(args) print(kwargs) foo(3,2.1, True, name='骆昊', age=43, gpa=4.95) #运行后,输出下面内容: #(3,2.1, True) # {'name': '骆昊', 'age': 43, 'gpa': 4.95} 5 解包裹传递 *和**也可以在函数调用时使用,此时称为解包裹传递。 def add(a, b, c): """接收三个位置传递参数,返回其加和""" return a + b + c # 返回三个参数的加和 # 以下是主程序,调用函数,传递参数 num1 = (1,3, 5) # 位置传递参数 print(add(*num1)) # 调用函数,传递参数,输出结果9 num2 = {'a': 1, 'b': 2, 'c': 3} # 关键字传递参数 print(add(**num2)) # 调用函数,传递参数,输出结果6【缺少答案,请补充】
1 2