数据科学作业1

人生苦短,我用python

Posted by ASI on October 17, 2018

第一节课课后习题

前言

啊嘶前几天刚肝完了苏大微软俱乐部的Hi Hackathon。和南音一起在Touhou Player AI的基础上进行了修改,修改之后的BAKA AI大概勉强能打到1面关底的样子。 这次的作业是python基础,啊嘶写程序基本都是用java,python很多黑科技都没有用过。因此虽然作业简单还是有很多东西可以学到的。 最后介绍一下工作环境吧:

  • Python版本: 2.7.15, 3.7.0
  • IDE: Pycharm, VScode
  • VCS工具: git bash (git bash执行python命令会卡死,所以交互模式得使用cmd)
  • Markdown编辑器: dillinger.io

作业

作业题目不能直接复制,于是从html文件上扣下来了……

1、浏览网站github.com,借助搜索引擎,完成如下操作:
  • 通过搜索引擎了解“源码管理”和git;
  • 在本地计算机上安装git;
  • 在github.com上注册个人账号,并建立个人代码仓库;
  • 在github.com上创建个人博客,并将第3题中的短文发布到个人博客(提示:运用搜索引擎,查找能够在github.com上应用的开源代码以及代码的部署方法)。

大概是最有难度的一道题目了。前三条以前在UCB学CS61b的时候就做好了,重点说一下第四条。 我的博客是直接从BY的github.io fork下来的, 然后再删除_post文件夹中所有的文档,把网页背景从文艺图片换成了东方Project剧毒少女系列的美图QWQ。修改了about.html,404.html,tags.html文档的内容,把BY的信息换成自己的,有一股抄作业的负罪感…… 博客是使用Jekyll模板搭建的,使用说明点击这里CO(↑)CO(↓)

2、直角三角形的斜边长度为50,一条直角边的长度是30,编写程序,计算另外一条直角边的长度。

Markdown利用MathJax引擎添加数学公式

