Python新手练习-PyBite
Bite 108 循环历遍可命名元祖计算总分(Loop over a dict of namedtuples calculating a total score)
有一个字典,字典中包含了不同颜色的pybite忍者腰带奖章,以及对应的分数及获得人数。需要构建一个函数,计算python所有忍者的总得分。
知识点:
collection
的nametuple
- 列表推导式
代码块
|
|
列表推导式写法
|
|
Bite 109 健身字典查询及抛出异常(Workout dict lookups and raising an exception)
查询健身周计划的字典,并在日期输入键值错误时,抛出异常
知识点:
- 抛出异常 ->
exception
format
title()
代码块
|
|
Bite 110 类型转换&处理异常(Type conversion and exception handling)
写一个函数,输入包含分子&分母,把分子&分母转换成整数的数据类型,然后分子除以分母。处理两种异常,输入值异常&分母为零。
知识点
ValueError
ZeroDivisonError
|
|
Bite 1 累加 N 个数字(Sum n numbers)
- 输入:n个数字或者无输入
- 计算:将所有输入的序列元素数字相加,计算它们总数。如果没有输入数字,则返回从 1、2、3、……到 100 的总数
- 输出:总数
知识点
sum
range
思路:
- 判断 numbers 是否是 None,如果是None,计算并返回 1……100(
range(1,101)
) 的叠加总数 - 如果 numbers 不是 None,计算并返回所输入的数字的叠加总数
解决代码:
|
|
Bite 5 解析一个列表中的名字(Parse a list of names)
- 输入:一个列表,包含一串名字的字符串
- 计算:1. 对名字去重 2.按照surname倒序排序 3. 获取长度最短的 firstname
- 输出:1.去重后的名字,每个单词首个字母大写 2. 返回排序后的名字列表 3.返回最短的首名 firstname
知识点
sorting
min
lambda
list comprehesions
思路:
- set()获取NAMES独特值(unique),(set 是 unordered),再用列表推导式,将每一个 set 中的元素 title(), 返回列表
- 匿名函数 lambda x: x.split(“ “),将NAMES的元素按照空格 whitespace 拆分成 firstname surname
- string[-1]切片获取列表中的倒数第一个元素
sorted
方法对元素进行排序,reverse=True(Desending order)- 列表推导式,生成只包含 first name的列表。再用 min()返回最短的firstname
问题代码
|
|
测试代码
|
|
解题代码
|
|
参考答案
|
|
缺漏处:
- 第一个函数,用的是字典推导式。因为字典不允许重复 Key
- 第三个函数,min()的key参数设置为 len
Bite 8 调换字母顺序(Rotate string characters)
- 输入:字符串string&整数n
- 计算:若整数大于0,则将前 n 个字母调换到末尾。/ 若整数小于0,则将后n 个字母调换到末尾。
- 输出:调换后的字符串(rotated string)
知识点
slice
切片deque
双端队列
代码测试
|
|
解决代码:
|
|
Bite 15 列举 2 个序列(Enumerate 2 sequence)
- 输入:2 个列表,包含名字和国家字段
- 计算:列举2个列表的字段——名字和国家,根据索引位置,一一对应。
- 输出:按照索引的数字顺序,打印出对应的列表字段。
知识点
enumerate
列举,枚举string formatting
字符串格式
代码实例参考
enumerate
列举,枚举
https://stackoverflow.com/questions/16326853/enumerate-two-python-lists-simultaneously/16326876
|
|
string formatting
字符串对齐
在 format
方法中,使用<
,>
,^
等符号来指定左对齐、右对齐或者居中。
|
|
python 3.6 的 f-string
|
|
代码测试
|
|
解决代码:
|
|
思路:
zip
打包,name和 country2 个可迭代的列表对象- 在 for 循环中,
enumerate
组合成索引序列 format
指定第二个位置左对齐 11 个chars。第一个位置是调试出来的,字符串的间距3chars?
Bite 16 PyBite日期生成器(PyBites date generator)
- 输入:2 个列表,包含名字和国家字段
- 计算: 每年每一百天
- 输出:
|
|
知识点
islice
http://funhacks.net/2017/02/13/itertools/
|
|
|
|
关于itertool
里的count
官方文档:https://docs.python.org/zh-cn/3/library/itertools.html#itertools.count
|
|
|
|
可见,count()返回 0 开头,1 为步长的序列。
上面的代码块,最后一行代码解读,count()返回一个可迭代对象(),开始索引是 3,结束索引 10,step 步长是 2。
所以,加上list()之后,输出是[3,5,7,9]
datetime.datetime
https://docs.python.org/3/library/datetime.html
一个datetime
对象
|
|
年月日是必需参数。测试脚本里的 2 个0,指的是小时hour和分钟minute
|
|
datetime
https://www.guru99.com/date-time-and-datetime-classes-in-python.html#5
|
|
语言问题,对题目具体要求不甚了解,代码没写出,因此直接看了答案,恍然大悟:
|
|
思路:
- 新建 Days 变量,初始赋值 0
- 永久循环,每次循环迭代变量+1
- 当days 是 100 或者 365 的整数时,返回 PYBITES_BORN + 当前天数的时间 delta
反思:
- 查询
timedelta()
等相关函数知识,是必要的 - 需要强化英语语言的理解水平
Bite 19 写一个简单的属性(Write a Simple Property)
- 输入:格式为字符串的名称(name),格式为 datetime 的过期时间(expires)
- 计算:当前时间,是否大于过期时间。
- 输出:一个名为番茄钟的类(class),包含过期与否的布尔值属性
知识点:
datetime
properties
一个疑问,如何指定函数参数的类型?
|
|
从上面的示例可知,pick 函数输入 2 个参数,一个l
列表,一个index
整数,输出是整数(integer)。
另一个疑问,如何传入datetime
类型的对象?
|
|
输出
|
|
想法:判断 -> NOW(当前时间) 大于> expires(过期时间),返回布尔值
解题过程:
查看datetime.now()的输出
|
|
检索“compare date python”,获得示例代码
来源:https://www.geeksforgeeks.org/comparing-dates-python/
|
|
测试脚本如下:
|
|
解题代码
|
|
显然,函数的「参数格式」以及「datetime」格式转化,在本题中不需要处理。
只需要 -> 添加 self.expired 属性,通过判断时间大小,返回 True&False 的布尔值
Bite 21 查询一个嵌入式数据结构(Query a nested data structure)
- 输入:一个
cars
字典- 计算:1、根据字符的 key,获取value 2、匹配字符串 3、根据阿拉伯字母顺序排序
- 输出:1、所有 jeeps 的模型名称 2、获取每个制造商的第一种车型 3、获取所有名称中包含字符串
Trail
的车型 3、按照阿拉伯字母对车型字典中的值进行排序- 根据论坛讨论,2018.12.18日的讨论,每个函数都传入 cars 字典作为局部变量(Scope local),这样写法更好。
知识点
dictionary comprehesions
sorted
任务 1
获取所有 jeeps 的型号名称,返回相应字符串
|
|
思路:
join()
将序列中的元素以指定字符串连接生成新的字符串,输出:’, ‘(逗号+空格)分割的 Jeep models(吉普车型号)
|
|
解题代码块:
|
|
终端输出
|
|
任务 2
获取所有制造商的第一个车型名称,返回相应列表 list
|
|
解题代码块:
|
|
终端输出
|
|
任务 3
获取所有包含某段字符串(本例是trail
)的型号名称,按照阿拉伯字母顺序排序,返回相应列表
|
|
思路:
- 新建一个空的列表
- 使用
in
运算符,历遍所有字典中的values(注:case-insensitive,意思是大小写不敏感,所以用casefold()
转换),判断其对应的字符串中,是否包含grep所对应的’trail’字符串 - 如果包含’trail’添加入空列表之中,最后,按照阿拉伯字母排序(注:sorted(list),如果列表元素是数字,那么默认是按照增序排序。如果列表元素是字符串,则按照字母顺序(alphabetical order)排序)。
解题代码块:
|
|
终端输出
|
|
任务 4
获取型号名称,按照阿拉伯字母顺序排序,返回相应字典
|
|
思路:
- 新建一个空的字典
- 历遍
cars
字典,获取它的所有键值 - 按照所有键值,添加入新字典,并使用
sorted
方法来重新按字母排序 value 里的元素。
解题代码块:
|
|
最后通关成功:
小结:
- Debug 时,务必查看
test_cars.py
,里面详细写明了代码是如何得到验证的,也熟悉了 asert。在任务三时,发现会另外传入一个’CO’,包含大写字母的字符串。这时候,把原来的变量grep“加上casefold
便通过测试了。
|
|
Bite 26 字典推导式 -> 酷炫(Dictionary comprehensions are awesome)
字典推导式与列表推导式相似,只是构建的是字典,而不是列表。它是方便快速地操作键和值的方法。通常只有一行代码,或者在检查 PEP8 规范之后是两行代码。
知识点:
输入:原始字典,排除的键值
计算:复制字典,匹配排除的键值,并从字典从删除
输出:排除对应键之后的字典
collection
的nametuple
- 列表推导式
代码块
|
|
|
|
查看了例子
|
|
思路:若 k 不在给定的 set 里,便添加入新的字典之后。第一次拼写少了in
,之后通关。
|
|
To do
改成每题一小篇,以固定标题的形式,组织成专栏,写给六个月前的自己,帮助 0 基础,甚至是负基础的小白入门同学朋友。
重新调整笔记结构,让别人更易读,而不是偏私人的呢喃。
changelog
2019.03.02 init pybite108
2019.03.05 update pybite109
2019.03.08 update pybite110
2019.03.12 update pybite8
2019.03.16 update pybite15
2019.03.19 update pybite16
2019.03.20 update pybite19
2019.03.22 update pybite21
2019.03.23 update pybite26
2019.03.24 update pybite1
2019.03.27 update pybite5