慕课网Python入门练习题---

Python中数据类型
整数

Python可以处理任意大小的整数,当然包括负整数,在Python程序中,整数的表示方法和数学上的写法一模一样,例如:1,100,-8080,0,等等。
计算机由于使用二进制,所以,有时候用十六进制表示整数比较方便,十六进制用0x前缀和0-9,a-f表示,例如:0xff00,0xa5b4c3d2,等等。

浮点数

浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的,比如,1.23x10^9和12.3x10^8是相等的。浮点数可以用数学写法,如1.23,3.14,-9.01,等等。但是对于很大或很小的浮点数,就必须用科学计数法表示,把10用e替代,1.23x10^9就是1.23e9,或者12.3e8,0.000012可以写成1.2e-5,等等。
整数和浮点数在计算机内部存储的方式是不同的,整数运算永远是精确的(除法难道也是精确的?是的!),而浮点数运算则可能会有四舍五入的误差。

字符串

字符串是以”或”“括起来的任意文本,比如’abc’,”xyz”等等。请注意,”或”“本身只是一种表示方式,不是字符串的一部分,因此,字符串’abc’只有a,b,c这3个字符。

布尔值

布尔值和布尔代数的表示完全一致,一个布尔值只有True、False两种值,要么是True,要么是False,在Python中,可以直接用True、False表示布尔值(请注意大小写),也可以通过布尔运算计算出来。
布尔值可以用and、or和not运算。
and运算是与运算,只有所有都为 True,and运算结果才是 True。
or运算是或运算,只要其中有一个为 True,or 运算结果就是 True。
not运算是非运算,它是一个单目运算符,把 True 变成 False,False 变成 True。

空值

空值是Python里一个特殊的值,用None表示。None不能理解为0,因为0是有意义的,而None是一个特殊的空值。
此外,Python还提供了列表、字典等多种数据类型,还允许创建自定义数据类型,我们后面会继续讲到

任务

试一试,在右边编辑器中,完成以下任务:

  1. 计算十进制整数 45678 和十六进制整数 0x12fd2 之和。

  2. 请用字符串表示出Learn Python in imooc。

  3. 请计算以下表达式的布尔值(注意==表示判断是否相等):

    100 < 99

    0xff == 255

注意:使用print命令

print(45678+0x12fd2)
print("Learn Python in imooc")
print(100<99)
print(0xff == 255)
------------------------------------------
123456
Learn Python in imooc
False
True

Print语句

任务
请用两种方式打印出 hello, python.

print("hello,python.")
print("hello,"+"python.")
print("hello,","python.")
-----------------------------------------
hello,python.
hello,python.
hello, python.

变量

在计算机程序中,变量不仅可以是数字,还可以是任意数据类型。
在Python程序中,变量是用一个变量名表示,变量名必须是大小写英文、数字和下划线(_)的组合,且不能用数字开头

任务
等差数列可以定义为每一项与它的前一项的差等于一个常数,可以用变量 x1 表示等差数列的第一项,用 d 表示公差,请计算数列

1 4 7 10 13 16 19 …

前 100 项的和。

x1 = 1
d = 3
s = 0
for i in range(1,101):
    s += x1
    x1 += d

print(s)

请将下面两行内容用Python的字符串表示并打印出来:
Python was started in 1989 by “Guido”.
Python is free and easy to learn.

s = 'Python was started in 1989 by \"Guido\".\nPython is free and easy to learn.'
print(s)

列表

Python内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。
比如,列出班里所有同学的名字,就可以用一个list表示:

[‘Michael’, ‘Bob’, ‘Tracy’]
[‘Michael’, ‘Bob’, ‘Tracy’]
list是数学意义上的有序集合,也就是说,list中的元素是按照顺序排列的。
构造list非常简单,按照上面的代码,直接用 [ ] 把list的所有元素都括起来,就是一个list对象。通常,我们会把list赋值给一个变量,这样,就可以通过变量来引用list:

classmates = [‘Michael’, ‘Bob’, ‘Tracy’]
classmates # 打印classmates变量的内容
[‘Michael’, ‘Bob’, ‘Tracy’]
由于Python是动态语言,所以list中包含的元素并不要求都必须是同一种数据类型,我们完全可以在list中包含各种数据:

L = [‘Michael’, 100, True]
一个元素也没有的list,就是空list:

empty_list = []

任务
假设班里有3名同学:Adam,Lisa和Bart,他们的成绩分别是 95.5,85 和 59,请按照 名字, 分数, 名字, 分数… 的顺序按照分数从高到低用一个list表示,然后打印出来。

s = ['Adam',95.5,'Lisa',85,'Bart',59]
print(s)

任务
假设新来一名学生Paul,Paul 同学的成绩比Bart好,但是比Lisa差,他应该排到第三名的位置,请用代码实现。

