字典
- 字典中的值是任意的对象
- 字典中的键必须是不可变的对象,例如int、float、string、tuple等。不可变就是可哈希的,用hash()函数进行检查。
- 列表要当做键可以先转成元组,list--->tuple
words = ["apple", "book", "autumn", "bag", "cook", "car", "dog", "as"]
dict2 = {}
for word in words:
letter = word[0]
dict2.setdefault(letter, []).append(word) # 首字母不在,则更新字典中的键值对
setdefault
:表示letter
不在dict2
中,返回空列表,再进行追加操作。
- 通过collections模块来实现功能
from collections import defaultdict
words = ["apple", "book", "autumn", "bag", "cook", "car", "dog", "as"]
dict3 = defaultdict(list)
for word in words:
dict3[word[0]].append(word)
dict3
# 结果
defaultdict(list,
{'a': ['apple', 'autumn', 'as'],
'b': ['book', 'bag'],
'c': ['cook', 'car'],
'd': ['dog']})
集合set
- 用{}表示,和字典一样,只有键没有值{"book", "name", "shenzhen"}
- 无序,不可重复,里面的元素不可变
- 用set()函数或者{}进行创建,创建的过程中自动去重
- 元素是不可变的,可以先转成元组再获取
操作方法
- 并集union:a.union(b),|
- 交集intersection:a.intersection(b),&

列表解析式
从一个元素过滤,形成列表,在传递参数的过程中还可以修改元素。
语句:[expr for val in collection if condition]
# 等价于
result = []
for val in collection:
if condition:
result.append(expr)
题目:将列表中的字符串长度小于3的全部改成大写
list1 = ["book", "car", "as", "go", "beautiful", "believe"]
[x.upper() for x in list1 if len(x) >3] # 将列表中的字符串中的长度大于2的转成全部大写
['BOOK', 'BEAUTIFUL', 'BELIEVE']
等价于:
list2 = []
for x in list1:
if len(x) > 3:
list2.append(x.upper())
else:
pass
- 字典和集合也是用类似于列表的推导式
set1 = {"book", "car", "python", "as"}
{len(x) for x in set1}
# 结果
{2, 3, 4, 6}
# 使用map函数
set(map(len, set1)) # map函数接受的参数:第一个是功能函数,第二个序列,最后用set()方法显式出来,也可以用list显式成列表形式

字典推导式
- 注意val:index的写法,就是表达式
- enumerate()函数同时获取序列中的索引和元素
dict4 = {val: index for index, val in enumerate(list1)}
嵌套列表推导式
嵌套列表推导式:输出一个嵌套列表中的名字中含有两个e的名字
- 用for循环解决
data = [['John', 'Emily', 'Michael', 'Mary', 'Steven'],
['Maria', 'Juan', 'Javier', 'Natalia', 'Pilar']]
names_list = []
for names in data:
name_e = [name for name in names if name.count("e") >= 2 ]
names_list.extend(name_e)
>>name_list
['Steven']
- 套列表推导式:条件是从大到小的写出来,先取出字典中的列表,再取出列表中的元素;过滤条件放在最后
>>result = [name for names in data for name in names if name.count("e") >= 2]
>>result
['Steven']
将一个整数元组的列表扁平化成一个整数列表
- 通过两个for推导式解决,大范围在前
- for表达式的顺序和嵌套顺序是相同的
tuples = [(1,2,3), (5,6), (7,8,9,10)]
list1 = [x for tup in tuples for x in tup]
list1
[1, 2, 3, 5, 6, 7, 8, 9, 10]
- 嵌套可以是任意的;多层嵌套需要考虑代码可读性
- 注意判断列表推导式的语法不通对结果的影响
>>tuples = [(1,2,3), (5,6), (7,8,9,10)]
>>list2 = [[x for x in tup] for tup in tuples]
>>list2
[[1, 2, 3], [5, 6], [7, 8, 9, 10]]
函数
函数是Python中最重要的代码组织和复用手段。几个特征描述如下,具体内容可以参考Python札记17_初识函数function
- 关键字
def
进行声明;return
进行返回 - 可以拥有多条return;如果到达函数末尾的时候没有遇到return语句,返回的是None
- 函数有
位置参数
和关键字参数
关键字参数必须位于位置参数之后
- 关键字参数通常用于指定默认值和可选参数
def func(x, y, z=2): # x、y是位置参数;其中z是关键字参数
if z > 1:
return z * (x + y)
else:
return z * (x - y)
# 不同的参数指定方式
func(1, 2, z=2)
func(1, 2, 3)
func(1, 2)
func(x=4, y=6, z=8) # 可读性高
命名空间、作用域和局部函数
两种变量:全局变量
global
和局部变量local
。Python
中有一种更科学地描述变量作用域的名称,叫做命名空间
。
- 任何在函数中赋值的变量,默认都是被分配到局部命名空间。
- 局部命名空间是
函数被调用时候创建
的,函数参数会立即填入该空间中 - 函数执行完毕,局部命名空间立即销毁
- 在函数中对全局变量进行操作,必须先用
global
对变量进行声明。
# 函数执行完毕,局部命名空间会被销毁(除了闭包的情况)
def func():
a = []
for i in range(5):
a.append(i)
return a # 第一次循环碰到return直接结束整个函数,返回[0]
b = func()
b # [0]
def func():
a = []
for i in range(5):
a.append(i)
return a # 循环5次之后再遇到return
b = func()
b
[0, 1, 2, 3, 4]
返回多个值
在Python中可以同时返回多个值,一般是元组
的形式
def func():
a = 5
b = 6
c = 7
return a, b, c # 返回的是元组形式
a, b, c = func() # 将返回值分别给前面的3个变量

网友评论