python编程学习——第二周

第二周

python学习笔记和做的一些习题 (python编程快速上手——让繁琐工作自动化)

第四章节 列表

列表数据类型

“列表”是一个值,它包含多个字构成的序列。
列表中的值成为“表项”。表项用逗号分隔:

spam=[1,'cat',3.1415926,True,['abc','xiaoming']]

spam变量是一个列表值。列表中中含有多个值。

可以用下标取得列表中的单个值:
在这里插入图片描述
其中要注意的是:下标只能是整数,不能是浮点值;
列表也可以包含其他列表值,通过多重下标来访问:
在这里插入图片描述
有正整数下标,当然也有负整数下标,整数值-1指的是列表中的最后一个下标,-2是列表中倒数第二个下标,以此类推:
在这里插入图片描述
既然可以下标取得列表中的一个值,也可以利用切片取得取得多个值:
在这里插入图片描述
在切片[1:3]中,1是切片开始处的下标,3整数是切片结束出的下标。
有时候,我们可省略切片中冒号两边的一个或两个下标。省略第一个下标,则切片默认从下标为0处取值;省略第二个下标,测切片默认为取值到列表的结束下标。即,spam[:]是可以取得整个列表。
在这里插入图片描述
取得整个列表后,我们如果想要知道列表的长度,就可以用len()函数:
在这里插入图片描述
那我们想要改变列表中某个值,就可以结合我们之前所学的先定位至要修改的列表中的值,接着用赋值语句进行赋值,比如:我们要将spam列表中的3.1415926改为‘pi’:
在这里插入图片描述
列表的连接和复制:两个列表的连接+,就像两个字符串合并为一个字符串一样,同样*操作符可以用于一个列表和一个整数,来实现列表的复制:
在这里插入图片描述
如果我们要删除列表中的值,可以用del语句,作用就像是“取消赋值”:
在这里插入图片描述

使用列表

使用列表的好处:将数据放在一个结构中,程序能够更好的处理数据,比方在一些重复的变量中方便。

列表用于循环:
我们可以运用循环,迭代列表的每一个下标:

spam = [1,'cat',3.1415926,True,['abc','xiaoming']]
for i in range(0,5):
    print(spam[i])

在这里插入图片描述

in 和 not in 操作符:
利用in 和 not in 操作符,可以确定一个值是否在列表中。
在这里插入图片描述
多重赋值技巧:
这是一种较为快捷的方式,可以让你在一行代码中,用列表中的值为多个变量赋值。其中要注意的是变量的数目和列表的长度必须严格相等:

spam = [1,'cat',3.1415926,True,['abc','xiaoming']]
a,b,c,d,e = spam  ##相当于a=spam[0];b=spam[1]...以此类推

增强的赋值操作:
增强的赋值操作符:

增强的赋值语句等价的赋值语句
spam += 1spam = spam+1
spam -= 1spam = spam-1
spam *= 1spam = spam*1
spam /= 1spam = spam/1
spam %= 1spam = spam%1
方法

每种数据类型都有它自己的一组方法。
用index()方法在列表中查找值:用这个方法,可以传入一个值,如果该值存在于列表之中,就返回它的下标。如果列表中存在重复的值,就返回它第一次出现的下标:
在这里插入图片描述
用append()和insert()方法在列表中添加值:
append()方法调用将参数添加到列表末尾;insert()方法可以在列表任意下标处插入一个值。insert()方法的第一个参数是新值的下标,第二个参数是要插入的新值。
在这里插入图片描述
用remove()方法从列表中删除值:
在这里插入图片描述
用sort()方法对列表中的值进行排序:
数值的列表和字符串的列表,可以用sort()方法进行排序:不能对既有数字又有字符串的列表排序;sort()方法对字符串排序时使用“ASCII字符顺序”。
在这里插入图片描述

类似列表的类型:字符串和元组

