1.函数
调用方法通过名称将值传入函数的时候参数的顺序可以改变(注意改变顺序需要把所有的参数都填上),但是当有一个参数通过名称传值其右边的所有参数都需要通过名称传值,否则报错。同样当一个函数的一个参数设有默认值时其右边的所有参数都需要设置默认值。
def testParams(age, flag):
money = 500 if flag else 5 #相当于java mony = flag ? 500 : 5
...
testParams(flag=False, age=1)正确
testParams(age=1, False) #错误 第二个参数也需要通过名称传值flag=False
def testParams(age, name='cheny', flag): #错误 flag也需要指定默认值
2.列表
列表的创建:
a_list = ["a", "b", "mpilgrim", "z", "example"]
获取列表的元素
a_list[0] == "a"
a_list[-1] == "example"
可以使用计算公式a_list[-n] == a_list[len(a_list) -n]
列表的切片
a_list[:3] == a_list[0:3]
a_list[:] == alist[0:len(a_list)]
向列表中新增加项的四种方式
a_list =[1]
- a_list + [2, 'hello'] 结果为[1, 2, 'hello']
- a_list.append([2, 'hello']) 结果为[1, [2, 'hello']]
或者a_list.append('hello')结果为[1, 'hello'] - a_list.extend([2, 'hello']) 结果为[1, 2 , 'hello']
注意extend特别的地方a_list.extend('hello')结果为[1, 'h', 'e', 'l', 'l', 'o']而不是[1, 'hello'] - a_list.insert(0, 'hello')结果为['hello', 1]
append()与extend()的区别,都只接收一个参数但是列表调用append()方法添加的只是一个对象,而extend方法添加的是一个或多个对象
在列表中检索值
a_list = ["a", "b", "new", "mpilgrim", "new"]
a_list.count('new') == 2 返回列表中某个特定值出现的次数。
a_list.index('new') == 2 只返回第一次出现的位置索引值。
从列表中删除元素
1.根据索引删除
del a_list[1] 删除列表中第二个元素
2.根据值删除
a_list.remove('new') 删除列表中第一次出现的new元素,
例如:a_list = ["a", "b", "new", "mpilgrim", "new"]执行a_list.remove('new') 后结果为["a", "b", "mpilgrim", "new"]
3.带返回值的删除
a_list.pop()或者a_list.pop(1)
pop()不带参数的调用将删除列表中最后一个元素并返回所删除的值
pop(1)类似于del a_list[1]删除列表中第二个元素,但是相比del pop(1)将会返回被删除的值。
对与空列表调用pop()将会报错
修改列表中的值
a_list = [0, 'hello']
a_list[0] = 1 结果为[1, 'hello']
布尔上下文环境中的列表
在布尔类型上下文环境中,空列表为假值。
任何至少包含一个上元素的列表为真值。
a_list = []
if a_list:
print('True')
else:
print('False')
False
3.元组
元组是不可变的列表。一旦创建之后,用任何方法都不可以修改元素
a_tuple = ("a", "b", "mpilgrim", "z", "example")
元组不能添加删除修改元素,没有append()、 extend()、 insert()、remove() 和 pop() 这样的方法
元组可以切片a_tuple[:2],可以查找元素a_tuple.index('example'),还可以使用in运算符检查某个元素是否存在于元组中
使用元组相比列表的优点:
- 元组的速度比列表更快。如果定义了一系列常量值,而所需做的仅是对它进行遍历,那么请使用元组替代列表
- 对不需要改变的数据进行“写保护”将使得代码更加安全。使用元组替代列表就像是有一条隐含的 assert 语句显示该数据是常量,特别的想法(及特别的功能)必须重写。(??)
- 一些元组可用作字典键(特别是包含字符串、数值和其它元组这样的不可变数据的元组)。列表永远不能当做字典键使用,因为列表不是不可变的。
元组与列表可以相互转换。内建的 tuple() 函数接受一个列表参数,并返回一个包含同样元素的元组,而 list() 函数接受一个元组参数并返回一个列表。从效果上看, tuple() 冻结列表,而 list() 融化元组。
注意:元组使用圆括号定义( ),列表使用方括号[ ]定义。
创建单元素元组
如果创建单元素元组,需要在值之后加上一个逗号。没有逗号Python并不会创建元组。
a_tuple = ('hello') #不会创建元组
a_tuple = ('hello', ) #正确创建单元素元组
通过元组给变量同时赋多个值
(x, y, z) = ('a', '2', 'c')
输出x == ‘a’, y == '2', z == 'c'
该特性有多种用途。假设需要将某个名称指定某个特定范围的值。可以使用内建的 range() 函数进行多变量赋值以快速地进行连续变量赋值。例如:
(MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY) = range(7)
结果:MONDAY == 1 , TUESDAY == 2,... SUNDAY ==7
说明:内建的 range() 函数构造了一个整数序列。(从技术上来说, range() 函数返回的既不是列表也不是元组,而是一个 迭代器。
4.集合
集合的创建:
a_set = {1, 2}
创建一个空集合应该使用set()函数 如:a_set = set() ,而不是a_set={}这种方式将会创建一个空字典
实际上集合以类的形式实现。
将列表转换为集合调用set()函数,例如:a_set = set(a_list) 同时也能通过list()函数将集合转为列表。
注意:调用set()函数这实际上并不是调用某个函数,而是对某个类进行实例化。
集合是无序的,使用set()函数将列表转为集合时,元素顺序将会被打乱。不仅如此,每次使用该集合时元素顺序相比上次都可能不同
例如:
a_list = ["a", "b", "mpilgrim", True, False, 42]
a_set = set(a_list)
print(a_set)
输出结果:{False, True, 42, 'b', 'mpilgrim', 'a'}
向集合中添加值
有两种方法向现有的集合中添加值:add()和update()
add()只接收单个数据类型参数
update()接收一个或多个集合,列表,元组。
集合元素是不可重复的,每个元素都是唯一值。如果添加一个集合中已有的值,只是一条空操作。
从集合中删除元素
有三种方法可以用来从集合中删除某个值。discard(),remove(),pop()
discard()与remove()都是通过值删除,唯一的区别是,当删除一个列表中不存在的值时discard()不报错,remove()报错。
pop()方法带返回值的删除。由于集合是无序的,并没有“最后一个”值的概念,因此无法控制删除的是哪一个值。它基本是随机的。
clear()方法删除集合中所有的值。相当于a_set = set()
常见集合操作
1.union() 方法返回一个新集合,其中装着 在两个 集合中出现的元素。
2.intersection() 方法返回一个新集合,其中装着 同时 在两个集合中出现的所有元素。
3.difference() 方法返回的新集合中,装着所有在a_set出现但未在b_set中的元素。
4.symmetric_difference() 方法返回一个新集合,其中装着所有 只在其中一个 集合中出现的元素 。
5.issubset()检查一个集合是否为另一个集合的子集。
6.issuperset()检查一个集合是否为另一个集合的父集。
5.字典
字典是键值对的无序集合。
字典的创建
a_dict = {"server": "db.diveintopython3.org", "database": "mysql"}
创建空字典a_dict = {}
字典的修改
a_dict = {"server": "db.diveintopython3.org", "database": "mysql"}
修改:a_dict["database"] = "blog" # {"server": "db.diveintopython3.org", "database": "blog"}
添加:a_dict["user"] = "cheny" # {"server": "db.diveintopython3.org", "database": "blog", "user": "cheny"}
1.在字典中不允许有重复的键。对现有的键赋值将会覆盖旧值
2.字典键是区分大小写的
混合值字典
字典的值可以是任何数据类型,包括整数、布尔值、任何对象,甚至是其它的字典。而且就算在同一字典中,所有的值也无须是同一类型, 您可根据需要混合匹配。字典的键要严格得多,可以是字符串、整数和其它一些类型。在同一字典中也可混合、匹配使用不同数据类型的键。
字典与列表之间同样可以通过dict()方法与list()方法相互转换
6.None
None 是 Python 的一个特殊常量。它是一个空值。None 与 False 不同。None 不是 0 。None 不是空字符串。将 None 与任何非 None 的东西进行比较将总是返回 False 。
7.列表解析
a_list = [1, 9, 8, 4]
b_list = [b * 2 for b in a_list]
print(b_list) #[2, 18, 16, 8]
b_list = [b * 2 for b in a_list if b > 1] #注意if后面的b是列表中的元素,而不是* 2之后的b,b * 2是最后执行的
print(b_list) #[18, 16, 8]
b_list = [(b * 2, b - 1) for b in a_list if b > 1]
print(b_list) #[(18, 8), (16, 7), (8, 3)]
8.集合解析同列表解析。
9.字典解析
a_list = ['chenyou', 23, 'man']
b_list = ['name', 'age', 'sex']
a_dict = {f: a_list[index] for index, f in enumerate(b_list)}
print(a_dict) #{'name': 'chenyou', 'age': 23, 'sex': 'man'}