python学习笔记(三)
一、练习
练习:元素分类有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。即: {'k1': 大于66 , 'k2': 小于66}1 a = [11,22,33,44,55,66,77,88,99,90] 2 tmp={} 3 for b in a: 4 if b<66: 5 if 'k1' in tmp.keys(): 6 tmp['k1'].append(b) 7 else: 8 tmp['k1']=[b,] 9 elif b>66: 10 if 'k2' in tmp.keys(): 11 tmp['k2'].append(b) 12 else : 13 tmp['k2']=[b,] 14 else : 15 continue 16 print tmp
也可以这样实现:
1 from collections import defaultdict 2 values=[11,22,33,44,55,6,67,8,9,65,66,88] 3 my_dict=defaultdict(list) 4 for value in values: 5 if value<66: 6 my_dict['k1'].append(value) 7 else: 8 my_dict['k2'].append(value) 9 print my_dict
2、文件读取变字典
1 axe|123|1 2 eric|456|1 3 tom|789|1 4 ==> 5 {'axe':['123','1'],'eric':['456','1'],'tom':['789','1']} 6 tmp={} 7 f=file('e:\est.txt','r') 8 list_line=f.readlines() 9 for list in list_line: 10 line_list=list.strip().split('|') 11 tmp[line_list[0]]=line_list[1:] 12 print tmp
二 collection
作用:内置数据类型比如str, int, list, tuple, dict等的扩展数据类型。
1、计数器(Counter ——注意C大写)
作用:主要用来计数, Counter是对字典类型的补充,用于追踪值的出现次数。
示例:
1 >>> import collections 2 >>> print collections.Counter('asdfadfasdffdfsadfadsfasd') 3 Counter({'d': 7, 'f': 7, 'a': 6, 's': 5}) 4 >>> print collections.Counter(['a','ab','abc'] ) 5 Counter({'a': 1, 'ab': 1, 'abc': 1})
2、 有序字典(OrderedDict ——字母O和D要大写 )
作用:orderedDict是对字典类型的补充,记住了字典的添加顺序。
示例:
1 >>> dic={1:'a',3:'c',2:'b'} 2 >>> print collections.OrderedDict(dic) 3 OrderedDict([(1, 'a'), (2, 'b'), (3, 'c')]) #处理完的结果是字典。
3、默认字典(defaultdict)
作用:对字典类型的补充,给字典的value设定一个默认类型。
示例:
接上面的练习--刚才是创建一个value是列表的方式,现在创建一个默认的字典,value是list,直接追加就ok。
有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。
即: {'k1': 大于66 , 'k2': 小于66}
代码:
1 from collections import defaultdict 2 values=[11,22,33,44,55,6,67,8,9,65,66,88] 3 my_dict=defaultdict(list) 4 for value in values: 5 if value<66: 6 my_dict['k1'].append(value) 7 else: 8 my_dict['k2'].append(value) 9 print my_dict
4、可命名元组(namedtuple)
作用:主要用于坐标
示例:
1 import collections 2 mtuple=collections.namedtuple('mtuple',['x','y','z']) 3 nes=mtuple(1,2,3) 4 print nes 5 {'x':1,'y':2,'z':3}
5、双向队列(deque)
与Queue.Queue的区别:Qqueue是单向队列,先进先出,deque是双向队列,线程安全。
Queue示例:
1 import Queue 2 q = Queue.Queue(10) #最多放10个 3 q.put(1) 4 q.put(12) 5 q.put(123) 6 print q.get() #1 7 print q.get() #12 8 print q.get() #123
deque示例:
1 import collections 2 q = collections.deque() 3 q.append(1) 4 q.append(2) 5 q.append(33) 6 7 print q.count(2) 8 print q.popleft() 9 print q
三 迭代器和生成器
1、迭代器(Iterator )
可迭代对象:Iterable
str、list、dict都是可迭代对象,但不是迭代器;
from collections import Iterable
print isinstance([],Iterable)
True
迭代器:Iterator
from collections import Iterator
print isinstance([],Iterator)
False
但是可以把'可迭代对象'(Iterable)转换用iter()转换为'迭代器'(Iterator)
print isinstance(iter([]),Iterator)
True
迭代器表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。
2、生成器( generator )
按照某种算法推算出来,可以在循环的过程中不断推算出后续的元素,这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
1 >>> g = (x * x for x in range(10)) 2 >>> g 3 <generator object <genexpr> at 0x00000000020256C0> 4 >>> next(g) -->0 5 >>> next(g) -->1 6 >>> next(g) -->4 7 generator也是可迭代对象(Iterable),用for循环也可以;
如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator;
generator--yield--next()--StopIteration
四 内置函数(分类统计重点几个)
1、参数获取
|
help( object )
|
获取帮助
|
help(str.replace)
|
|
dir( object )
|
返回参数的属性、方法列表。
|
dir(list)
|
|
vars( object )
|
返回对象的所有变量,包括自定义的变量,都会显示出来
|
'__doc__': None #获取注释信息
'__name__': '__main__' #是否是主模块
'__file__': #文件路径
|
|
type( object )
|
返回对象类型
|
>>>type(my_dict)
<type 'dict'>
|
|
reload(temp)
|
重新加载模块
|
import后模块改变,重载时使用
|
|
id( object )
|
返回对象的唯一标识 (内存映射)
|
>>>id([12])
36372552L
|
|
is
|
返回bool值 |
>>> a is t
False
|
2、数学运算
|
abs(x)
|
求绝对值
|
abs(-9)
|
| cmp(x,y) | 比较大小 |
cmp(2,3)
|
|
bool(([x])
|
将x转换为Boolean类型
|
>>> bool(0) -->False
>>> bool(1) -->True
|
|
divmod(x,y)
|
取商和余数
|
divmod(10,3)
|
|
max( iterable[, args...][key] )
|
返回集合中的最大值
|
列表啥的都正常显示最大值,但集合只能显示key的最大值;
|
|
min(iterable[, args...][key])
|
返回集合中的最小值
|
列表啥的都正常显示最小值,但集合只能显示key的最小值;
|
|
sum(iterable[, start])
|
对集合求和
|
+
|
|
pow(x, y[, z])
|
返回x的y次幂
|
pow(2, 11) --->2048
|
3、逻辑判断
|
len()
|
返回序列长度
|
>>>len([1,2,3,4]) -->4
|
|
all(iterable)
|
1、集合中的元素都为真的时候为真
2、特别的,若为空串返回为True
|
li=[1,'abc','']
>>>all(li) ----->False #因为有空字符串
|
|
any(iterable)
|
1、集合中的元素有一个为真的时候为真
2、特别的,若为空串返回为False
|
|
|
cmp(x, y)
|
如果x < y ,返回负数;x == y, 返回0;x > y,返回正数
|
>>> cmp(1,2) -->-1
>>> cmp(1,1) -->0
>>> cmp(3,2) -->1
|
4、进制转换
|
chr(i)
|
输入数字返回字符
chr()函数返回ASCII码对应的字符串。
|
>>> chr(90) --->'Z'
|
|
ord(x)
|
输入字符返回数字
ord()函数返回一个字符串参数的ASCII码或Unicode值。
|
>>> ord('a') ---->97
|
|
hex(x)
|
hex()函数可把整数转换成十六进制数
|
>>> hex(10)
'0xa'
|
|
oct(x)
|
oct()函数可把给出的整数转换成八进制数
|
>>> oct(10)
'012'
|
|
bin(x)
|
将整数x转换为二进制字符串
|
>>> bin(10)
'0b1010'
|
5、range和xrange
|
range([lower,]stop[,step])
|
range()函数可按参数生成连续的有序整数列表
|
>>> range(10) |
|
xrange([lower,]stop[,step])
|
xrange()函数与range()类似,但xrnage()并不创建列表,而是返回一个xrange对象,它的行为
与列表相似,但是只在需要时才计算列表值,当列表很大时,这个特性能为我们节省内存.
|
>>> a=xrange(10) 1
|
6、enumerate()
enumerate(sequence [, start = 0])
返回下标和参数,后面那个可以指定起始值,默认是从0开始。
例:
1 li=['a','b','c'] 2 for k,v in enumerate(li,1): 3 print k,v 4 1 a 5 2 b 6 3 c
7、map
map(),对所有值进行一个处理;
filter(),对值进行过滤;
groupby(),对值进行分组;
reduce(),计算。
学完函数再回来看。
五 文件操作
在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文 件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。
1、操作模式
|
r
|
(默认)只读模式
|
|
r+
|
读写,可读,可写,可追加 |
|
w
|
写模式,有此文件清空,无则创建
|
|
a
|
追加模式,(不管光标定位到什么地方,追加的时候总是到最后) |
|
w+、a+
|
无意义
|
|
rU
|
U代表可以将任意换行符都转换成'\n' |
|
rb\wb\ab
|
"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)
|
2、with用法
为了避免打开文件后忘记关闭,可以通过管理上下文;当with代码块执行完毕时,内部会自动关闭并释放文件资源。
1 with open('/path/to/file', 'r') as f:
2 print(f.read())
也可以同时创建多个文件描述符:
1 with open('log1') as obj1, open('log2') as obj2:
2 pass
六 自定义函数
1、定义函数
在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回。
def 函数名(参数):
……
函数体
……
def:表示函数的关键字
函数名:函数的名称,日后根据函数名调用函数
函数体:函数中进行一系列的逻辑计算,如:发送邮件、计算出 [11,22,38,888,2]中的最大数等...
参数:为函数体提供数据
函数名:函数的名称,日后根据函数名调用函数
函数体:函数中进行一系列的逻辑计算,如:发送邮件、计算出 [11,22,38,888,2]中的最大数等...
参数:为函数体提供数据
返回值:当函数执行完毕后,可以给调用者返回数据。
2、函数返回值
函数体内部可以用return随时返回函数结果;
函数执行完毕也没有return语句时,自动return None。
函数是一个功能块,该功能到底执行成功与否,需要通过返回值来告知调用者。
函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕,并将结果返回。因此,函数内部通过条件判断和循环可以实现非常复杂的逻辑。
如果没有return语句,函数执行完毕后也会返回结果,只是结果为None。return None可以简写为return。
3、函数的参数:
①普通参数
函数定义的叫形参,执行时传入的是实参。
②默认参数
必选参数在前,默认参数在后
③动态参数
传入多个数值
可变参数:*nums表示把nums这个list的所有元素作为可变参数传进去。
关键字参数:**nums 函数的调用者可以传入任意不受限制的关键字参数。
例:
1 def person(name, age, **kw): print('name:', name, 'age:', age, 'other:', kw)
函数person除了必选参数name和age外,还接受关键字参数kw。在调用该函数时,可以只传入必选参数;
注意:
*args是可变参数,args接收的是一个tuple;**kw是关键字参数,kw接收的是一个dict。 ④参数组合
在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用,除了可变参数无法和命名关键字参数混合。但是请注意,参数定义的顺序必须是: 必选参数、默认参数、可变参数/命名关键字参数和关键字参数。
1 def f1(a, b, c=0, *args, **kw): 2 print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)

浙公网安备 33010602011771号