对列表的许多操作,也可以用于字符串:
在这里插入图片描述
可变和不变数据类型:
列表是“可变的”数据类型,他的值可以添加、删除或改变。
字符串是“不可变”数据类型,他不能被更改。若是想改变一个字符串,我们只能用切片和连接,构造一个新的字符串。
元组数据类型:
元组输入时用圆括号,而不是用方括号;元组像字符串一样,是不可变的。除了这两个方面,元组的数据类型几乎与列表一样。
用list()和tupie()函数来将返回传递给他们的值的列表和元组版本

引用

传递引用:当函数被调用时,参数的值被复制给变元。对于列表,这意味着变元得到的是引用的拷贝

copy模块的copy()和deepcopy()函数:
copy.copy():可以用来复制列表或字典这样的可变值,而不只是复制引用;如果复制的列表中包含了列表,那就使用deepcopy()函数来代替,deepcopy()函数可以同时复制他们的内部列表。

第四章习题

1.什么是[]?
[]是一个空列表,不包含任何值。

2.如何将’hello’赋给列表的第三个值,而列表保存在名为 spam 的变量?(假定变量包含[2, 4, 6, 8, 10])。
spam[2] = ‘hello’

对接下来的 3 个问题,假定 spam 包含列表[‘a’, ‘b’, ‘c’, ‘d’]。
3.spam[int(‘3’ * 2) / 11]求值为多少?
d
4.spam[-1]求值为多少?
d
5.spam[:2]求值为多少?
[‘a’, ‘b’, ‘c’]

对接下来的 3 个问题。假定 bacon 包含列表[3.14, ‘cat’, 11, ‘cat’, True]。
6.bacon.index(‘cat’)求值为多少?
1
7.bacon.append(99)让 bacon 中的列表值变成什么样?
[3.14, ‘cat’, 11, ‘cat’, True,99]
8.bacon.remove(‘cat’)让 bacon 中的列表时变成什么样?
[3.14,11, ‘cat’, True]

9.列表连接和复制的操作符是什么?
l连接符:+;复制:*

10.append()和 insert()列表方法之间的区别是什么?
append()方法调用将参数添加到列表末尾;insert()方法可以在列表任意下标处插入一个值。

11.从列表中删除值有哪两种方法?
del和remove()方法

12.请说出列表值和字符串的几点相似之处。
字符串和列表实际上很相似,只要你认为字符串是单个文本字符的列表。对列表的许多操作,也可以作用于字符串:按下标取值、切片、用于 for 循环、用于 len(),以及用于 in 和 not in 操作符。

13.列表和元组之间的区别是什么?
元组输入时用圆括号,而不是用方括号;元组像字符串一样,是不可变的,而列表是可变数据类型。

14.如果元组中只有一个整数值 42,如何输入该元组?
spam=(42,),末尾的逗号是必须的,否则,Python 将认为,你只是在一个普通括号内输入了一个值。逗号告诉python,这是一个元组。

15.如何从列表值得到元组形式?如何从元组值得到列表形式?
用list()和tupie()函数来将返回传递给他们的值的列表和元组版本。

16.“包含”列表的变量,实际上并未真地直接包含列表。它们包含的是什么?
包含对列表值的引用。

17.copy.copy()和copy.deepcopy()之间的区别是什么?
copy.copy():可以用来复制列表或字典这样的可变值,而不只是复制引用;如果复制的列表中包含了列表,那就使用deepcopy()函数来代替,deepcopy()函数可以同时复制他们的内部列表。

第四章节实践

1、逗号代码
假定有下面这样的列表:
spam = [‘apples’, ‘bananas’, ‘tofu’, ‘cats’]
编写一个函数,它以一个列表值作为参数,返回一个字符串。该字符串包含所有表项,表项之间以逗号和空格分隔,并在最后一个表项之前插入 and。例如,将前面的 spam 列表传递给函数,将返回’apples, bananas, tofu, and cats’。但你的函数应该能够处理传递给它的任何列表。

