在python当中一切皆对象,我们可以先创建一个对象,并给对象一定的值,这叫做实例化,然后再把此对象可以被其他对象所引用,
一:列表操作如下:
list1 = [1,2,"a","b",[5,6,7]]
list2 = list1
id(list1) #比较两个对象的值在内存的id是否一致
140698570735696
id(list2)
140698570735696
判断两个列表是否相等,注:此处的判断是判断两个列表的值是否相等。
list1 == list2
True
将list1进行修改,然后检查list2的值是否发生修改:
先通过list1的最后一个下标获取其值:
list1[4] #获取下标的值
[5, 6, 7]
list1[4] = [55,66] #对下标重新赋值
list1
[1, 2, 'a', 'b', [55, 66]] #检查list1和list2的值是否一致
list2
[1, 2, 'a', 'b', [55, 66]]
list1 == list2 #再次验证是否一致
True
二:字典下标操作:
通过下标获取value并进行修改:
dic1 = {1:2,"a":"b"}
dic1.setdefault(901,[55]) #setdefault,当有此字典的时候不做任何设置,无此字典则进行添加
[55] #是setdefault的返回值
dic1.fromkeys(range(5),[]) #fromkeys为指定key,并未key指定value从而生成新的字典。
{0: [], 1: [], 2: [], 3: [], 4: []}
c = dic1.fromkeys(range(5),[]) #c实例化dic1方法生成的结果
c[1].append({"B":{}}) #c字典进行修改
c[1][0]["B"]["C"] = "END" #获取到c的下标进行修改
print c #显示c的最最终内容
{0: [{'B': {'C': 'END'}}], 1: [{'B': {'C': 'END'}}], 2: [{'B': {'C': 'END'}}], 3: [{'B': {'C': 'END'}}], 4: [{'B': {'C': 'END'}}]}
print dic1
{'a': 'b', 1: 2, 901: [55], 902: 'x'}
字典引用:
dic1 = {"k1":"v1","k2":"v2"} #创建一个字典,实例化的步骤
id(dic1) #查看字典在内存的id
140502614443464
dic2 = dic1 #对dic1进行引用
id(dic2)
140502614443464
dic1["k2"] = "v22" #通过字典的key修改其相对应的value,这样是在字典原基础上修改,这样不会影响内存id,如果直接改字典是新建一个新的字典并复制给当前字典,内存id会变化
dic1
{'k1': 'v1', 'k2': 'v22'}
dic2 #查看dic1和dic2,发现dic1修改dic2同样进行了修改
{'k1': 'v1', 'k2': 'v22'}
id(dic1) #
140502614443464
id(dic2) #再次检查dic1和dic2的内存id并没有变化,因此通过字典的key修改不会影响字典引用和内存id的值
140502614443464
dic1 == dic2 #对比两个字典是否一致
True
字典key和value的循环方法:
对于key和value不是很多的字典,因为本操作会将所要字典全部读取出来并加载到内存最后执行for循环进行遍历找出key和value,速度会慢而且站资源,因此小的字典可以使用简单的for循环,如下:
for k,v in dic1.items():
print k,"--->",v
执行结果如下:
k2 ---> v22
k1 ---> v1
对于字典比较大的操作,比如几十万上百万行,使用如下方法:
for k in dic1:
print k,"--->",dic1[k]
执行结果如下:
k2 ---> v22
k1 ---> v1
列表循环举例:
通过循环某个列表,将匹配条件的结果附加到另一个列表或字典:
#生成偶数字典
list1 = range(0,50,2) #使用range生成序列
#生成一个空的字典,有key,但是value空的,稍后引用
dic1 = {"k1":[],"k2":[]}
#一个空的列表
list2 = []
#一个空的列表
list3 = []
#循环原列表
for i in list1:
if i > 25: #条件1,如果数字大于指定的某个数
list2.append(i) #就把此数附加给列表2
else:
list3.append(i) #否则就附加给列表3
print list2,list3 #最后输出列表2和列表3的内容
执行结果:
[27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49] [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25]
字典循环举例:
list1 = range(1,50,2) #使用range生成序列
dic1 = {"k1":[],"k2":[]}
for i in list1:
if i > 25:
dic1["k1"].append(i)
else:
dic1["k2"].append(i)
print dic1
执行结果:
{'k2': [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25], 'k1': [27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49]}
另外一种循环方法:
list1 = range(1,50,2) #使用range生成数字序列并给list1引用,即通过list1进行实例化
dic1 = {}
for item in list1:
if item > 25: #假如数值大于25
if 'k2' in dic1.keys(): #条件为假如k2是dic1的key
dic1['k2'].append(item) #就给k2这个key附加一个item的值,for是每次循环一行,一次每行增加一个值
else: #假如k2不在item的key里面
dic1['k2'] = [item,] #就创建一个列表并附加一个value,里面的逗号表示这是一个列表,不加逗号在django的某些时候不能识别,因此加逗号通用
else: #假如数值小于25
if 'k1' in dic1.keys(): #假如k1在item的key里面,即是item的key
dic1['k1'].append(item) #给k1附加一个值
else: #假如k1不是item的key
dic1['k1'] = [item,] #创建一个新的列表并附加一个value
print dic1
执行结果:
{'k2': [27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49], 'k1': [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25]}
三:文件基础操作:
假如有一个log文件,其每一行记录了一个人名、得分数和排名,内容如下:
jack|98|1
tom|95|2
jhon|93|3
现在有个要求,需要用字典的方式对列表进行拆分,以人名当做key,分数和排名用列表当做value,方法如下:
#/usr/bin/env python
# -*- coding:utf-8 -*-
obj = file('log','r') #以只读方式打开日志文件
line_list = obj.readlines() #将文件一次性全部读取完成
obj.close() #关闭文件
dic = {}
for line in line_list: #对列表进行循环
line = line.strip() #将循环结果赋值给line调用,列表的strip方法会默认删除列表两头空格和换行符,包括('\n', '\r', '\t', ' '),还可以在括号传递要在两头删除的字符,还有rstrip和lstrip方法
list_line = line.split('|') #split方法用于 通过指定字符对列表进行分片,本次是通过|对列表中出现|的进行分片,分片完成以后生成字符形式的列表,即每个元素用引号引起来,其形式如['a','1'],数字也引起来
dic[list_line[0]] = list_line[1:] #引用字典,将列表的第一个元素传递给字典当做字典的key,并给key赋值,值为列表第二个(1:表示对列表切片,从二个元素到结尾)元素到最后的所有元素
print dic #打印字典的最终结果
执行结果如下:
{'jhon': ['93', '3'], 'jack': ['98', '1'], 'tom': ['95', '2']}
四:lambda表达式:
lambda表达式的定义:
只是一个表达式,完成一些逻辑简单的表达式,可以用于def函数中
自动return结果
num = lambda x,y,z:x+y+z #定义一个表达式,接收x,y,z三个参数,并计算x+y+z的结果
num(3,4,5) #调用表达式并传递参数
12 #执行结果
def dic(x): #第一步执行函数,第三步x=2
return lambda y:x+y #第四步执行lambda表达式,需要传递x的值,第六步x等于2y等于4,返回6即执行完毕
a = dic(2) #第二步传递2给x
print a(4) #第五步打印a并传递4给y
dic2 = lambda a,b:a+b #定义一个表达式接收两个形参,dic2等于定义函数的名称,a,b等于函数名后面的形式参数,a+b等于函数结果的return a+b,lambda是自动return结果给函数名
num = dic2(3,6) #等于调用函数
print num #输出执行结果
转载于:https://blog.51cto.com/zhangshijie/1718246