1. 通过{ }操作符创建字典
2. 通过dict()工厂方法创建字典
3. 通过fromkeys()创建具有相同值的默认字典
>>> adict = {'name':'bob', 'age':23}
>>> bdict = dict((['name', 'bob'], ['age', 23]))
>>> print(bdict)
{'age': 23, 'name': 'bob’}
>>> cdict = {}.fromkeys(('bob', 'alice'), 23)
>>> print(cdict)
{'bob': 23, 'alice': 23}
1. 字典是映射类型,意味着它没有下标,访问字典中的
值需要使用相应的键
>>> for each_key in adict:
... print 'key=%s, value=%s' % (each_key, adict[each_key])
key=age, value=23
key=name, value=bob
>>> print('%(name)s' % adict)
bob
1.通过键更新字典
– 如果字典中有该键,则更新相关值
– 如果字典中没有该键,则向字典中添加新值
>>> print adict
{'age': 23, 'name': 'bob'}
>>> adict['age'] = 18
>>> print(adict)
{'age': 18, 'name': 'bob'}
>>> adict['phone']='15270203397'
>>> print adict
{'phone': '15270203397', 'age': 30, 'name': 'bob'}
1. 通过del可以删除字典中的元素或整个字典
2. 使用内部方法clear()可以清空字典
3. 使用pop()方法可以“弹出”字典中的元素
>>> del adict['email’]
>>> print(adict)
{'age': 22, 'name': 'bob’}
>>> adict.pop('age’)
22
>>> print(adict)
{'name': 'bob’}
>>> adict.clear()
>>> print(aDict)
{}
1. 使用字典键查找操作符[ ],查找键所对应的值
2. 使用in和not in判断键是否存在于字典中
>>> adict = {'age': 18, 'name': 'bob'}
>>> print(adict['name’])
bob
>>> 'bob' in adict
False
>>> 'name' in adict
True
1. len():返回字典中元素的数目
2. hash():本身不是为字典设计的,但是可以判断某个对象是否可以作为字典的键
>>> print(adict)
{'age': 23, 'name': 'bob’}
>>> print(len(adict))
2
>>> hash(3)
3
>>> hash([]) //list不能作为字典的键
Traceback (most recent call last):
File "
TypeError: unhashable type: 'list'
1. dict.copy():返回字典的一个副本
>>> print(adict)
{'age': 23, 'name': 'bob'}
>>> bdict = adict.copy()
>>> bdict['name'] = 'alice’
>>> print(adict)
{'age': 23, 'name': 'bob'}
>>> print(bdict)
{'age': 23, 'name': 'alice’}
2. dict.get(key, default=None):对字典dict中的键
key,返回它对应的值value,如果字典中不存在此键,
则返回default的值
dict.get(key, default=None):对字典dict中的键key,返回它对应的
值value,如果字典中不存在此键,则返回default的值
>>> A=adict.get('AAA')
>>>
3. dict.setdefault(key, default=None):如果字典中不存在key键,由dict[key]=default为它赋值
>>> print(adict)
{'age': 23, 'name': 'bob’}
>>> adict.setdefault('age', 20)
23
>>> print(adict)
{'age': 23, 'name': 'bob’}
>>> adict.setdefault('phone', '15033448899’)
'15033448899’
>>> print(adict)
{'phone': '15033448899', 'age': 23, 'name': 'bob’}
4.字典常用函数
• dict.items():返回一个包含字典中(键,值)对元组的列表
• dict.keys():返回一个包含字典中键的列表
• dict.values():返回一个包含字典中所有值的列表
• dict.update(dict2):将字典dict2的键-值对添加到字典dict
案例1:模拟用户登陆信息系统
1. 支持新用户注册,新用户名和密码注册到字典中
2. 支持老用户登陆,用户名和密码正确提示登陆成功
3. 主程序通过循环询问进行何种操作,根据用户的选择,执行注册或是登陆操作
import getpass
userdb={}
def register():
username=input('username: ')
if username in userdb:
print('%s is Aleary exists' % username)
else:
password=input('password: ')
userdb[username]=password
def login():
username = input('username: ')
password=getpass.getpass('password: ')
if userdb.get(username) != password:
print('login failed!')
else:
print('login success!')
def show_menu():
cmds={'0':register,'1':login}
prompt="""(0) regist
(1) login
(2) quit
Please input you choice(0/1/2):"""
while True:
choice = input(prompt).strip()[0]
if choice not in '012':
print('Invalid choice.Try again')
continue
if choice == '2':
break
cmds[choice]()
if __name__ == '__main__':
show_menu()
案例2:编写unix2dos的程序
1. Windows文本文件的行结束标志是\r\n
2. 类unix文本文件的行结束标志是\n
3. 编写程序,将unix文本文件格式转换为windows文本文件的格式
import sys
def unix2dos(fname):
dst_fname=fname+'.txt'
with open(fname) as src_fobj:
with open(dst_fname,'w') as dst_fobj:
for line in src_fobj:
dst_fobj.write(line.rstrip()+'\r\n')
if __name__ == '__main__':
unix2dos(sys.argv[1])
案例3:编写类进度条程序
1. 在屏幕上打印20个#号
2. 符号@从20个#号穿过
3. 当@符号到达尾部,再从头开始
import time
import sys
for i in range (1,21):
print('#',end='')
count=0
while True:
print('\r%s@%s' % ('#'*count,'#'*(19-count)),end='')
count+=1
if count==20:
count=0
# sys.stdout.flush()
time.sleep(0.1)
1. 数学上,把set称做由不同的元素组成的集合,集合(set)的成员通常被称做集合元素
2. 集合对象是一组无序排列的可哈希的值
3. 集合有两种类型
– 可变集合set
– 不可变集合frozenset
>>> s1 = set('hello')
>>> s2 = frozenset('hello')
>>> s1
{'l', 'e', 'o', 'h'}
>>> s2
frozenset({'l', 'e', 'o', 'h'})
1. 集合支持用in和not in操作符检查成员
2. 能够通过len()检查集合大小
3. 能够使用for迭代集合成员
4. 不能取切片,没有键
>>> len(s1)
4
>>> for ch in s1:
... print(ch)
l
e
o
h
5. |:联合,取并集
6. &:交集
7. -:差补
>>> s1 = set('abc')
>>> s2 = set('cde')
>>> s1 | s2
{'e', 'd', 'b', 'a', 'c'}
>>> s1 & s2
{'c'}
>>> s1 - s2
{'b', 'a'}
1. set.add():添加成员
2. set.update():批量添加成员
3. set.remove():移除成员
>>> s1 = set('hello')
>>> s1.add('new')
>>> s1
{'h', 'o', 'l', 'e', 'new'}
>>> s1.update('new')
>>> s1
{'h', 'o', 'l', 'w', 'e', 'new', 'n'}
>>> s1.remove('n')
>>> s1
{'h', 'o', 'l', 'w', 'e', 'new'}
1. s.issubset(t):如果s是t的子集,则返回True,否则返回False
2. s.issuperset(t):如果t是s的超集,则返回True,否则返回False
3 s.union(t):返回一个新集合,该集合是s和t的并集
4. s.intersection(t):返回一个新集合,该集合是s和t的交集
5. s.difference(t):返回一个新集合,该集合是s的成员,但不是t的成员
1. 时间戳timestamp:表示的是从1970年1月1日
00:00:00开始按秒计算的偏移量
2. UTC(Coordinated Universal Time,世界协调时)
亦即格林威治天文时间,世界标准时间。在中国为
UTC+8。DST(Daylight Saving Time)即夏令时
3. 元组(struct_time):由9个元素组成
https://yiyibooks.cn/ -> Python 352 文档 ->库参考
1. time.time():返回当前时间的时间戳
>>> time.time()
1537452340.259848
2. time.sleep(secs):线程推迟指定的时间运行。单位为秒
>>> time.sleep(2) //2s后
>>>
3.time.ctime([secs]):把一个时间戳(按秒计算的浮点数)转化为“Sun Jun 20 23:21:05 1993”的形式
>>> import time
>>> time.ctime()
'Thu Sep 20 22:05:17 2018'
4. time.strftime(format[, t]):把一个代表时间的元
组或者struct_time(如由time.localtime()和
time.gmtime()返回)转化为格式化的时间字符串。
如果t未指定,将传入time.localtime()
>>> time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())
'2018-09-20 22:09:12'
1.使用datetime获取当前时间
>>> datetime.datetime.now()
datetime.datetime(2018, 9, 20, 22, 22, 40, 232542) # 年月日时分秒毫秒
2.使用timedelta可以很方便的在日期上做天days,小时hour,分钟,秒,毫秒,微妙的时间计算
>>> from datetime import timedelta
>>> dt=datetime.datetime.now()
>>> days=timedelta(days=100,hours=3)
>>> dt+days
datetime.datetime(2018, 12, 29, 22, 25, 47, 777313)
异常就是程序在执行的过程中发生的错误
异常 | 描述 |
NameError | 未声明/初始化对象 |
IndexError | 序列中没有没有此索引 |
SyntaxError | 语法错误 |
KeyboardInterrupt | 用户中断执行 |
EOFError | 没有内建输入,到达EOF标记 |
IOError | 输入/输出操作失败 |
定义了进行异常监控的一段代码,并且提供了处理异常的机制
>>> try:
... data = int(input('input a number: '))
... except KeyboardInterrupt:
... print 'user cancelled'
... except ValueError:
... print('you must input a number!’)
...
• 在try范围中没有异常被检测到时,执行else子句
• 在else范围中的任何代码运行前,try范围中的所有代
码必须完全成功
>>> try:
... result = 100 / int(input("number: "))
... except Exception as e:
... print('Error:', e)
... else:
... print(result)
...
number: 10
10.0
• finally子句是无论异常是否发生,是否捕捉都会执行的一段代码
• 如果打开文件后,因为发生异常导致文件没有关闭,可能会发生数据损坏。使用finally可以保证文件总是
能正常的关闭
1. 提示用户输入一个数字作为除数
2. 如果用户按下Ctrl+C或Ctrl+D则退出程序
3. 如果用户输入非数字字符,提示用户应该输入数字
4. 如果用户输入0,提示用户0不能作为除数
try:
n=int(input('number: '))
result=100/n
except (ValueError,ZeroDivisionError):
print('Invalid Number')
except (KeyboardInterrupt,EOFError):
print('\nBye')
else: #异常不发生才执行
print(result)
finally: #不管异常是否发生,都会执行
print('Done')
• 要想引发异常,最简单的形式就是输入关键字raise,
后面跟要引发的异常的名称
• 执行raise语句时,Python会创建指定的异常类的一
个对象
• raise语句还可指定对异常对象进行初始化的参数
def set_age(name,age):
if not 0
print('%s:%s' % (name,age))
• 断言是一句必须返回布尔值的语句
• 此外,发生异常也意味着表达式为假
>>> assert 10 > 100, "Wrong"
Traceback (most recent call last):
File "
AssertionError: Wrong
1. 编写第一个函数,函数接收姓名和年龄,如果年龄
不在1到120之间,产生ValueError异常
2. 编写第二个函数,函数接收姓名和年龄,如果年龄
不在1到120之间,产生断言异常
def set_age(name,age):
if not 0
对文件系统的访问大多通过python的os模块实现
>>> import os
>>> os.system('ls /root')
call模块支持使用任何shell命令,可以通过call模块访问linux系统
from subprocess import call
call('ls /root/',shell=True)
1. 把数据写入文件时,常规的文件方法只能把字符串对
象写入。其他数据需先转换成字符串再写入文件 。
2. python提供了一个标准的模块,称为pickle。使用它
可以在一个文件中储存任何python对象,之后又可
以把它完整无缺地取出来
1. 分别调用dump()和load()可以存储、写入
>>> import pickle as p
>>> shoplistile = 'shoplist.data'
>>> shoplist = ['apple', 'mango', 'carrot']
>>> f = open(shoplistile, 'wb')
>>> p.dump(shoplist, f)
>>> f.close()
>>>
>>> f = open(shoplistile)
>>> storedlist = p.load(f)
>>> print storedlist
['apple', 'mango', 'carrot']
1. 假设在记账时,有一万元钱
2. 无论是开销还是收入都要进行记账
3. 记账内容包括时间、金额和说明等
4. 记账数据要求永久存储
import os
import pickle as p
import time
def save_money(record,wallet):
amount = int(input('amount: '))
comment = input('comment: ')
date = time.strftime('%Y-%m-%d')
with open(wallet, 'rb') as fobj:
balance = p.load(fobj) + amount
with open(wallet, 'wb') as fobj:
p.dump(balance, fobj)
with open(record, 'a') as fobj:
fobj.write(
'%-15s%-8s%-8s%-8s%-20s\n' % (date, amount, '', balance, comment)
)
def cost_money(record,wallet):
amount = int(input('amount: '))
comment = input('comment: ')
date = time.strftime('%Y-%m-%d')
with open(wallet, 'rb') as fobj:
balance = p.load(fobj) + amount
with open(wallet, 'wb') as fobj:
p.dump(balance, fobj)
with open(record, 'a') as fobj:
fobj.write(
'%-15s%-8s%-8s%-8s%-20s\n' % (date, amount, '', balance, comment)
)
def query_money(record,wallet):
print('%-15s%-8s%-8s%-8s%-20s' % ('date', 'save', 'cost', 'balance', 'comment'))
with open(record) as fobj:
for line in fobj:
print(line, end='')
with open(wallet, 'rb') as fobj:
print('Latest Balance: %s' % p.load(fobj))
def show_menu():
record='/tmp/record.txt'
wallet='/tmp/wallet.txt'
cmds={'1':save_money,'2':cost_money,'3':query_money}
prompt='''*******欢迎使用记账小程序*******
1.save money
2.cost money
3.query money
4.quit
请输入序号(1/2/3/4):'''
if not os.path.exists(wallet):
with open(wallet,'wb') as fobj:
p.dump(10000,fobj)
while True:
choice=input(prompt).strip()[0]
if choice not in '1234':
print('Invalid choice Try again')
continue
if choice == '4':
break
cmds[choice](record,wallet)
if __name__ == '__main__':
show_menu()