基本
所有标准对象都可以进行bool判断,以下项的bool判断结果都为false:None,false,值为0的数,0,所有的浮点数,空字符串"",[],{},()
python的文件名不能和导入的模块名字相同,否则会报如下错误:1
AttributeError: 'module' object has no attribute 'xxxx'
内建函数
- type(obj):
返回一个对象的类型 - cmp(obj1,obj2):
比较两个对象的大小,返回值为:1、0、-1(默认调用对象的cmp()方法) str(obj)
返回对象的可读性较高的字符串值,更适合人阅读(用于print)repr(obj)
返回对象的字符串值,符合解释器语法,可以使用evel方法返回原始对象isinstance(obj1,(type1,type2,…))
判断一个对象是否是某种类型
数字类型
标准整型
类似于C语言中的32位和64位有符号整型。长整形
python支持的长整形的长度不受机器位数的限制,只受虚拟内存的限制,因此python可以表示很大很大的数。只需要在数字后面加上L(大小写皆可)即可。支持十进制、八进制、十六进制。双精度浮点数
类似于c语言中的double
可变对象和不可变对象
python中的不可变对象包括三类:数字、字符串和元组
可变对象有:列表,dict
深拷贝与浅拷贝
浅拷贝会创建新对象,其内容是原对象的引用
序列类型对象默认使用浅拷贝(对于不可见类型,使用深拷贝),方法包括:完全切片([:]),工厂函数(list,tuple,dict),copy模块的copy函数
对于非容器类型,不存在浅拷贝的概念,产生的都是原对象的引用。如果元组变量值包含原子类型对象,即使采用了深拷贝,也只能得到浅拷贝
浅拷贝只能做顶层复制,但是不能复制其嵌套的数据结构。例如,假设一个列表l包含了另外一个列表ll,则浅拷贝拷贝的是ll的引用,对ll的更改也会改变l。
字典
dict的key不可更改,且必须是可hash的(所有不可变对象都是可hash的,少部分可变对象是可hash的,例如实现了hash()的自定义类),数字、字符串都可以作为key,列表、字典不可以作为key。元组的所有元素都是数字或者字符串时才可以作为key。不可变集合可以作为key
集合
集合对象是一组可hash的元素。
只能通过工厂方法set()或者frozenset()方法创建集合
条件与循环
python三元运算符:min = x if x > y else y
等价于:1
2
3
4
5min = x
if x > y :
min = x
else:
min = y
while/for else:
python中while或者for循环语句后面可以跟上一个else语句,例如:1
2
3
4while condition1:
func1()
else:
func2()
如果while语句中没有return、break语句,则while else这种语句和if else没有区别。while else语句的作用是在while中带有break,return语句时,else不会执行。只有在while正常结束才会执行else语句。举例:
判断一串数字是否存在可以被2整除的数字:
方法1:1
2
3
4
5
6
7i = 0
while i <= 5:
if i / 2 == 0:
print "flag true"
break
else:
print "flag false"
如果不适用while else语句,需要这么写:
方法21
2
3
4
5
6
7
8
9
10i = 0
flag = false
while i <= 5:
if i / 2 == 0:
flag = true
print flag true"
break;
if flag == True:
print "flat true"
第一种语法更加符合python风格,更加简明。
列表解析
1 简单形式1
2[(x ** 2) for x in range(3)]
0, 1,4,9
2 带if语句的形式1
2
3#取序列中的奇数
seq = [7,3,1,2,9,4]
[x for x in seq if x % 2]
3 连用两次for1
2# 3行5列的矩阵
[(x+1, y+1) for x in range(3) for y in range(6)]
4 统计文件中非空白字符长度(单词数目长度相加)1
2
3f = open('file.txt', 'r')
sum(len([word for line in f for word in line.split()]))
# 缺点是需要生成一个包长度为单词个数的列表,如果单词数目很多,则会很占用内存
生成器
相对于列表解析,生成器表达式更加高效,因为生成器表达式并不真正生成列表,而是采用延迟计算,返回一个表达式,每次返回计算的一个结果。
两者的区别:
- 列表解析 返回的是一个完整的列表,如果对一个包含100万个元素的序列使用列表解析式,将得到一个包含100万的元素的列表。
- 生成器表达式,返回的是一个计算方法,每调用一次next方法才会返回一个值。占用很少的内内存
生成器创建方法:
1)列表解析式方法
只需要将”[]”更改为”()”即可。例如:(x *2 for x in range(5))
2)使用yield定义生成器
例如,返回斐波那契数列函数定义如下:1
2
3
4
5
6
7def fib(n):
a ,b = 0, 1
i = 0
while(i < n):
print b
a, b = b, a+b
i += 1
对应的生成器定义为:1
2
3
4
5
6
7def fib(n):
a ,b = 0, 1
i = 0
while(i < n):
yield b #注意这里
a, b = b, a+b
i += 1
生成器的原理:1
生成器利用yield关键字,每次执行netxt()函数时返回yield的值(可以把yeild当做return),与return不一样的地方是,之后生成器会被冻结,yield之后下一行要执行的的所有代码,所有的变量值都会保存起来,下次调用next()时,从上次执行到的地方发继续执行。
列表生成器计算文件中非空白字符的长度:1
2f = open("file.txt", 'r')
sum(len(word) for line in f for word in line.split())
找到一个文件中长度最长的行的长度1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24# 普通方式
f = open('file.txt','r')
longest = 0
alllines = f.readlines()#读取所有的行
for line in alllines:
linelen = len(line)
if linelen > longest:
longest = linlen
return longest
# 列表解析方式
f = open('file.txt','r')
alllineLen = [len(line) for line in f]#读取所有的行
f.close()
return max(alllineLen)
# 列表生成器方式
f = open('file.txt','r')
longest = max(len(line) for line in f)
f.close()
return longest
# 最优版本
return max(len(x) for x in open("file.txt"))
文件
不同平台换行符:
windows|unix|mac
-|-|-
\r\n | \n | \r
为了支持不同平台的换行符,python打开文件时支持使用U模式,即通用换行符模式(只在r或者a模式时)1
2f = open("file", "rU")
f = open("file", "aU")
打开文件方式介绍
方式|介绍
-|-
+|可读可写
r|只读,若文件不存在则引发异常IOError: [Errno 2] No such file or directory
r+|读写,若文件不存在则引发异常IOError: [Errno 2] No such file or directory
w|只写,若文件存在则清空,若文件不存在则创建该文件
w+|可读可写,若文件不存在则创建该文件
a|追加方式,不可读,若文件不存在则创建该文件
异常
with语句:
屏蔽了try exception,异常的捕获交由python解释器来做,程序员只需要关注功能的实现。1
2
3with open("file.txt") as f:
for line in f:
pass