1.字典dict
1.1 字典定义和初始化
key-value键值对的数据的集合
可变的、无序的 key不重复
1)d = dict() 或者 d = {}
2)dict(**kwargs) 使用name=value对初始化一个字典
3)dict(iterable, **kwarg) 使用可迭代对象和name=value对构造字典,不过可迭代对象的元素必须是一个 二元结构
d = dict(((1,‘a’),(2,‘b’))) 或者 d = dict(([1,‘a’],[2,‘b’]))
4)dict(mapping, **kwarg) 使用一个字典构建另一个字典
d = {‘a’:10, ‘b’:20, ‘c’:None, ‘d’:[1,2,3]}
5) 类方法dict.fromkeys(iterable, value)
1.1字典元素的访问
d[key]
返回key对应的值value
key不存在抛出KeyError异常
get(key[, default])
返回key对应的值value
key不存在返回缺省值,如果没有设置缺省值就返回None
setdefault(key[, default])
返回key对应的值value
key不存在,添加kv对,value设置为default,并返回default,如果default没有设置,缺省为None
1.2字典增加和修改
d[key] = value
将key对应的值修改为value
key不存在添加新的kv对
update([other]) -> None
使用另一个字典的kv对更新本字典
key不存在,就添加
key存在,覆盖已经存在的key对应的值
就地修改
1.3字典删除
pop(key[, default])
key存在,移除它,并返回它的value
key不存在,返回给定的default
default未设置,key不存在则抛出KeyError异常
popitem()
移除并返回一个任意的键值对
字典为empty,抛出KeyError异常
clear()
清空字典
1.4 字典遍历
总结
Python3中,keys、values、items方法返回一个类似一个生成器的可迭代对象,不会把函数的返回结果复制到内存中
返回Dictionary view对象,可以使用len()、iter()、in操作
字典的entry的动态的视图,字典变化,视图将反映出这些变化
keys返回一个类set对象,也就是可以看做一个set集合。
如果values都可以hash,那么items也可以看做是类set对象
Python2中,上面的方法会返回一个新的列表,占据新的内存空间。所以Python2建议使用iterkeys、
itervalues、iteritems版本,返回一个迭代器,而不是返回一个copy
1.5字典的key
key的要求和set的元素要求一致
set的元素可以就是看做key,set可以看做dict的简化版
hashable 可哈希才可以作为key,可以使用hash()测试
d = {1 : 0, 2.0 : 3, “abc” : None, (‘hello’, ‘world’, ‘python’) : “string”, b’abc’ : ‘135’}
1.6 defaultdict
collections.defaultdict([default_factory[, …]])
第一个参数是default_factory,缺省是None,它提供一个初始化函数。 当key不存在的时候,会调用
这个工厂函数来生成key对应的value
1.7 OrderedDict
collections.OrderedDict([items])
key并不是按照加入的顺序排列,可以使用OrderedDict记录顺序
有序字典可以记录元素插入的顺序,打印的时候也是按照这个顺序输出打印
3.6版本的Python的字典就是记录key插入的顺序(IPython不一定有效果)
2. Python解析式
2.1标准库datetime
2.1.1 datetime模块
对日期、时间、时间戳的处理
datetime类
类方法
today() 返回本地时区当前时间的datetime对象
now(tz=None) 返回当前时间的datetime对象,时间到微秒,如果tz为None,返回和today()一样
utcnow() 没有时区的当前时间
fromtimestamp(timestamp, tz=None) 从一个时间戳返回一个datetime对象
datetime对象
timestamp() 返回一个到微秒的时间戳。
时间戳:格林威治时间1970年1月1日0点到现在的秒数
标准库datetime
2.1.2 datetime对象
构造方法 datetime.datetime(2016, 12, 6, 16, 29, 43, 79043)
year、month、day、hour、minute、second、microsecond,取datetime对象的年月日时
分秒及微秒
weekday() 返回星期的天,周一0,周日6
isoweekday() 返回星期的天,周一1,周日7
date() 返回日期date对象
time() 返回时间time对象
replace() 修改并返回新的时间
isocalendar() 返回一个三元组(年,周数,周的天)
日期格式化*
类方法 strptime(date_string, format) ,返回datetime对象
对象方法 strftime(format) ,返回字符串
字符串format函数格式化
time.sleep(secs) 将调用线程挂起指定的秒数
2.2 列表解析List Comprehension
语法
[返回值 for 元素 in 可迭代对象 if 条件]
使用中括号[],内部是for循环,if条件语句可选
返回一个新的列表
总结
立即计算
返回的不是迭代器,返回可迭代对象列表
从前到后走完一遍后,可以重新回头迭代
2.3 生成器表达式Generator expression
2.3.1 语法
(返回值 for 元素 in 可迭代对象 if 条件)
列表解析式的中括号换成小括号就行了
返回一个生成器
和列表解析式的区别
生成器表达式是按需计算(或称惰性求值、延迟计算),需要的时候才计算值
列表解析式是立即返回值
生成器
可迭代对象
迭代器
总结:
延迟计算
返回迭代器,可以迭代
从前到后走完一遍后,不能回头
2.3.2 和列表解析式的对比
计算方式
生成器表达式延迟计算,列表解析式立即计算
内存占用
单从返回值本身来说,生成器表达式省内存,列表解析式返回新的列表
生成器没有数据,内存占用极少,它是使用时一个个返回数据。如果将这些返回的数据合起来占用的内存也和列表解析式差不多。但是,它不需要立即占用这么多内存
列表解析式构造新的列表需要立即占用内存,不管你是否立即使用这么多数据
计算速度
单看计算时间看,生成器表达式耗时非常短,列表解析式耗时长
但是生成器本身并没有返回任何值,只返回了一个生成器对象
列表解析式构造并返回了一个新的列表,所以看起来耗时了
2.4 集合解析式
语法
{返回值 for 元素 in 可迭代对象 if 条件}
列表解析式的中括号换成大括号{}就行了
立即返回一个集合
2.5 字典解析式
语法
{返回值 for 元素 in 可迭代对象 if 条件}
列表解析式的中括号换成大括号{}就行了
使用key:value形式
立即返回一个字典
2.6 总结
生成器和迭代器是不同的对象,但都是可迭代对象
可迭代对象范围更大,都可以使用for循环遍历
3 简单选择排序
简单选择排序
属于选择排序
两两比较大小,找出极值(极大值或极小值)被放置在固定的位置,这个固定位置一般指的是某一端
结果分为升序和降序排列
降序
n个数从左至右,索引从0开始到n-1,两两依次比较,记录大值索引,此轮所有数比较完毕,将大数和索引0数交换,如果大数就是索引0,不交换。第二轮,从1开始比较,找到最大值,将它和索引1位置交换,如果它就在索引1位置则不交换。依次类推,每次左边都会固定下一个大数。
升序
和降序相反
本文深入探讨Python字典的定义、初始化、操作方法,包括访问、增加、修改、删除等,同时介绍字典解析式和defaultdict、OrderedDict等高级特性。此外,还详细解析了简单选择排序算法的工作原理。

484

被折叠的 条评论
为什么被折叠?