介绍一个很厉害的 算法:让所有的计算都在人脑中进行,然后直接输出结果40(雾 因为强大的计算功能,python交互模式可以当计算器使用

 >>> import math
 >>> math.sqrt(50 * 50 - 30 * 30)
 40.0

注意sqrt函数需要导入math包之后才可以使用, 接下来都默认已经导入math包了

3、在交互模式中,完成以下操作:
  • 创建如下变量和对象的引用关系:a = 2.5, b = 7, c = 6;
  • 分别计算:(1)a除以b的商;(2)b除以c的余数;(3)c除以a的商;(4)b的3次方。

>>> a, b, c = 2.5, 7, 6
>>> a / b
0.35714285714285715
>>> b % c
1
>>> c / a
2.4
>>> math.pow(b, 3)
343.0
4、在Python中有专门支持分数运算的标准库fractions,利用它完成如下计算:
  • 3 + 3/5
  • 3/7的平方
  • 1/8 * -2/9 + 7/8
  • 分别得到11/13的分子和分母
  • 将1.25转化为分数

先看一遍fractions文档,掌握其中几个关键函数的用法:

  • 创建对象: Fraction(分子, 分母); Fraction(‘分式或者小数’)
  • Fraction对象支持四则运算
    >>> from fractions import Fraction
    >>> 3 + Fraction(3, 5)
    Fraction(18, 5)
    >>> Fraction(3, 7) * Fraction(3, 7)
    Fraction(9, 49)
    >>> Fraction(1, 8) * Fraction(-2, 9) + Fraction(7, 8)
    Fraction(61, 72)
    >>> x = Fraction(11, 13)
    >>> x.numerator, x.denominator
    (11, 13)
    >>> Fraction('1.25')
    Fraction(5, 4)
    
5、写出字符串“0123456789”经下述切片操作之后的返回值:
  • d[:: 2]
  • d[1: 4]
  • d[1:: 2]
  • d[:: -1]
  • d[-2:: -2]

>>> d[::2]
'02468'
>>> d[1:4]
'123'
>>> d[1::2]
'13579'
>>> d[::-1]
'9876543210'
>>> d[-2::-2]
'86420'
6、已知字符串“You need Python”,在交互模式中分别实现如下效果:
  • 获得字符串的第一个和最后一个字符;
  • 获得字符串的字符总数;
  • 将字符串中的“You”替换为“I”;
  • 将字符串中每个单词的首字母都变成大写;
  • 以空格为分隔符,分割此字符串,然后用“@”为连接符,将其连接起来;
  • 将上一步中所得字符串完全反转。

>>> s = "You need Python"
>>> s[0], s[-1]
('Y', 'n')
>>> len(s)
15
>>> 'You need Python'.replace('You', 'I')
'I need Python'
>>> import string
>>> string.capwords('You need Python')
'You Need Python'
>>> s = s.replace(' ','@')
>>> s
'You@need@Python'
>>> s[::-1]
'nohtyP@deen@uoY'
  • replace函数: str.replace(查找值,替换值,最多替换次数)
  • capwords函数:string.capwords(str),将str中所有单词首字母变成大写
7、创建一个列表,以城市的电话区号为元素,比如北京的区号是010,上海的区号是021,苏州的区号是0512,杭州的区号是0571。

TODO:想写一个爬虫把区号爬下来,先鸽了

8、对于列表lst = [1, 2, 3, 4, 5],将其中的偶数剔除,得到只有奇数的列表。

>>> lst = [1, 2, 3, 4, 5]
>>> odd = [x for x in lst if x % 2 == 1]
>>> odd
[1, 3, 5]

列表生成式: [x for x in … (if …)]

9、已知列表[[1, 2], “python”, 234, 3.14],在交互模式中分别实现如下效果:
  • 得到数字1;
  • 得到字母“n”;
  • 得到由234和3.14组成的列表;
  • 得到最后一个元素;

>>> list = [[1, 2], "python", 234, 3.14]
>>> list[0][0]
1
>>> list[1][-1]
'n'
>>> [list[2], list[3]]
[234, 3.14]
>>> list[-1]
3.14

list套list实现二维数组还是可以接受的,更高维的推荐使用numpy库

10、比较内置函数sorted和列表的方法sort的异同。

参考自sort 与 sorted 区别

  • sorted()是一个nondestructive-method, 而sort()是destructive-method.
  • sorted()采用的算法是Timsort
11、请注意观察如下操作,并亲自在交互模式中操作验证:
>>> a = 256
>>> b = 256
>>> a is b
True
>>> c = 257
>>> d = 257
>>> c is d
False

>>> lst1 = ["python", "java"]
>>> lst2 = ["python", "java"]
>>> lst1 is lst2
False
>>> lst3 = lst1
>>> lst1 is lst3
True

Python在变量赋值上和java一样是传递引用,即如果等号右边是一个object,那么左边保存的是指向这个对象的地址。is 运算符比较的是两边变量的地址是否相同。注意到python对变量数值属于[-5, 256]的整数进行了优化,这些变量将指向同一地址。因此小于等于256的a,b;由等号直接赋值的lst3,lst1都指向了同一个地址。 另外,对于对象的比较,python的is相当于java的==,python的==相当于java的.isEqual()

想在python中定义==只需要override对象的__eq__函数即可

12、回文是很有意思的文字游戏。请通过网络搜集回文词汇或句子,然后用Python检验是否为回文。

>>> def hw(s):
...     return s == s[::-1]
...
>>> hw("上海自来水来自海上")
True
>>> hw("Touhou Project")
False

吐槽一句,python的切片真是好用啊

13、在交互模式中创建一个字典,要求“键”是自己的QQ好友昵称,“值”是相应的QQ号。

>>> friends = {"来姐":"217*******", "来姐复制人":"774******"}
>>> friends
{'来姐': '217*******', '来姐复制人': '774******'}

友情提醒,请珍惜自己的QQ号,请勿在公共场合膜🐸

14、假设有字典{“lang”: “python”, “number”: 100},在交互模式中进行操作,实现如下效果:
  • 得到键“lang”的值;
  • 得到值“100”的键;
  • 得到字典中键值对的数量;
  • 为字典增加一个键值对;
  • 删除字典中的一个键值对;
  • 修改一个键值对的值;
  • 判断“city”是否是字典中的键。

>>> dic = {"lang": "python", "number": 100}
>>> dic["lang"]
'python'
>>> [key for key in dic.keys() if dic[key] == 100]
['number']
>>> len(dic)
2
>>> dic["code"] = "UTF-8"
>>> dic.pop("code")
'UTF-8'
>>> dic["number"] = 99
>>> "city" in dic.values()
False
15、通过help函数和网络,研习内置函数input和字符串的方法fromat的使用方式,并且实现如下操作:
  • 通过input函数获取键盘输入的内容,并显示键盘输入内容的类型
  • 用字符串的format方法,实现格式化输出

>>> def doit():
...     x = input()
...     print(type(x))
...     print("you just typed {0}".format(x))
...
>>> doit()
Komeiji Koishi
<class 'str'>
you just typed Komeiji Koishi