Python基础第三篇
一、collections系列
Counter是对字典类型的补充,用于追踪值的出现次数,具备字典的所有功能 + 自己的功能
1.计数器Counter
- import collections
- a='abababsbsbhh'
- c=collections.Counter(a) #直接列出每个元素出现了几次,传入列表和元组也一样
- print(c)
- #输出:Counter({'b': 5, 'a': 3, 'h': 2, 's': 2})
- #most_common 列出Counter内的前几个
- print c.most_common()
- print c.most_common(1)
- print c.most_common(3)
- '''
- 输出:
- [('b', 5), ('a', 3), ('h', 2), ('s', 2)]
- [('b', 5)]
- [('b', 5), ('a', 3), ('h', 2)]
- '''
- #update 相加
- c=collections.Counter(a)
- c1=collections.Counter(a)
- c.update(c1)
- print(c)
- #输出:Counter({'b': 10, 'a': 6, 'h': 4, 's': 4})
- #subtract 减
- aa=collections.Counter("as")
- bb=collections.Counter("htw")
- aa.subtract(bb) #c-c1
- print(aa)
- #输出:Counter({'a': 1, 's': 1, 'h': -1, 't': -1, 'w': -1})
- #elements 返回包含所有元素集合的迭代器
- for item in c.elements():
- print item
Counter
2、有序字典(orderedDict )
- import collections
- #有序字典,是对字典类型的补充,他记住了字典元素添加的顺序
- #具备字典的所有功能 + 自己的功能
- dic=collections.OrderedDict() #定义有序字典
- dic["a1"]=1
- dic["a2"]=2
- dic["a3"]=3
- di={}
- di["a1"]=1
- di["a2"]=2
- di["a3"]=3
- print(dic)
- print(di)
- #输出:
- # OrderedDict([('a1', 1), ('a2', 2), ('a3', 3)]) #有序
- #{'a1': 1, 'a3': 3, 'a2': 2} #无序
3、默认字典(defaultdict)
- import collections
- #默认字典
- #defaultdict 是对字典的类型的补充,他默认给字典的值设置了一个类型。
- dic=collections.defaultdict(list) #默认字典的value,也可以是元组(tuple)或字典(dict)
- #相当于
- dic={}
- dic["k1"]=[]
4、可命名元组
- #tupled的扩展
- #可命名元组
- import collections
- t=(1,2)
- #创建一个扩展tuple的类,Mytuple
- Mytuple=collections.namedtuple('Mytuple',['x','y'])
- tu=Mytuple(1,2) #相当于给原来的值赋了一个key
- print(t)
- print(tu)
- print tu.x,tu.y
- '''
- 输出:
- (1, 2)
- Mytuple(x=1, y=2)
- 1 2
- '''
5、双向队列、单向队列
- #双向队列,两头都可以取可以插
- #线程安全
- import collections
- q=collections.deque() #创建队列
- q.append(1)
- q.append(2)
- q.append(3)
- print(q)
- #单向队列,一个方向拿
- #线程安全
- import Queue
- q=Queue.Queue(10) #创建队列,指定最多放10个数据
- q.put(1) #进
- q.put(2)
- q.put(3)
- print q.get() #取
- print q.get()
- '''
- 队列和栈的结构:
- 队列:先进先出
- 栈:弹夹,后加先出
- '''
二、迭代器和生成器
1.迭代器
- '''
- 只能通过循环从迭代器里拿数据
- next方法:返回迭代器的下一个元素
- __iter__方法:返回迭代器
- '''
- i=iter(range(3)) #使用内建的iter方法创建迭代器
- print i.next()
- print i.next() #next()方法可以访问下一个元素
- print i.next()
- print i.next() #python处理迭代器越界抛出StopIteration异常
- '''
- 输出:
- 0
- 1
- 2
- Traceback (most recent call last):
- File "E:/index.py", line 82, in <module>
- print i.next()
- StopIteration
- '''
- #在for循环中,Python将自动调用iter()函数获得迭代器,自动调用next()获取元素,自动完成检查StopIteration异常的工作
迭代器
2.生成器
- #生成器(生成器只有使用时才创建,从而避免内存浪费)
- '''
- range不是生成器 和 xrange 是生成器
- readlines不是生成器 和 xreadlines 是生成器
- '''
- for i in range(100): #返回100个元素的列表
- print(i)
- for i in xrange(100):#每次迭代中返回一个元素
- print(i)
- #带有 yield 的函数在 Python 中被称之为 generator(生成器)
- #yield 记住上一次的操作,下次在执行时继续执行
- def aaa(arg):
- seed = 0
- while True:
- seed=seed+1
- if seed > arg:
- return
- else:
- yield seed #每次经过yield都会返回到print输出i,然后回到原来位置继续执行
- for i in aaa(10):
- print i
生成器
冒泡算法
- #练习
- #下标式循环
- '''
- 有列表li=[13, 22, 6, 99, 11]
- 按照以下规则计算:
- 13 和 22 比较,将大的值放在右侧,即:[13, 22, 6, 99, 11]
- 22 和 6 比较,将大的值放在右侧,即:[13, 6, 22, 99, 11]
- 22 和 99 比较,将大的值放在右侧,即:[13, 6, 22, 99, 11]
- 99 和 11 比较,将大的值放在右侧,即:[13, 6, 22, 11, 99,]
- 13 和 6 比较,将大的值放在右侧,即:[6, 13, 22, 11, 99,]
- '''
- #冒泡算法 依次用下标对应的两个数字进行比较,大的放右边,从而进行排列
- li=[13, 22, 6, 99, 11]
- aa=(len(li)-1)
- while aa>0:
- for m in range(aa):
- if li[m]>li[m+1]:
- temp=li[m]
- li[m]=li[m+1]
- li[m+1]=temp
- aa=aa-1
- print(li)
- #输出:[6, 11, 13, 22, 99]
三、函数
1.内置函数
常用内置函数
- #常用内置函数
- '''
- 基础
- help()
- dir() 不带参数时,返回当前范围内的变量、方法和定义的类型列表,带参数时,返回参数的属性、方法列表
- print vars() 当前模块的所有变量
- type()
- reload(temp) 真正的在导入一次一个模块
- id()
- is()
- range 产生一个序列,默认从0开始
- xrange
- 类型转换
- int()
- long()
- float()
- complex()
- str()
- list()
- tuple()
- 计算
- cmp(x,y) x<y返回-1 x==y返回0 x>y返回1
- abs()
- boll()
- divmod() #分别取商和余数
- max()
- min()
- sum()
- pow(x,y) 返回x的y次幂
- len() 长度
- all() 接受一个序列,如果所有都是真返回真,否则返回假
- any() 接受一个序列,只要有一个真就是真
- eval(dic) 把传入的字符串转换成字典
- assic码转换
- chr() 接收数字返回字符
- ord() 接收字符返回数字
- 进制转换
- hex() 10转16
- oct() 10转8
- bin() 10转2
- #enumerate
- 自动生成一列数字对应列表里的值,从0开始
- li=[11,22,33,44]
- for k,v in enumerate(li,1):#从1开始
- print(k,v)
- 输出:
- (1, 11)
- (2, 22)
- (3, 33)
- (4, 44)
- '''
isinstance
isinstance:判断一个对象是不是某个类的实例,这个类可以是创建该对象的类,也可以是创建该对象的类的基类
在python中,判断对象类型的方法有两种,type和isinstance
- a=2
- print(isinstance(a,int)) #Ture
- print(isinstance(a,str)) #False
- print(type(a)==int) #Ture
- print(isinstance(a,str)) #False
(2)isinstance还能判断一个对象是不是某个类的实例
- class test:
- pass
- class AA(test):
- pass
- class BB:
- pass
- obj=AA()
- #判断obj对象是不是AA类的实例
- print(isinstance(obj,AA)) #Ture
- print(isinstance(obj,BB)) #False
- #判断obj对象是不是test类的实例
- print(isinstance(obj,test)) #Ture
issubclass
issubclass:判断一个类是不是另一个类的派生类
- class test:
- pass
- class AA(test):
- pass
- class BB:
- pass
- #判断AA是不是test的派生类
- print(issubclass(AA,test)) #True
- #判断BB是不是test的派生类
- print(issubclass(BB,test)) #False
map遍历序列
- #map遍历序列,对序列中每个元素进行操作,最终获得新的序列
- li=[11,22,33,44]
- li1=[1,2,3,4]
- def func(arg):
- return arg+10
- print map(func,li)
- #输出:[21, 32, 43, 54]
- def func1(a1,a2):
- return a1+a2
- print map(func1,li,li1)
- #输出:[12, 24, 36, 48]
- print map(lambda a1,a2:a1+a2,li,li1) #lambda一句实现
- #输出:[12, 24, 36, 48]
map
filter筛选
- #filter 筛选
- li=[11,22,33,44,"",False,True,0]
- print filter(None,li) #传入None,返回是True的序列
- #输出:[11, 22, 33, 44, True]
- li1=[11,22,33,44,55,66]
- print filter(lambda a:a>22,li1)#返回是True的序列
- #输出:[33, 44, 55, 66]
filter
reduce累积
- #reduce 累积操作
- li=[1,2,3,4,5,6]
- print reduce(lambda a1,a2:a1+a2,li)
- #输出:21 就是((((1+2)+3)+4)+5)+6
- #print reduce(lambda a1,a2:a1+a2,li,xxx)#累加 最后还可以加参数作为初始值
- print reduce(lambda a1,a2:a1*a2,li)#来乘
- #输出:720
reduce
每个文件模块自己的变量
- #__file__
- print __file__ #当前文件路径
- #__doc__
- import index
- print index.__doc__ #index是模块名,可查看一个文件模块的顶部注释
- #__name__ 用来判断是不是程序的主文件
- #当主程序执行时__name__="__main__"
- if __name__=="__main__":
- pass
2.自定义函数
def
函数名(参数):
函数体
- #接受多个参数,内部自动构造元组
- #传入序列要加*,避免内部构造元组
- li=[11,22,33]
- def func(*args):
- print(args)
- func(li) #把传的列表当成元组的元素
- func(*li) #加*把传的列表内的每个元素当成元组的元素
- #输出:
- #([11, 22, 33],)
- #(11, 22, 33)
动态参数二:**kwargs
- #构造字典(两*)
- dic={"a":1,"b":2}
- def func1(**kwargs):
- print(kwargs)
- func1(a=11)
- func1(**dic)
- #输出:
- #{'a': 11}
- #{'a': 1, 'b': 2}
结合上面两种:
- def func2(*args,**kwargs):
- print(args)
- print(kwargs)
- func2(1,2,3,a=1,b=2)
- #输出:
- #(1, 2, 3)
- #{'a': 1, 'b': 2}
四、文件操作
1.打开文件
文件句柄
=
file
(
'文件路径'
,
'模式'
)
模式:
- '''
- r 只读模式
- w 只写模式(不可读,不存在则创建,存在则删除内容)
- a 追加模式(可读,不存在则创建,存在则只追加内容)
- "+" 表示可以同时读写某个文件
- r+ 可读写文件(可读,可写,可追加)
- w+ 写读
- a+ 同a
- rU 表示在读取时,可以将 \r \n \r\n自动转换成 \n (只能与r或r+模式一起使用)
- "b" 表示处理二进制文件
- rb 以2进制方式去读取文件
- wb
- ab
- '''
2.操作文件
- '''
- close() 关闭文件
- fileno() 文件描述符
- flush() 刷新文件内部缓冲区
- isatty() 判断文件是否是同意tty设备
- next() 获取下一行数据,不存在,则报错
- read() 读取指定字节数据
- readline() 仅读取一行数据
- readlines() 读取所有数据,并根据换行保存到列表
- xreadlines()可用于逐行读取文件,非全部
- seek() 指定文件中指针位置
- tell() 获取当前指针位置
- truncate() 截断指针后面的内容只留前面的
- write() 写
- writelines()将一个字符串列表写入文件
- '''
with
为了避免打开文件后忘记关闭,当with代码块执行完毕时,内部会自动关闭并释放文件资源
- with open('','r') as obj:
- obj.read()
Python 2.7后with还支持多个文件管理
- with open('','r') as obj1,open('') as obj2:
- pass
五、lambda 表达式
lambda和三元运算类似,是为了简化函数,不过只能用于处理简单函数,并且能自动return
- #正常函数
- def lam1(arg):
- return arg+1
- print lam1(10)
- #lambda表达式
- lam2=lambda arg:arg+1#(lam2等于上面的函数名,arg等于上面的参数)
- print lam2(10)
- lam3=lambda a,b:a+b
- print lam3(2,3)
六、递归
1、递归:在运行的过程中调用自己就叫做递归
下面举个最典型的递归案例:斐波纳契数列(1、1、2、3、5、8、13、21.....)
- #用递归实现
- def func(arg1,arg2):
- if arg1 == 0:
- print(arg1)
- print(arg2)
- arg3=arg1+arg2
- print(arg3)
- if arg3>1000:
- return
- func(arg2,arg3) #在函数内部调用自身
- func(0,1)
上面的代码可以实现斐波纳契数列的输出
2、递归的返回值
- #递归的返回值
- def func(arg1,arg2):
- if arg1 == 0:
- print(arg1)
- print(arg2)
- arg3=arg1+arg2
- if arg3>1000:
- return arg3 #返回值
- func(arg2,arg3)
- result=func(0,1)
- print(result) #输出:None
上面代码可以看到,输出的是None,是因为函数第一次执行时的返回值才是result,当函数一直被调用时,return arg3 的返回值是返回给了他上一次
调用的函数func(arg2,arg3),以此往前推
如果代码如下:递归函数就能返回最后一次的返回值
- def func(arg1,arg2):
- if arg1 == 0:
- print(arg1)
- print(arg2)
- arg3=arg1+arg2
- if arg3>1000:
- return arg3
- ret=func(arg2,arg3) #把内部调用的函数的返回值赋值给ret
- return ret
- result=func(0,1)
- print(result) #输出:1597
Python基础第三篇的更多相关文章
- python基础-第三篇-函数编程
基本数据类型之set set是无序不允许重复的集合 set创建:s = set() 创建空集合 s = {11,22,33} 转换s = set(可迭代数据) li = [11,22,33,44] ...
- Python 基础语法(三)
Python 基础语法(三) --------------------------------------------接 Python 基础语法(二)------------------------- ...
- NHibernate 映射基础(第三篇) 简单映射、联合主键
NHibernate 映射基础(第三篇) 简单映射.联合主键 NHibernate完全靠配置文件获取其所需的一切信息,其中映射文件,是其获取数据库与C#程序关系的所有信息来源. 一.简单映射 下面先来 ...
- Python基础知识(三)
Python基础知识(三) 一丶整型 #二进制转成十进制的方法 # 128 64 32 16 8 4 2 1 1 1 1 1 1 1 例如数字5 : 101 #十进制转成二进制的方法 递归除取余数,从 ...
- Python基础学习三
Python基础学习三 1.列表与元组 len()函数:可以获取列表的元素个数. append()函数:用于在列表的最后添加元素. sort()函数:用于排序元素 insert()函数:用于在指定位置 ...
- python数据挖掘第三篇-垃圾短信文本分类
数据挖掘第三篇-文本分类 文本分类总体上包括8个步骤.数据探索分析->数据抽取->文本预处理->分词->去除停用词->文本向量化表示->分类器->模型评估.重 ...
- Python基础【第一篇】
一.Python简介 Python的创始人(Guido von Rossum 荷兰人),Guido希望有一种语言既能像C一样方便地调用操作系统的功能接口,也能像shell脚本一样,轻松地实现编程,A ...
- Python 基础学习 总结篇
Python 基础学习总结 先附上所有的章节: Python学习(一)安装.环境配置及IDE推荐 Python学习(二)Python 简介 Python学习(三)流程控制 Python学习(四)数据结 ...
- python基础-第六篇-6.2模块
python之强大,就是因为它其提供的模块全面,模块的知识点不仅多,而且零散---一个字!错综复杂 没办法,二八原则抓重点咯!只要抓住那些以后常用开发的方法就可以了,哪些是常用的?往下看--找答案~ ...
随机推荐
- windows自带的压缩,解压缩命令
压缩一个文件: makecab c:\ls.exe ls.zip 解压一个文件: expand c:\ls.zip c:\ls.exe
- php有效的过滤html标签,js代码,css样式标签
过滤html标签�php中太简单了,我们可以直接使用strip_tags函数来实现了,下面给各位整理了一些关于 strip_tags函数的例子. php过滤html的函数:strip_tags(str ...
- 《JAVA开发环境的熟悉》实验报告——20145337
- Exception在方法继承中的限制
问题: 父类或接口中定义了方法应该抛出的异常,那么当子类重写方法时应该怎样定义将要抛出的异常: 首先定义异常和父类: class Exception1 extends Exception {} cla ...
- 【iCore3 双核心板】例程二十九:SD_IAP_FPGA实验——更新升级FPGA
实验指导书及代码包下载: http://pan.baidu.com/s/1o7h158m iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...
- SVN 分支管理
平时在工作中使用 SVN 只是限于 commit,update 这样的操作,至多再 reslove 解决一下冲突,没有用过分支管理.开发过程中一般都是一个功能开发完成之后整体进行提交,而最近在项目中有 ...
- 如何使用Jquery自定义命名空间namespace
// 把生成命名空间的方法绑定在jQuery上 jQuery.namespace = function () { var a = arguments, o = null, i, j, d; for ( ...
- 并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法
在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列(先进先出).Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQ ...
- gogo
Qixoe019uip netstat -apn|grep 808*cd /data/pkg/super-car-store./start 端口 jar包名 //是否查询连锁店数据 if(chainC ...
- oracle从零开始学习笔记 二
多表查询 等值连接(Equijoin) select ename,empno,sal,emp.deptno from emp,dept where dept.deptno=emp.deptno; 非等 ...