def comma(lb):
    n = int(len(lb))
    for i in range(n-1):
       print(lb[i],end=',')
    print('and '+ str(lb[n-1]))

spam = ['apples', 'bananas', 'tofu', 'cats']
comma(spam)          

2、假定有一个列表的列表,内层列表的每个值都是包含一个字符的字符串,像这样:

grid = [['.', '.', '.', '.', '.', '.'],
 ['.', 'O', 'O', '.', '.', '.'], 
 ['O', 'O', 'O', 'O', '.', '.'],
 ['O', 'O', 'O', 'O', 'O', '.'], 
 ['.', 'O', 'O', 'O', 'O', 'O'], 
 ['O', 'O', 'O', 'O', 'O', '.'], 
 ['O', 'O', 'O', 'O', '.', '.'], 
 ['.', 'O', 'O', '.', '.', '.'], 
 ['.', '.', '.', '.', '.', '.']] 

你可以认为 grid[x][y]是一幅“图”在 x、y 坐标处的字符,该图由文本字符组
成。原点(0, 0)在左上角,向右 x 坐标增加,向下 y 坐标增加。
复制前面的网格值,编写代码用它打印出图像。

..OO.OO..
.OOOOOOO.
.OOOOOOO.
..OOOOO..
...OOO...
....O....

提示:
你需要使用循环嵌套循环,打印出 grid[0][0],然后 grid[1][0],然后 grid[2][0],以此类推,直到 grid[8][0]。这就完成第一行,所以接下来打印换行。然后程序将打印出grid[0][1],然后 grid[1][1],然后 grid[2][1],以此类推。程序最后将打印出 grid[8][5]。而且,如果你不希望在每次 print()调用后都自动打印换行,记得向 print()传递end 关键字参数。

def picture(pic):
   for y in range(len(pic[0])):
       for x in range(len(pic)):
           print(pic[x][y],end='')
       print()

grid = [['.', '.', '.', '.', '.', '.'],
 ['.', 'O', 'O', '.', '.', '.'], 
 ['O', 'O', 'O', 'O', '.', '.'],
 ['O', 'O', 'O', 'O', 'O', '.'], 
 ['.', 'O', 'O', 'O', 'O', 'O'], 
 ['O', 'O', 'O', 'O', 'O', '.'], 
 ['O', 'O', 'O', 'O', '.', '.'], 
 ['.', 'O', 'O', '.', '.', '.'], 
 ['.', '.', '.', '.', '.', '.']]    

picture(grid)      

在这里插入图片描述

第五章节 字典和结构化数据

字典数据类型