l = ['Adam','Lisa','Bart']
l.insert(2,'paul')
print(l)
----------------------------------
['Adam', 'Lisa', 'paul', 'Bart']

注意右边编辑器代码中 list 如下:

L = [‘Adam’, ‘Lisa’, ‘Paul’, ‘Bart’]

Paul的索引是2,Bart的索引是3,如果我们要把Paul和Bart都删掉,请解释下面的代码为什么不能正确运行:

L.pop(2)
L.pop(3)

怎样调整代码可以把Paul和Bart都正确删除掉?

L = ['Adam', 'Lisa', 'Paul', 'Bart']
L.pop()
L.pop()
print(L)

任务
班里的同学按照分数排名是这样的:

L = [‘Adam’, ‘Lisa’, ‘Bart’]

但是,在一次考试后,Bart同学意外取得第一,而Adam同学考了倒数第一。

请通过对list的索引赋值,生成新的排名。

L = ['Adam', 'Lisa', 'Bart']
L[0]='Bart'
L[-1]='Adam'
print(L)

Tuple

tuple是另一种有序的列表,中文翻译为“ 元组 ”。tuple 和 list 非常类似,但是,tuple一旦创建完毕,就不能修改了。

Python之“可变”的tuple

前面我们看到了tuple一旦创建就不能修改。现在,我们来看一个“可变”的tuple:

t = (‘a’, ‘b’, [‘A’, ‘B’])
注意到 t 有 3 个元素:’a’,’b’和一个list:[‘A’, ‘B’]。list作为一个整体是tuple的第3个元素。list对象可以通过 t[2] 拿到:

L = t[2]
然后,我们把list的两个元素改一改:

L[0] = ‘X’
L[1] = ‘Y’
再看看tuple的内容:

print t
(‘a’, ‘b’, [‘X’, ‘Y’])
不是说tuple一旦定义后就不可变了吗?怎么现在又变了?
别急,我们先看看定义的时候tuple包含的3个元素:
当我们把list的元素’A’和’B’修改为’X’和’Y’后,tuple变为:
表面上看,tuple的元素确实变了,但其实变的不是 tuple 的元素,而是list的元素。
tuple一开始指向的list并没有改成别的list,所以,tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。即指向’a’,就不能改成指向’b’,指向一个list,就不能改成指向其他对象,但指向的这个list本身是可变的!
理解了“指向不变”后,要创建一个内容也不变的tuple怎么做?那就必须保证tuple的每一个元素本身也不能变。

dict

我们把名字称为key,对应的成绩称为value,dict就是通过 key 来查找 value。
花括号 {} 表示这是一个dict,然后按照 key: value, 写出来即可。最后一个 key: value 的逗号可以省略。
由于dict也是集合,len() 函数可以计算任意集合的大小:

len(d)
3
注意: 一个 key-value 算一个,因此,dict大小为3。

任务
新来的Paul同学成绩是 75 分,请编写一个dict,把Paul同学的成绩也加进去。

d = {
‘Adam’: 95,
‘Lisa’: 85,
‘Bart’: 59
}

d = {

    'Adam': 95,
    'Lisa': 85,
    'Bart': 59,
    'Paul': 75
}

dict的第一个特点是查找速度快,无论dict有10个元素还是10万个元素,查找速度都一样。而list的查找速度随着元素增加而逐渐下降。
dict的第二个特点就是存储的key-value序对是没有顺序的!
dict的第三个特点是作为 key 的元素必须不可变


set

dict的作用是建立一组 key 和一组 value 的映射关系,dict的key是不能重复的。
有的时候,我们只想要 dict 的 key,不关心 key 对应的 value,目的就是保证这个集合的元素不会重复,这时,set就派上用场了。
set 持有一系列元素,这一点和 list 很像,但是set的元素没有重复,而且是无序的,这点和 dict 的 key很像。
创建 set 的方式是调用 set() 并传入一个 list,list的元素将作为set的元素:

s = set([‘A’, ‘B’, ‘C’])
可以查看 set 的内容:

print s
set([‘A’, ‘C’, ‘B’])
请注意,上述打印的形式类似 list, 但它不是 list,仔细看还可以发现,打印的顺序和原始 list 的顺序有可能是不同的,因为set内部存储的元素是无序的。

因为set不能包含重复的元素,所以,当我们传入包含重复元素的 list 会怎么样呢?

s = set([‘A’, ‘B’, ‘C’, ‘C’])
print s
set([‘A’, ‘C’, ‘B’])
len(s)
3
结果显示,set会自动去掉重复的元素,原来的list有4个元素,但set只有3个元素。

任务
请用set表示班里的4位同学:

Adam, Lisa, Bart, Paul

s = set(['Adam','Lisa','Bart','Paul'])

由于set存储的是无序集合,所以我们没法通过索引来访问。

访问 set中的某个元素实际上就是判断一个元素是否在set中。

例如,存储了班里同学名字的set:

s = set([‘Adam’, ‘Lisa’, ‘Bart’, ‘Paul’])
我们可以用 in 操作符判断:

Bart是该班的同学吗?

‘Bart’ in s
True
Bill是该班的同学吗?

‘Bill’ in s
False
bart是该班的同学吗?

‘bart’ in s
False
看来大小写很重要,’Bart’ 和 ‘bart’被认为是两个不同的元素。

任务
由于上述set不能识别小写的名字,请改进set,使得 ‘adam’ 和 ‘bart’都能返回True。

s = set([name.lower() for name in ['Adam', 'Lisa', 'Bart', 'Paul']])

set的这些特点,可以应用在哪些地方呢?

星期一到星期日可以用字符串’MON’, ‘TUE’, … ‘SUN’表示。
假设我们让用户输入星期一至星期日的某天,如何判断用户的输入是否是一个有效的星期呢?
可以用 if 语句判断,但这样做非常繁琐:
x = ‘???’ # 用户输入的字符串
if x!= ‘MON’ and x!= ‘TUE’ and x!= ‘WED’ … and x!= ‘SUN’:
print ‘input error’
else:
print ‘input ok’
注意:if 语句中的…表示没有列出的其它星期名称,测试时,请输入完整。
如果事先创建好一个set,包含’MON’ ~ ‘SUN’:
weekdays = set([‘MON’, ‘TUE’, ‘WED’, ‘THU’, ‘FRI’, ‘SAT’, ‘SUN’])
再判断输入是否有效,只需要判断该字符串是否在set中:
x = ‘???’ # 用户输入的字符串
if x in weekdays:
print ‘input ok’
else:
print ‘input error’
这样一来,代码就简单多了。

任务
请用 for 循环遍历如下的set,打印出 name: score 来。

s = set([(‘Adam’, 95), (‘Lisa’, 85), (‘Bart’, 59)])

s = set([('Adam', 95), ('Lisa', 85), ('Bart', 59)])
for x in s:
    print(x[0],':',x[1])

更新set

由于set存储的是一组不重复的无序元素,因此,更新set主要做两件事:
一是把新的元素添加到set中,二是把已有元素从set中删除。

任务
针对下面的set,给定一个list,对list中的每一个元素,如果在set中,就将其删除,如果不在set中,就添加进去。

s = set([‘Adam’, ‘Lisa’, ‘Paul’])
L = [‘Adam’, ‘Lisa’, ‘Bart’, ‘Paul’]

s = set(['Adam', 'Lisa', 'Paul'])
L = ['Adam', 'Lisa', 'Bart', 'Paul']

for i in L:
    if i in s:
        s.remove(i)
    else:
        s.add(i)
print(s)

函数

任务
sum()函数接受一个list作为参数,并返回list所有元素之和。请计算 1*1 + 2*2 + 3*3 + … + 100*100。

def sum(list):
    s = 0
    for i in list:
        s += i
    return s
l = []
for i in range(1,101):
    l.append(i*i)
print(l)
print(sum(l))

索引迭代

Python中,迭代永远是取出元素本身,而非元素的索引。

对于有序集合,元素确实是有索引的。有的时候,我们确实想在 for 循环中拿到索引,怎么办?

方法是使用 enumerate() 函数:

L = [‘Adam’, ‘Lisa’, ‘Bart’, ‘Paul’]
for index, name in enumerate(L):
… print index, ‘-‘, name

0 - Adam
1 - Lisa
2 - Bart
3 - Paul
使用 enumerate() 函数,我们可以在for循环中同时绑定索引index和元素name。但是,这不是 enumerate() 的特殊语法。实际上,enumerate() 函数把:

[‘Adam’, ‘Lisa’, ‘Bart’, ‘Paul’]
变成了类似:

[(0, ‘Adam’), (1, ‘Lisa’), (2, ‘Bart’), (3, ‘Paul’)]
因此,迭代的每一个元素实际上是一个tuple:

for t in enumerate(L):
index = t[0]
name = t[1]
print index, ‘-‘, name
如果我们知道每个tuple元素都包含两个元素,for循环又可以进一步简写为:

for index, name in enumerate(L):
print index, ‘-‘, name
这样不但代码更简单,而且还少了两条赋值语句。

可见,索引迭代也不是真的按索引访问,而是由 enumerate() 函数自动把每个元素变成 (index, element) 这样的tuple,再迭代,就同时获得了索引和元素本身。


生成列表

但是循环太繁琐,而列表生成式则可以用一行语句代替循环生成上面的list:

[x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
这种写法就是Python特有的列表生成式。利用列表生成式,可以以非常简洁的代码生成 list。

写列表生成式时,把要生成的元素 x * x 放到前面,后面跟 for 循环,就可以把list创建出来,十分有用,多写几次,很快就可以熟悉这种语法。

猜你喜欢

转载自blog.csdn.net/q1694222672/article/details/81042036