Python入门day2 2020-03-19

《Python编程快速上手——让繁琐工作自动化》

>>接昨天

Chp4 列表

  1. in和not in确定一个值是否在列表中
>>>'howdy' in ['hello','howdy']
True
  1. 多重赋值
    变量数目和列表长度必须完全相等,否则出错。
spam=['pens','dog','red']
size,color,disposition=spam # 变量数目和列表长度必须完全相等
print(size,color,disposition)

输出结果:pens dog red

  1. 增强赋值
spam+=1 # 等价于spam=spam+1
spam-=1 # 等价于spam=spam-1
spam*=1 # 等价于spam=spam*1
spam/=1 # 等价于spam=spam/1
spam%=1 # 等价于spam=spam%1,取余

例如:

spam=['pens','dog','red']
print(spam)
spam*=2
print(spam)
spam+=['world'] # 这里spam为列表,所以后面+=列表,加方括号
print(spam)

spam1='Hello'
spam1+=' World!' # 这里spam1为字符串,后面+=字符串
print(spam1)

del spam[:-1]
print(spam) # ['world']
spam+='world' # 如果直接给列表+=字符串会出现奇怪的结果
print(spam)  # ['world', 'w', 'o', 'r', 'l', 'd']

输出结果:

['pens', 'dog', 'red']
['pens', 'dog', 'red', 'pens', 'dog', 'red']
['pens', 'dog', 'red', 'pens', 'dog', 'red', 'world']
Hello World!
['world']
['world', 'w', 'o', 'r', 'l', 'd']
  1. 方法:一种函数,用来调用一个值,类似于c中指针
    如果列表名为spam,则方法形如spam.index(‘hello’),其中.后的为方法中函数名,括号内为调用的值,如index()函数可以在列表中查询是否有'hello'这个值,并返回True或False的布尔值。对于列表中重复出现的元素,只查找或删除第一个。列表中值都是当场被改变,返回值为None。
  • index() 列表中查值
  • append() 将参数添加到列表末尾,insert(1,'cat') 将参数添加到列表指定位置之前
    只能在列表中使用
  • remove() 列表中删值
    之前的del spam[0]是指定删除列表中第几个值,而这里的spam.remove('cat')是指定删除列表中某一个已知内容是什么的值,如果该值不在列表中会出现错误
  • sort()列表中值排序,只针对纯数字或纯字符的列表
    • spam.sort() # 数字从小到大,字母大写在前,小写在后排序
    • spam.sort(reverse=True) # 逆序
    • spam.sort(key=str.lower) # 按照字母表排序,大小写混搭
  1. 列表缩进和随机值
  • 列表跨行缩进随意,只根据]来判断列表结束;
  • 也可以使用\续行符,在其下一行中缩进随意;
  • spam[random.radint(0,len(spam)-1)]是取了列表中随机值,注意先import random再使用该函数,因为列表是从0开始的,len(spam)-1就是列表中最后一个元素的下标。
  1. 字符串和元组
  • 列表中很多操作可以用于字符串中单个文本处理,如按下标取值、切片、for、len()、in和not in
  • 字符串不能直接通过赋值语句改变,而是使用切片和连接构造一个新的字符串。
spam1='Hello'
spam1 = spam1[:2]+'~~'+spam1[2:]
print(spam1)

输出结果:He~~llo


元组(tuple)是用圆括号圈起来的(形如eggs=('hello',1,2)),与字符串一样不能直接赋值而改变。如果元组中只有一个值,要在圆括号内,该值前添加逗号。
元组用于永远不会改变值的序列。

>>> a=('hello')
>>> type(a)
<class 'str'>
>>> a=('hello',)
>>> type(a)
<class 'tuple'>
  1. list()转化为列表类型,tuple()转化为元组类型。
  2. 引用
  • 列表名不保存列表中值,只是引用了内部存储该值的位置,类似于指针。所以当将列表spam赋值给cheese后,任何对cheese的操作,spam同样受到影响。

可变数据类型:列表、字典===========>保存的是引用
不可变数据类型:字符串、整型或元组===>保存的是数值本身


  • 因为列表保存的是引用,所以函数中变元可以当场改变列表值,这点要特别注意!!
def eggs(value):
    value.append('go!')

spam=[1,2]
eggs(spam)
print(eggs) # <function eggs at 0x000001E452C97940> 好像是直接给出了函数保存地址
print(spam)

输出结果:

<function eggs at 0x000001C03F617940>
[1, 2, 'go!']
  • 如果不希望传递引起列表的改变,需要使用copy()函数,其中cheese=copy.copy(spam)将spam列表值在内存中重新复制了一份,并将引用给了cheese,如果列表中还包含列表,需要使用copy.deepcopy()

实践项目

4.10.1 逗号代码

def do(value):
    # value是一个列表,对其进行处理,使其转为字符串返回
    value.insert(-1,'and')
    # str(value)
    output=''
    for i in range(len(value)-1):
        output+=value[i]+', '
    output+=value[-1]
    return output
    

spam=['apples','bananas','tofu','cats']
output=do(spam)
print(output)

输出结果:apples, bananas, tofu, and, cats

