用for循环遍历字典有三种方式:
keys()该方法返回字典所有的keyvalues() 该⽅法返回⼀个序列 序列中保存有字典的值items()该⽅法会返回字典中所有的项 它返回⼀个序列,序列中包含有双值子序列 双值分别是 字典中的key和value。 下面请看示例: d = {'a':1, 'b':2,'c':3,'d':4} for k in d.keys(): print(k,'\t',end='') print() for v in d.values(): print(v,'\t',end='') print() for i in d.items(): print(i,'\t',end='')执行结果如下: a b c d 1 2 3 4 (‘a’, 1) (‘b’, 2) (‘c’, 3) (‘d’, 4)
集合表现形式set 集合和列表⾮常相似
不同点:
集合只能存储不可变对象集合中存储的对象是无序的集合不能出现重复元素执行结果如下: {1, 2, 3, 4, 5} <class ‘set’> {‘a’, ‘b’} {1, 2, 3, 4, 5, 100} {1, 2, 3, 4, 5, 100, 101, 102} {2, 3, 4, 5, 100, 101, 102} {3, 4, 5, 100, 101, 102} set()
集合之间可以进行以下运算:
& 交集运算| 并集运算 差集运算 ^ 亦或集<= 检查一个集合是否是另一个集合的子集< 检查一个集合是否是另一个集合的真子集=检查一个集合是否是另一个集合的超集
检查一个集合是否是另一个集合的真超集 下面请看示例:
s1 = {1,2,3,4} s2 = {2,3,4,5} print(s1&s2) # 求s1和s2的交集 print(s1|s2) # 求s1和s2的并集 print(s1-s2) # 求s1和s2的差集 print(s1^s2) # 求s1和s2的亦或集 print(s1<=s2) #检查s1是否是s2的子集 print(s1<s2) # 检查s1是否是s2的真子集 print(s1>=s2) #检查s1是否是s2的超集 print(s1>s2) #检查s1是否是s2的真超集执行结果如下: {2, 3, 4} {1, 2, 3, 4, 5} {1} {1, 5} False False False False
执行代码结果如下: 这个函数中,a,b,c就是函数内部申明的变量形参,而1,2,3就是指定形参,调用函数,也就是实参。
代码执行结果如下: a = 2 b = 3 c = 1 由此可见,虽然在申明形参的时候后,顺序是a、b、c。但是在传入实参的时候用了关键字的方法,仍然会对形参按照关键字而不是按照位置正确赋值。
混合使用位置参数和关键字参数的时候必须将位置参数写到关键字参数前面去 下面请看示例: def s_sum(a,b,c): s = a+b+c print('a =',a) print('b =',b) print('c =',c) s_sum(1,2,c=3)执行结果如下: a = 1 b = 2 c = 3
参数默认值:定义形参时,可以为形参指定默认值。指定了默认值以后,如果⽤户传递了参 数则默认值不会⽣效。如果⽤户没有传递,则默认值就会⽣效。 下面请看示例: def s_sum(a,b,c=3): s = a+b+c print('c =',c) s_sum(1,2) def s_sum1(a,b,c=3): s = a+b+c print('c =',c) s_sum1(1,2,4)执行结果如下: c = 3 c = 4 对比s_sum和s_sum1这两个函数可以看出,如果形参有默认值,当不传入该参数的时候会使用默认值,如果实参传入了该参数,则按照新传入的参数来执行。
对象在内存中,都保存了3个数据:
id(标识)type(类型)value(值) 请看下面的示例: a = [1,2,3] print('a=',a,id(a)) #原本a的id a[0] = 5 print('a=',a,id(a)) #通过索引值改动后的id a = [4,5,6] print('a=',a,id(a)) #通过更改整个变量后的id执行结果如下: a= [1, 2, 3] 2652192056520 a= [5, 2, 3] 2652192056520 a= [4, 5, 6] 2652192056392 已知相同id,就是相同对象,我们可以得到结论:
通过索引值修改的a和原本的a是一个对象。将整个a 重新赋值的操作和原本的a不是一个对象。原因是:通过索引值更改元素的这个操作是修改对象的value,并且不会改变变量所指向的对象。而将整个a重新赋值的操作是给变量重新赋值,并且会改变量所指向的对象
执行结果如下: a= [5, 2, 3] 1962692846792 c= [5, 2, 3] 1962692846792
原因是,当c时一个可变对象的时候,因为函数内部只更改了形参a的value,而形参a和实参c是同一个对象,所以也修改了实参c的值。
如果希望修改a的值不影响c的值,可以用copy的方法。 请看以下示例:
def fn(a): a[0] = 5 print('a=',a,id(a)) c = [1,2,3] fn(c.copy()) print('c=',c,id(c))执行结果如下: a= [5, 2, 3] 2947890881608 c= [1, 2, 3] 2947890881736
由此可见,用c.copy()这个方法当做实参传入函数中,不会影响c的值,因为c.copy()复制了一个c, 他们不是同一对象。