python学习笔记

基本

所有标准对象都可以进行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
5
min = x
if x > y :
min = x
else:
min = y

while/for else:
python中while或者for循环语句后面可以跟上一个else语句,例如:

1
2
3
4
while 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
7
i = 0
while i <= 5:
if i / 2 == 0:
print "flag true"
break
else:
print "flag false"

如果不适用while else语句,需要这么写:
方法2

1
2
3
4
5
6
7
8
9
10
i = 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 连用两次for

1
2
# 3行5列的矩阵
[(x+1, y+1) for x in range(3) for y in range(6)]

4 统计文件中非空白字符长度(单词数目长度相加)

1
2
3
f = 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
7
def 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
7
def 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
2
f = 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
2
f = 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
3
with open("file.txt") as f:
for line in f:
pass