这是我学习python的第一本书中的笔记。
这本书名叫《Python编程入门》,[加]Toby Donaldson 著,袁国忠 译
python适用于
脚本
网站开发 Django,Bottle,Zope www.reddit.com
文本处理
科学计算
教育
整数算数
加 +
减 -
乘 *
除 /
乘方 **
求余 %
整除 //
10^-6 e-06
复数 1j = -1的开根号
数学函数 math
导入模块
>>>import math
另一种导入模块的方式
>>>from math import *
log(25+5)
模块math中的一些函数
ceil(x) 大于或等于x的整数
cos(x) x的余弦
degrees(x) 将x弧度转换为度数
exp(x) e的x次方
factorial(x) n!
log(x) 以e为底的x的对数
log(x,b) 以b为底的x的对数
pow(x,y) x的y次方
radians(x) 将x度转换为弧度数
sin(x) x的正弦
sqrt(x) x的平方根
tan(x) x的正切
标识字符串--单引号,双引号,三引号
字符串长度 len(s)
字符串拼接 'aa' + 'bb' = 'aabb'
10 * ‘he’
列出模块中的函数
>>>import math
>>>dir(math)
打印文档字符串
>>>print(math.tanh.__doc__)
>>>print(bin.__doc__)
float(3) = 3.0
float('3.2' ) = 3.2
str(85) = '85'
int(8.64) = 8
int('5') = 5
赋值
x = expr
多重赋值
x,y,z = 1,'two',3.0
变换变量的值
a , b = b , a
在IDLE中编程
windows中Notepad++
从建盘中读取数据
#name.py
name = input('what is your first name')
print('hello' + name.capitalize() + '!')
>>>print('I' , ‘love’ , 'you')
I love you
默认空格分离
>>>print(‘I’ , 'love' , 'you' , sep = '.')
I.love.you
默认print完后加\n.
#jack1.py
print('jack ate')
print('no fat')
#jack2.py
print('jack ate' , end = ' ')
print('no fat')
源代码注释 #
程序的组织
输入-->处理-->输出
布尔逻辑
布尔真 True
布尔假 False
逻辑相等 ==
逻辑与 and
逻辑或 or
逻辑非 not
布尔运算的优先级(按从高到低的顺序排列)
p==q
p != q
not p
p and q
p or q
短路求值
p or q --> 如果p为False,结果为q,否则结果为p
p and q --> 如果p为False,结果为p,否则结果为q
if/else语句
if 条件: ...
else : ...
条件表达式-->if语句的简写
food = input("Waht's your favorate food?")
reply = 'yuck' if food == 'lamb' else 'yum'
for循环
#count10.py
for i in range(10) : -->太极1---从0开始
print(i)
for i in range(5 , 10) : -->从5到9
print(i)
for i in range(10 , 0 , -1) :
print(i)
-1是步长
while循环
#while10.py
i = 0
while i < 10 :
print(i)
i = i + 1
跳出循环的语句块 break
continue也有,不适用
循环中的循环-->嵌套循环
for ...
for ...
...
定义函数
#area.py
def area(radius) :
return math.pi * radius ** 2
python中同样包含全局变量和局部变量。
默认值
#greeting.py
def greet(name , greeting = 'hello') :
print(greeting , name + '!')
模块是一系列相关的函数和变量。
#shapes.py
要使用模块,只需要导出他就行
>>>import shapes
>>>from shapes import *
字符串索引
>>>s = 'apple'
>>>s[0]
'a'
复数索引
>>>s = 'apple'
>>>s[-1]
'e'
ord('a') = 97 --> 'a'的ASCII码
一些常见的转义字符
字符 含义
\\ 反斜杠
\' 单引号
\" 双引号
\n 换行符
\r 回车
\t 水平制表符
>>>len('\\')
1
字符串切片
s[begin : end] 返回从索引begin到end-1的子串。
获取切片的捷径
>>>food = 'apple pie'
>>>food[:5]
'apple'
>>>food[6:]
'pie'
>>>food[:]
'apple pie'
下面是一个很有用的切片示例,这个函数返回文件中的扩展名:
#extension.py
def get_next(fname) :
"""returns the extension of file fname."""
dot = fname.rfind('.')
if dot == -1 :
return ''
else :
return fname[dot+1:]
>>>get next(‘hello.text’)
'text'
字符串测试函数
函数名 什么情况下返回True
s.endswith(t) s以字符串t结尾
s.startswith(t) s以字符串t打头
s.isalnum() s只包含字母或数字
s.isalpha() s只包含字母
s.isdecimal() s只包含表示十进制数的字母
s.isdigit() s只包含数字字符
s.isidentifier() s是合法的标识符
s.islower() s只包含小写字母
s.isnumeric() s只包含数字
s.isprintable() s只包含可打印字符
s.isspace() s只包含空白字符
s.istitle() s是一个大小写符合头衔要求(title-case)的字符串
s.isupper() s只包含大写字母
t in s s包含字符串t
字符串搜索函数
函数名 返回值
s.find(t) 如果没有找到子串t,则返回-1;否则返回t在s中的起始位置
s.rfind(t) 与find相同,但从右往左搜索
s.index(t) 与find相同,但如果在s中找不到t,则引发ValueError异常
s.rindex(t) 与index相同,但从右往左搜索
改变大小写的函数
函数名 返回的字符串
s.capitalize() 将s[0]改为大写
s.lower() 让s的所有字母都小写
s.upper() 让s的所有字母都大写
s.swapcase() 将小写字母改为大写,并将大写字母改为小写
s.title() 让s的大小写符合头衔的要求
设置字符串格式的函数
函数名 返回的字符串
s.center(n , ch) 包含n个字符串,其中s位于中央,两边用字符ch填充
s.ljust(n , ch) 包含n个字符的字符串,其中s位于左边,右边用字符ch填充
s.rjust(n , ch) 包含n个字符的字符串,其中s位于右边,左边用字符ch填充
s.format(vars) 见正文
字符串剥除函数
函数名 返回的字符串
s.strip(ch) 从s开头和末尾删除所有包含在字符串ch中的字符
s.lstrip(ch) 从s开头(左端)删除所有包含在字符串ch中的字符
s.rstrip(ch) 从s末尾(右端)删除所有包含在字符串ch中的字符
字符串拆分函数
函数名 返回的字符串
s.partition(t) 将s拆分成三个字符串(head、t和tail),其中head为t前面的子串,而tail为t后面的子串
s.rpartititon(t) 与partition相同,但从s的右端开始搜索t
s.split(t) 以t为分隔符,将s划分成一系列子串,并返回一个由这些子串组成的列表
s.rsplit(t) 与split相同,但返回一个由这些子串组成的列表
s.splitlines() 返回一个由s中的各行组成的列表
字符串替换列表
函数名 返回的字符串
s.replace(old , new) 将s中的每一个old替换为new
s.extendtabs(n) 将s中的制表符替换为n个空格
其他字符串函数
函数名 返回的函数
s.count(t) t在s中出现的次数
s.encode() 设置s的编码
s.join(seq) 使用s将seq中的字符串连接成一个字符串
s.maketrans(old , new) 创建一个转换表,用于将old中的字符转换为new中的字符;请注意,s是任意的字符串,他不影响返回的转换表
s.translate(table) 使用指定转换表(使用maketrans创建的)对s中的字符进行替换
s.zfill(width) 在s左边添加足够多的0,让字符串的长度为width
正则表达式 ---> import re #使用正则表达式
一些正则表达式运算符
运算符 描述的字符串
xy? x、xy
x|y x、y
x* '' 、x 、xx、xxx、xxxx等
x+ x、xx、xxx、xxxx等
type命令 --> 检查值或变量的数据类型
>>>type(s)
<class 'int'>
序列-->一组按顺序排列的值,包含:字符串、元组、列表
len(s) 计算长度
x in s 检查序列s中是否包含x
元组(tuple):一组不可变序列 ()
items = (-6 , 'cat' , (1,2))
其中items[-1][1] = 2
元组函数
函数名 返回值
x in tup 如果x是元组tup的一个元组,则返回True,否则返回False
len(tup) 元组tup包含的元素数
tup.count(x) 元素x在元组tup中出现的次数
tup.index(x) 元组tup中第一个元素x的索引;如果x未包含在元组tup中,将引发ValueError异常
与字符串一样,也可以使用+和*来拼接元组。
列表,可变的 []
numbers = [7 , -7 , 2 , 3 , 2]
列表函数
函数名 返回值
s.append(x) 在列表s末尾添加元素x
s.count(x) 返回元素x在列表s中出现的次数
s.extend(lst) 将lst的所有元素都添加到列表s末尾
s.index(x) 返回第一次x元素的索引
s.insert(i , x) 将元素x插入到索引为i的元素
s.remove(x) 删除s中的第一个x元素
s.reverse() 反转s中元素的排列顺序
s.sort() 将s的元素按升序排列
列表解析
>>>[ n*n for n in range(1 , 11)]
使用列表解析进行筛选
>>>nums = [-1 , 0 , 6 , -4 , -2 , 3]
>>>result = [n for n in nums if n > 0]
>>>result
[6 , 3]
下面的函数使用列表解析删除字符串中的所有原音:
#eatvowels.py
def eat_vowels(s) :
return ''.join( [c for c in s if c.lower() not in 'aeiou'] )
字典-->散列 --> {}
>>>color = { 'red' :1 , 'blue' : 2 , ‘green’ : 3 }
>>>color
{'blue':2 , 'green':3 , 'red':1}
>>>color['green']
3
集合-->一系列不重复的元素 --> {}
>>>lst = [1 , 1, 6 , 8 , 1 , 5 , 5 , 6 , 8 , 1 , 5]
>>>s = set(lst)
>>>s
{8 , 1 , 5 , 6}
字符串插入
>>>x = 1/81
>>>print(x)
0.0123456790123
>>>print('value: %.5f' % x)
0.01235
一些转换说明符
说明符 含义
d 整数
o 八进制值
x 小写十六进制值
X 大写十六进制值
e 小写科学计数法表示的浮点数
E 大写科学计数法表示的浮点数
F 浮点数
s 字符串
% %字符
>>>a , b , c = 'cat' , 3.14 , 6
>>>s = 'There \' %d %ss older than %.2f years' % (c , a , b)
>>>s
"there's 6 cats older than 3.14 years"
如果要在字符串中包含字符%,必须使用“%%”
格式字符串
format(value , format_spec)
>>>'My {pet} has {prob}'.format(pet = 'dog' , prob = 'fleas')
'My dog has fleas'
命令替换:在格式字符串中,用大括号括起的内容都将被替换。
>>>'1/81 = {x:.3f}'.format(x = 1/81)
'1/81 = 0.012'
>>>'num = {x:{d}f}'.format(x=1/81 , d = 3)
'num = 0.012'
处理文本文件:打开文件-->处理文件-->关闭文件
逐行读取文本文件
#printfile.py
def print_file1(fname) :
f = open(fanme , 'r')
for line in f :
print(line , end = '')
f.close() \#这行代码是可选的
Python文件打开模式
字符 含义
'r' 为读取而打开文件(默认模式)
'w' 为写入而打开文件
'a‘ 在文件末尾附件而打开文件
’b' 二进制模式
't' 文本模式(默认模式)
'+' 为读写而打开文件
将整个文件作为一个字符串进行读取
#printfile.py
def print_file2(fname) :
f = open(fname , 'r‘)
print(f.read())
f.close()
简化
print( open(fname, ’r').read() )
写入文本文件
#write.py
def make_story1() :
f = open('story.txt' , 'w')
f.write('XiaoYiSi is Xiao Yi Si,\n')
f.write('xiaoyisi,haha.\n')
'w'是覆盖,原内容将不存在
如果不想覆盖story.txt,应先检查他是否存在
#write.py
import os
def make_story2() :
if os.path.isfile('story.txt') :
print('story.txt already exists')
else :
f = open('story.txt' , 'w')
f.write('XiaoYiSi is Xiao Yi Si,\n')
f.write('xiaoyisi,haha.\n')
添加到文件末尾
def add_to_story(line , fname = 'story.txt') :
f = open(fname , 'a')
f.write(line)
将字符串插入到文件的开头
将文件读取到一个字符串中,将新文本插入到该字符串,再将这个字符串写入原来的文件。
def insert_title(title , fname = 'story.txt') :
f = open('story.txt' , 'r+')
temp = f.read()
temp = title + '\n\n' + temp
f.seek(0) \#让文件指针指向文件开头
f.write(temp)
处理二进制文件
如果文件不是文本文件,他就被视为二进制文件
def is_gif(fname) :
f = open(fname , 'br')
first4 = tuple(f.read(4))
return firsr4 == (0x47 , 0x49 , 0x46 , 0x38)
异常发生时,有两种选择:
1.忽略异常
2.捕获异常 -->try/except块
def get_age() :
while True :
try :
n = int( input('How old are you?') )
return n
except ValueError :
print('Please enter an integer value.')
捕获各种异常
try :
...
except :
...
清理操作 --> finally代码块
def invert(x) :
try :
return 1/x
except ZeroDivisionError :
return 'error'
finally :
print('invert (%s) done' %x)
while语句-->确保不再需要的文件被尽早关闭
num = 1
with open(fname , 'r') as f :
print('04d %s' %(num , line) , end = '')
num = num + 1
面向对象编程OOP
编写表示一个人的简单类:
#person.py
class Person :
def __init__(self) :
self.name = ''
self.age = 0
创建Person对象时,Python将自动调用__init__
显示对象
#person.py
class Person :
def __init__(self) :
self.name = ''
self.age = 0
def display(self) :
print("Person('%s' , age)" % (self.name , self.age))
特殊方法__str__用于生成对象的字符串表示:
def __str__(self) :
print("Person('%s' , age)" % (self.name , self.age))
>>>p = Person()
>>>str(p)
"Person('',0)"
特殊方法__repr__,返回对象的“官方”表示
def __repr__(self) :
return str(self)
>>>p = Person()
>>>p
Person('' , 0)
>>>str(p)
"Person('' , 0)"
灵活的初始化
#person.py
class Person :
def __init__(self , name = '' , age = 0) :
self.name = name
self.age = age
>>>p = Person('longlong' , 13)
设置函数和获取函数
def set_age(self , age) :
if 0 < age <= 150 :
self.age = age
获取函数返回变量的值,使用@property装饰器来指出这一点:
@property
def ages(self) :
"""returns this person's age"""
return self._age
修改后的函数
#person.py
class Person:
def __init(self , name = '' , age = 0) :
self._name = name
self._age = age
@property
def age(self) :
return self._age
def set_age(self , age) :
if 0 < age <= 150 :
self._age = age
def display(self) :
print(self)
def __str__(self) :
return "Person( '%s' , %s )" % (self.name , self.age)
def __repr__(self) :
return str(self)
为给age创建设置函数,我们将方法set_age重命名为age,并使用@age.setter进行装饰
@age.setter
def age(self , age) :
if 0 < age <= 150 :
self._age = age
完成修改后可以这样编写
>>>p = Person('Lia' , 33)
>>>p
Person('Lia' , 33)
>>>p.age = -4
>>>p.age
55
私有变量
依然可以直接访问self._age
>>>p._age = -44
>>>p
Person('Lia' , -44)
直接修改age可能导致对象不一致,因此,通常不希望直接修改的情况发生。
self._age -->私有变量,不应在Person类外直接访问他。
要直接访问self.__age,需要在前面加上_Person
>>>p._Person.__age = -44
>>>p
Person('Lia' , -44)
继承
class Player :
...
class Human(Player) :
pass
s.split() -->分成一个个单词
set(t.split()) -->去重
s.replace('!' , ' ') -->去除不想要的字母
yixiepython包
PIL:python图像处理库
Tkinter:Python GUI
Django:交互式网站
Bottle:交互式网站
Pygame:2D动画
SciPy:科学计算
Twisted:网络编程
PyPI:Python包索引