4.10.2 字符图网格

grid=[['.','.','.','.','.','.'],
     ['.','0','0','.','.','.'],
     ['0','0','0','0','0','.'],
     ['0','0','0','0','0','.'],
     ['.','0','0','0','0','0'],
     ['0','0','0','0','0','.'],
     ['0','0','0','0','0','.'],
     ['.','0','0','.','.','.'],
     ['.','.','.','.','.','.']]


for j in range(len(grid[0])):
    for i in range(len(grid)):
        print(grid[i][j],end='')
    print('')  # 这里注意多打印一个空白命令,实现换行功能

输出结果:

..00.00..
.0000000.
.0000000.
..00000..
..00000..
....0....

Chp5 字典

  • 字典用花括号表示,冒号前为,是索引的关键词;冒号后为,是索引得到的结果。
  • 访问时加方括号!!
myCat={'name':'Bob','color':'gray','year':'2020'}
print('My cat\'s name is '+myCat['name']+'. He\'s in '+myCat['color']+'.')
# 如果字符串里包含'则前面要加\,使其能正常。

输出结果:My cat's name is Bob. He's in gray.

  • 字典中表项不排序,故不能使用切片。
  • 字典通过访问,键可以是字符串、数字等,灵活性很大。注意键和值的对应关系,比如创建一个字典,用名字作为键,而生日作为值,这样可以通过名字来查找生日。
  • 访问不存在与字典的键会出错,所以要先用in判断是否存在于字典中。
  1. 访问字典的keys()键、values()值和items()键和值
  • 利用for循环输出字典里所有的键、值或键和值。
spam={'color':'red','age':42}
for i in spam.keys():
    print(i)
for i in spam.values():
    print(i)
for i in spam.items():
    print(i)

Results:

color
age
red
42
('color', 'red') # items输出的是包括键和值的元组
('age', 42)
  • 类似地,列表里也可以用for输出列表所有值。
sam=['cat','dog']
for i in sam:
    print(i)

输出结果:

cat
dog
  • for可以实现多重赋值,一条语句同时处理items中键和值
spam={'color':'red','age':42}
for i,j in spam.items():
    print('The key in spam is '+i+', and the value is '+str(j)+'.')

Results:

The key in spam is color, and the value is red.
The key in spam is age, and the value is 42.
  • list()将返回值变为列表
    因为keys()、values()和items()的返回值的数据类型分别为dict_keys()、dict_values()和dict_items(),为了方便使用可以直接使用list()转化为列表:
spam={'color':'red','age':42}
print(spam.keys())
print(list(spam.keys()))

Results:

dict_keys(['color', 'age']) # dict_keys数据类型
['color', 'age'] # 列表数据类型
  1. 利用in或not in检查键和值是否在字典中
  • 检查键是否在字典中,以下两种方式等效:
'color' in spam
'color' in spam.keys() # 注意有括号哦!
  • 检查值是否在字典中
'red' in spam.values()
  1. get()确保有返回值
    取得某键对应的值,如果不存在则返回备用值,如spam.get('cups',0)取得字典spam中键cups对应的值是多少,如果没有该键,则返回0,而不是报错。
  2. setdefault()确保有键,且有返回值
    取得某键的值,如果不存在该键,则为字典添加该键。
spam={'color':'red','age':42}
print(spam)
out=spam.setdefault('name','Bob')
print(spam)
print(out)
spam.setdefault('age','12')
print(spam)

Results:

{'color': 'red', 'age': 42}
{'color': 'red', 'age': 42, 'name': 'Bob'}  # 键name不存在,添加并返回该值Bob
Bob
{'color': 'red', 'age': 42, 'name': 'Bob'}
  1. pprint()漂亮打印函数,包括pprint.pprint()无返回值直接打印和pprint.pformat()有返回值,不直接打印。
import pprint # 导入漂亮打印
message='I love learning Python!'
count ={} # 建立一个计各个字符出现次数的空字典

for character in message: # character是字符串message中的值
    count.setdefault(character,0) # 默认计数count[character]为0
    count[character]=count[character]+1 # 每出现一个字母就计数加一

pprint.pprint(count) # 直接输出命令,返回值为None
print(pprint.pformat(count)) # 与上一句输出来说等效

out=pprint.pformat(count) # 但不同的是该语句有返回值,返回值是字符串
print(out)
print(type(out))

Results:

{' ': 3,
 '!': 1,
 'I': 1,
 'P': 1,
 'a': 1,
 'e': 2,
 'g': 1,
 'h': 1,
 'i': 1,
 'l': 2,
 'n': 3,
 'o': 2,
 'r': 1,
 't': 1,
 'v': 1,
 'y': 1}
{' ': 3,
 '!': 1,
 'I': 1,
 'P': 1,
 'a': 1,
 'e': 2,
 'g': 1,
 'h': 1,
 'i': 1,
 'l': 2,
 'n': 3,
 'o': 2,
 'r': 1,
 't': 1,
 'v': 1,
 'y': 1}