“字典”是许多值的集合,字典的索引可以使用许多不同数据类型,字典的索引被称为“键”,键及其关联的值称为“键值”对。`
在这里插入图片描述
在变量名为student字典中,这个字典的健是’gender’、‘age’、‘number’,其对应的值分别为:‘girl’、22、34。可以通过对应的健访问这些值。

字典与列表:
列表中的值是有序的;而字典中,键值对是无序的,由于字典是不排序的所以 不能像列表进行切片。
在这里插入图片描述
keys()、values()和items()方法:字典方法,它们将返回类似列表的值,分别对应于字典的键,值和键值对。
在这里插入图片描述
在items()方法返回的值中,包含的是健和值的元组。
如果希望通过这些方法的到一个真正的列表,就把类似列表的返回值传递给list函数。

检查字典中是否存在键或值:可以用in、not in操作符。

get()方法:我们可以通过该方法验证字典中是否存在这个值。
get()函数中含有两个参数,第一个参数是字典中要查找的键;如果指定键的值不存在时,返回该默认值。
在这里插入图片描述
setdefault()方法:为字典中某个键设置一个默认值,当该键没有任何值时使用它,这样可以确保一个键的存在。
setdefault()中有两个参数,第一个参数,是要检查的键;第二个参数,是如果该键不存在时要设置的值:
在这里插入图片描述

第五章节习题

1.空字典的代码是怎样的?
dirc = {}

2.一个字典包含键’fow’和值 42,看起来是怎样的?
dirt = {‘fow’:42}

3.字典和列表的主要区别是什么?
字典不像列表只包含一系列有序的值,字典中的键值对是无序的。字典不是只能使用整数下标,而是可以用各种数据类型作为键:整型、浮点型、字符串或元组。

4.如果 spam 是{‘bar’: 100},你试图访问 spam[‘foo’],会发生什么?
会出错

5.如果一个字典保存在 spam 中,表达式’cat’ in spam 和’cat’ in spam.keys()之间的区别是什么?
前者相当于后者的简写版本。

6.如果一个字典保存在变量中,表达式’cat’ in spam 和’cat’ in spam.values()之间的区别是什么?
cat’ in spam 检查字典中是不是有一个’cat’ 键,而’cat’ in spam.values() 检查是否有一个值’cat’ 对应于 spam 中的某个键。

7.下面代码的简洁写法是什么?

if 'color' not in spam:
 spam['color'] = 'black'

spam.setdefault(‘color’,‘black’)

8.什么模块和函数可以用于“漂亮打印”字典值?
pprint模块、pprint()和pformat()函数

第五章节实践项目

1、好玩游戏的物品清单
你在创建一个好玩的视频游戏。用于对玩家物品清单建模的数据结构是一个字典。其中键是字符串,描述清单中的物品,值是一个整型值,说明玩家有多少该物品。例如,字典值{‘rope’: 1, ‘torch’: 6, ‘gold coin’: 42, ‘dagger’: 1, ‘arrow’: 12}意味着玩家有 1 条绳索、6 个火把、42 枚金币等。写一个名为 displayInventory()的函数,它接受任何可能的物品清单,并显示如下:

Inventory:
12 arrow
42 gold coin
1 rope
6 torch
1 dagger
Total number of items: 62

提示
你可以使用 for 循环,遍历字典中所有的键。

stuff = {'rope': 1, 'torch': 6, 'gold coin': 42, 'dagger': 1, 'arrow': 12}
def displayInventory(inventory):
    print("Inventory:")
    item_total = 0
    for k, v in inventory.items():
      print(str(v) + ' ' + k)
      item_total += v
    print("Total number of items: " + str(item_total))
displayInventory(stuff)

2 、列表到字典的函数,针对好玩游戏物品清单
假设征服一条龙的战利品表示为这样的字符串列表:

dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']

写一个名为 addToInventory(inventory, addedItems)的函数,其中 inventory 参数是一个字典,表示玩家的物品清单(像前面项目一样),addedItems 参数是一个列表,就像 dragonLoot。addToInventory()函数应该返回一个字典,表示更新过的物品清单。请注意,列表可以包含多个同样的项。你的代码看起来可能像这样:

def addToInventory(inventory, addedItems):
 # your code goes here
inv = {'gold coin': 42, 'rope': 1}
dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']
inv = addToInventory(inv, dragonLoot)
displayInventory(inv)

前面的程序(加上前一个项目中的 displayInventory()函数)将输出如下:

Inventory:
45 gold coin
1 rope
1 ruby
1 dagger
Total number of items: 48
def displayInventory(inventory):
    print("Inventory:")
    item_total = 0
    for k, v in inventory.items():
      print(str(v) + ' ' + k)
      item_total += v
    print("Total number of items: " + str(item_total))
def addToInventory(inventory, addedItems):
    for i in range(len(addedItems)):
        if addedItems[i] not in inventory:        
            inventory.setdefault(addedItems[i],1)
        else:
            inventory[addedItems[i]]+=1
    return inventory

inv = {'gold coin': 42, 'rope': 1}
dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']
inv = addToInventory(inv, dragonLoot)
displayInventory(inv)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值