三、字典的基本操作
1、如何访问字典中的值?
adict[key] 形式返回键key对应的值value,如果key不在字典中会引发一个KeyError。
adict.get(key, default = None) 返回字典中key对应的值,若key不存在字典中,则返回default的值(default默认为None);
2、如何检查key是否在字典中?
a、has_key()方法 形如:adict.haskey(‘name') 有–>True,无–>False //3.0中变成了in
b、in 、not in 形如:'name' in adict 有–>True,无–>False
3、如何更新字典?
a、添加一个数据项(新元素)或键值对
adict[new_key] = value 形式添加一个项
b、更新一个数据项(元素)或键值对
adict[old_key] = new_value
c、删除一个数据项(元素)或键值对
del adict[key] 删除键key的项 / del adict 删除整个字典
adict.pop(key) 删除键key的项并返回key对应的 value值
adict.pop(key[,default]) 和get方法相似。如果字典中存在key,删除并返回key对应的vuale;如果key不存在,且没有给出default的值,则引发keyerror异常;
1、adict.keys() 返回一个包含字典所有KEY的列表;
dic = {'lilei': 90, 'lily': 100, 'sam': 57, 'tom': 90}
for key in dic:
print dic[key]
序列的循环操作,元组 列表用的下标,字典用的是key
访问形式一样,故for对应的就是dict的key。
2、adict.values() 返回一个包含字典所有value的列表;
3、adict.items() 返回一个包含所有(键,值)元祖的列表;
4、adict.clear() 删除字典中的所有项或元素;
5、adict.copy() 返回一个字典浅拷贝的副本;
6、adict.setdefault(key, default=None) 和set()方法相似,但如果字典中不存在Key键,由 adict[key] = default 为它赋值;
7、adict.update(bdict) 将字典bdict的键值对添加到字典adict中,更新的会覆盖相同key
tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。即指向'a',就不能改成指向'b',指向一个list,就不能改成指向其他对象,但指向的这个list本身是可变的!
sequence
基本样式[下限:上限:步长]
s1[0:5:2] # 从下标0到下标4 (下标5不包括在内),每隔2取一个元素 (下标为0,2,4的元素)
字符串可以看成是特殊元素的tuple
str = "abcdef"
str[2:4]
range(start, stop[, step]) -> range object
continue # 在循环的某一次执行中,如果遇到continue, 那么跳过这一次执行,进行下一次的操作
break # 停止执行整个循环
for i in range(10):
if i == 2:
continue
print i
dir()用来查询一个类或者对象所有属性。你可以尝试一下
>>>print dir(list)
help()用来查询的说明文档。你可以尝试一下
>>>print help(list)
'r' open for reading (default)
'w' open for writing, truncating the file first //文件不存在会创建,存在会从开始写入,原有数据丢失
'x' create a new file and open it for writing //文件存在会报错
'a' open for writing, appending to the end of the file if it exists//文件不存在会创建文件
'b' binary mode
't' text mode (default)
'+' open a disk file for updating (reading and writing) //必须要r/w/a在前面
f = open(r'C:Program FilesTongbuTongbu.exe.config','r',encoding= 'utf-8') //3.5版本
print('a',end='') //print 不换行
关键字传递可以和位置传递混用。但位置参数要出现在关键字参数之前:
包裹传递
在定义函数时,我们有时候并不知道调用的时候会传递多少个参数。这时候,包裹(packing)位置参数,或者包裹关键字参数,来进行参数传递,会非常有用。
下面是包裹位置传递的例子:
def func(*name):
print type(name)
print name
func(1,4,6)
func(5,6,7,1,2,3)
两次调用,尽管参数个数不同,都基于同一个func定义。在func的参数表中,所有的参数被name收集,根据位置合并成一个元组(tuple),这就是包裹位置传递。
为了提醒Python参数,name是包裹位置传递所用的元组名,在定义func时,在name前加*号。
下面是包裹关键字传递的例子:
def func(**dict):
print type(dict)
print dict
func(a=1,b=9)
func(m=2,n=1,c=11)
与上面一个例子类似,dict是一个字典,收集所有的关键字,传递给函数func。为了提醒Python,参数dict是包裹关键字传递所用的字典,在dict前加**。
包裹传递的关键在于定义函数时,在相应元组或字典前加*或**。
解包裹
*和**,也可以在调用的时候使用,即解包裹(unpacking), 下面为例:
def func(a,b,c):
print a,b,c
args = (1,3,4)
func(*args)
在这个例子中,所谓的解包裹,就是在传递tuple时,让tuple的每一个元素对应一个位置参数。在调用func时使用*,是为了提醒Python:我想要把args拆成分散的三个元素,分别传递给a,b,c。(设想一下在调用func时,args前面没有*会是什么后果?)
相应的,也存在对词典的解包裹,使用相同的func定义,然后:
dict = {'a':1,'b':2,'c':3}
func(**dict)
在传递词典dict时,让词典的每个键值对作为一个关键字传递给func。
python声明编码格式
#coding: utf-8 //没有此声明 是无法使用中文的 加u都没用
import sys
print(sys.getdefaultencoding()) #2.7 ascii >3.0:utf-8
import sys
from sys import argv #单独功能
from sys import * #所有功能,不用sys.xx,但是不建议用,避免命名冲突,也让代码可读性不好
import multiprocessing as multi #别名
tt=os.popen('mem').read() #os.popen 打开系统命令
tt=commands.getstatusoutput('mem') #得到系统命令输出 win没用 linux有用 返回状态和执行结果元组
raw_input(...)
raw_input([prompt]) -> string
Read a string from standard input.
raw_input() 与 input() __ Python
这两个均是 python 的内建函数,通过读取控制台的输入与用户实现交互。但他们的功能不尽相同。举两个小例子。
1 >>> raw_input_A = raw_input("raw_input: ")
2 raw_input: abc
3 >>> input_A = input("Input: ")
4 Input: abc
5
6 Traceback (most recent call last):
7 File "<pyshell#1>", line 1, in <module>
8 input_A = input("Input: ")
9 File "<string>", line 1, in <module>
10 NameError: name 'abc' is not defined
11 >>> input_A = input("Input: ")
12 Input: "abc"
13 >>>
1 >>> raw_input_B = raw_input("raw_input: ")
2 raw_input: 123
3 >>> type(raw_input_B)
4 <type 'str'>
5 >>> input_B = input("input: ")
6 input: 123
7 >>> type(input_B)
8 <type 'int'>
9 >>>
例子 1 可以看到:这两个函数均能接收 字符串 ,但 raw_input() 直接读取控制台的输入(任何类型的输入它都可以接收)。而对于 input() ,它希望能够读取一个合法的 python 表达式,即你输入字符串的时候必须使用引号将它括起来,否则它会引发一个 SyntaxError 。
例子 2 可以看到:raw_input() 将所有输入作为字符串看待,返回字符串类型。而 input() 在对待纯数字输入时具有自己的特性,它返回所输入的数字的类型( int, float );同时在例子 1 知道,input() 可接受合法的 python 表达式,举例:input( 1 + 3 ) 会返回 int 型的 4 。
格式化输出%d %f等可以限制输入的类型,得到自己想要的类型。
python中while也可以使用else
count =0
while count <5:
print count," is less than 5"
count = count +1
else:
print count," is not less than 5"
file.closed 是否关闭
file.encoding 3.0以上可以open参数设置
fd.tell()
从0开始 一直到最后一个字符的后一个的位置
truncate(size) 会填充和截取到size大小 byte
truncate需要有在写模式下
w w+模式打开会清空文件内容
r r+ a a+不会
index 找不到报错
find 找不到-1
lower upper swapcase
capitalize首字母大写
index(...)
L.index(value, [start, [stop]]) -> integer -- return first index of value.
Raises ValueError if the value is not present.
>>> range(10)[::2]
seq[start:end:step]
dict.get(key,defaultvalue) //没有key的时候返回默认值
dict.has_key(key) //测试是否存在key
dict.update(dict2) 合并并更新dict
dict.popitem() 随意删除一个
cmp(dict1,dict2)
比较字典 优先级 元素个数,键大小 键值大小
第一个大 1 小-1 ==0
eclipse中
在工程中新建package与folder的区别
package自带__init__.py ,如此就可以导出
通过from package import func
先按住ctrl在点击函数可以追击到函数定义的地方。
__init__.py 其他功效
http://www.cnpythoner.com/post/2.html
print __file__ #输出当前文件路径
print __name__
#谁作为主文件被执行,谁的值就是__name__,常见用法
if __name__ == '__name__': #当前文件是主文件则执行
dosomething
print __doc__ 输出文件开始处的注释
print func__doc__ 输出函数注释
只接受''' 扩起来的注释
函数参数从左到右匹配 设置默认值的参数只能在后面
关键字参数优先匹配,剩下的从左到右依次匹配
可变参数
*args 接受列表
**kargs接受字典
def Foo(arg,*args):
pass
Foo('alex','kelly','tom')
def Foo(**kargs):
pass
Foo(k1='sb',k2='alex') #此时key不加引号
dict = {}
Foo(**dict) #如此才能调用
三目和lambda
result = 'gt' if 1>3 else 'lt'
print result
a = lambda x,y:x+y
print a(4,10)
getattr(...)
getattr(object, name[, default]) -> value
Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.
When a default argument is given, it is returned when the attribute doesn't
exist; without it, an exception is raised in that case.
getattr(x, 'y', 'default') #如果有属性y则返回x.y,否则返回default