<class 'str'>
>>> out
"{' ': 3,\n '!': 1,\n 'I': 1,\n 'P': 1,\n 'a': 1,\n 'e': 2,\n 'g': 1,\n 'h': 1,\n 'i': 1,\n 'l': 2,\n 'n': 3,\n 'o': 2,\n 'r': 1,\n 't': 1,\n 'v': 1,\n 'y': 1}"
  1. 字典的嵌套
    把5.3.2中例子改编了一下,写了个新功能。
# 输出所有的食物及其数量

allGuest = {'Alice':{'apple':5,'pretzels':12},
            'Bob':{'ham sandwiches':3,'apple':2},
            'Carol':{'cups':3,'apple pies':1}}

def totalBrought(guests):
     out=[] # 定义空白列表,存储食物及其数量
     for k,v in guests.items():
          for i,j in v.items():
               out+=[i,j]
     # print(out) # out[i]对应字典中键,out[i+1]对应字典中值
     new={} # 定义空白字典,将食物和数量建立对应关系
     i=0
     while i <= int(len(out)-1):
          #new={out[i]:out[i+1]}
          #print(new)
          
          if out[i] not in new.keys():
               new.setdefault(out[i],out[i+1])   # 这里目的是把不在字典里的项加上
          else:
               value = new.setdefault(out[i],out[i+1]) # 这里的目的是取得已经在字典里项的值
               new[out[i]]=out[i+1]+value # out[i+1]是新添加的值
          i+=2
     #print(new)
     return new # 返回了一个字典,汇总了所有的食物和数量
          
#print(totalBrought(allGuest))
# 打印所有食物和数量
guest=totalBrought(allGuest)
print('Here is the food and amount:')
for i,j in guest.items():
     print(i,str(j))

Results:

Here is the food and amount:
apple 7
pretzels 12
ham sandwiches 3
cups 3
apple pies 1

实践项目

5.6.1 好玩游戏的物品清单

def displayInventory(Inventory):
     print('Inventory:')
     num=0
     for i,j in Inventory.items():
          print(j,i)
          num+=j
     print('Total number of items: '+str(num))

Inventory={'rope':1,'torch':6,'gold coin':42,'dagger':1,'arrow':12}
displayInventory(Inventory)

5.6.2 列表到字典
当字典赋值更新时,函数必须要返回:

def displayInventory(Inventory): # 显示字典
     print('Inventory:')
     num=0
     for i,j in Inventory.items():
          print(j,i)
          num+=j
     print('Total number of items: '+str(num))
     
def addToInventory(Inventory,addedItems): # 为字典添加物品并更新
     for k in range(len(addedItems)):
          if addedItems[k] not in Inventory:
               Inventory.setdefault(addedItems[k],1) # 物品是否存在?不存在物品为1
          else:
               value=Inventory.setdefault(addedItems[k],1)
               Inventory[addedItems[k]]=value+1
     return Inventory # 一定要返回不然Inventory为0
     

Inventory={'rope':1,'torch':6,'gold coin':42,'dagger':1,'arrow':12}# 原字典
dragonLoot=['gold coin','dagger','gold coin','gold coin','ruby'] # 添加物品列表
Inventory= addToInventory(Inventory,dragonLoot) # 更新字典
displayInventory(Inventory)

函数不返回时,字典也可以直接通过函数调用更新:

def displayInventory(Inventory): # 显示字典
     print('Inventory:')
     num=0
     for i,j in Inventory.items():
          print(j,i)
          num+=j
     print('Total number of items: '+str(num))
     
def addToInventory(Inventory,addedItems): # 为字典添加物品并更新
     for k in range(len(addedItems)):
          if addedItems[k] not in Inventory:
               Inventory.setdefault(addedItems[k],1) # 物品是否存在?不存在物品为1
          else:
               value=Inventory.setdefault(addedItems[k],1)
               Inventory[addedItems[k]]=value+1
     #return Inventory # 一定要返回不然Inventory为0
     

Inventory={'rope':1,'torch':6,'gold coin':42,'dagger':1,'arrow':12}# 原字典
dragonLoot=['gold coin','dagger','gold coin','gold coin','ruby'] # 添加物品列表
#Inventory= addToInventory(Inventory,dragonLoot) # 更新字典
addToInventory(Inventory,dragonLoot) # 这种情况下不用返回,因为函数直接更新了字典
displayInventory(Inventory) 

二者输出是相同的:

Inventory:
1 rope
6 torch
45 gold coin
2 dagger
12 arrow
1 ruby
Total number of items: 67
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容

  • Python语言特性 1 Python的函数参数传递 看两个如下例子,分析运行结果: 代码一: a = 1 def...
    伊森H阅读 3,057评论 0 15
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,380评论 0 5
  • Python语言特性 1 Python的函数参数传递 看两个如下例子,分析运行结果: 代码一: a = 1 def...
    时光清浅03阅读 482评论 0 0
  • 心声,是聆听自己的心跳声、低语声、啜泣声、还是呼喊声呢? 一时感觉也说不清,好似有好多话,要给自己说,...
    包包_c212阅读 292评论 5 9
  • 初春的朝阳缓缓地升起 东方的天边一片暖红色 天上的鸟儿欢快的嬉笑 大地就这样被唤醒过来
    善良的人家阅读 628评论 2 31