python 笔记(转载)
要启动了Python解释器. 只需在命令行输入 :python
启动后会有:
>>>
这是键入Python语句的提示符
要退出Python提示符
在linux下按 Ctrl-d
在win下按 Ctrl-z
第一个Python程序: helloworld
#源文件 helloworld.py
print 'HelloWorld'
其中以#开始的是注释行.
现在在命令行输入:
python helloworld.py
就可以执行该程序.
获取帮助
例如要查看str类的帮助:
可以在提示符 >>> 后输入 help(str)
就会显示 str 类的帮助. 按q退出帮助.
4. 基本概念
字面意义上的常量
象 11.29.25e-3'abc' "abc" 等
数
有4种类型的数: 整数 长整数 浮点数 复数
其中复数的例子如(-5+4j) 或 (2.3-4.6j) 等.
字符串
可以用单引号字符串. 如 'abc'
双引号字符串的使用和单引号完全一样. 如 "abc"
三引号的字符串是可以多行的. 如 '''abc''' 或 """abc"""
字符串中的转义符:
\' 表示 '
\" 表示 "
\ 表示 \
但行尾的 \ 表示续行.
如果要阻止转义. 可以在字符串前加前缀r或R: r"a\b"
要使用Unicode字符串. 要加前缀u或U:u"abc"
字符串是不可变的.
相邻的两个字符串会被Python自动连接. 如: 'abc' 'def'
Python中把所有的东西都叫对象. 所以象数字. 字符串. 函数等.都是对象.
而要产生一个对象只需要对它赋值就行了.
Python的语句末尾可以不要分号.
但如果你要在同一行上写两个语句. 就需要分号隔开它们.
一行写不下时. 用 \ 续行.
5. 运算符
包括 + - * /
幂 **如 2**3
整除//
取模%
位左移/右移<<>>
按位与或非 & | ~
按位异或^
比较运算 > < >= <= == !=
布尔运算notandor
运算符优先级
运算符 描述
lambda Lambda表达式
or 布尔“或”
and 布尔“与”
not x 布尔“非”
in,not in 成员测试
is,is not 同一性测试
<,<=,>,>=,!=,== 比较
| 按位或
^ 按位异或
& 按位与
<<,>> 移位
+,- 加法与减法
*,/,% 乘法、除法与取余
+x,-x 正负号
~x 按位翻转
** 指数
x.attribute 属性参考
x 下标
x 寻址段
f(arguments...) 函数调用
(experession,...) 绑定或元组显示
列表显示
{key:datum,...} 字典显示
'expression,...' 字符串转换
6. 控制流
if语句
可以带 else 从句. 也可以带 elif 从句. 它们都需要一个冒号. 如:
number = 23
guess = int(raw_input('Enter an integer : '))
# 这个raw_input函数. 会把参数字符串打印出来. 并把用户的输入返回.
# 然后 int 这个类的构造函数把输入的字符串转化为一个整数.
if guess == number:
print 'Congratulations, you guessed it.'
print "(but you do not win any prizes!)"
elif guess < number:
print 'No, it is a little higher than that'
else:
print 'No, it is a little lower than that'
while语句
它也可以带 else 从句. 如:
while b :
#do sth
else :
#当b为False时. 会执行这里.
#不过. 这个else从句是多余的. 因为直接把这些语句放在while块之后就可以.
for语句
for语句的差别和c中的for很大. Python中的 for in 循环只用来遍历 list .如:
另外它也可以带 else 从句.
for i in range(1, 5)
print i
else
#doSth
注意这个 eles 也是在 while 中的一样.
break语句
它用来结束 while 或 for 循环.
要注意的是. 如果使用 break 语句跳出循环. 那循环语句的 else 从句也会被跳过.
continue语句
也是用在 while 或 for 循环中. 和c的一样.
7. 函数
函数定义的格式:
def 函数名 ( 参数表 ) :
#参数表是用 逗号 分割的变量名. 可以为空.
函数体
例如:
def printMax(a, b):
if a > b:
print a, 'is maximum'
else:
print b, 'is maximum'
#调用
printMax(3, 4)
函数的局部变量
局部变量只在函数内可见. 例如:
def func(x)
x = 2
# 下边的 x 和func中的局部变量x没有关系.
x = 3
但是. 如果要在函数func中访问全局的 x . 则需要使用 global 语句. 如:
def func()
#在函数内声明一个全局变量 x.
global x
print x
x = 2
# 定义全局变量 x
x = 3
默认的参数值
默认值是不可改变的.
函数调用时. 可以对指定参数名的参数赋值.
def func(i, j)
pass # pass 在Python中表示一个空的语句块
func(i=3, j=4)
func(j=4, i=3)
返回语句 return
若 return 后面没有指定要返回的值. 则返回 None
函数的 DocString
函数定义中的第一个逻辑行中的字符串. 就是这个函数的 "文档字符串".
其实除了函数. 还有模块和类. 也都有文档字符串. 可以用 __doc__ 属性访问它们.
习惯上. 它用多行字符串来表示. 第一行以大写字母开始. 句号结尾. 第二行是空行.
从第三行开始是详细描述.
8. 模块
使用 sys 模块
sys 的 argv 变量是一个字符串list. 其中的字符串是命令行参数. 和c语言的main()的第2个参数类似.
例如. 如果我们在命令行中输入:
python using_sys.py we are arguments
则 sys.argv 将是 "using_sys.py"
因为模块名总是 argv 中的第一个元素(即argv).
sys 的 path 变量也是一个字符串list. 包含的是输入模块的目录名列表.
我们可以修改这个list. 让它包含我们自己的模块.
不过 sys.path 的第一个字符串是一个空串. 这表示它包含 "当前目录".
导入模块
import 模块名
要直接使用模块中的名字(而不用模块名限定). 用:
form 模块名 import 名字
要得到一个模块的名字. 用 __name__ 属性.
当一个模块被第一次输入的时候. 会执行该模块的主块. 例如:
# filename: abc.py
if __name__ == '__main__'
print 'run by itself'
else
print "i'm being imported from another module"
则当我们在控制台中输入:
python abc.py
时. 会打印:run by itself
而当我们在python提示符中输入:
>>> import abc
时. 会打印 i'm being imported from anather module
使用内置函数 dir 可以列出一个模块内的的名字(包括函数. 变量. 类). 如:
dir(sys)
将会打印定义在 sys 中的名字.
如果没有给 dir 函数指定参数. 则表示打印当前模块中的名字. 如:
>>> dir()
['__builtins__', '__doc__', '__name__']
>>> import sys#注意. 导入的模块也是当前模块的一个名字. 如:
>>> dir()
['__builtins__', '__doc__', '__name__', 'sys']
>>> a= 5 # 注意. 新定义的变量也是模块中的名字. 如:
>>> dir()
['__builtins__', '__doc__', '__name__', 'a', 'sys']
>>> del a # 注意. 这会删除当前模块中的变量 a . 以后无法再使用它.
>>> dir()
['__builtins__', '__doc__', '__name__', 'sys']
9. 数据结构
见<<Dive Into Python>>的笔记
11. 面向对象的编程
Python中所有东西都是对象.
类的数据成员. 称为 域.
成员函数被称为 方法.
域和方法合称为 属性.
类的非静态数据成员不需声明. 而是在方法定义中对 self.成员赋值的时候产生.
但是static 数据成员却需要声明. 如下:
class A:
i = 0#static
def __init__ (self):
self.m = 1 #非静态成员
如果要让一个数据成员是私有的. 需要让该数据成员的名字以 __ 开始.
12. 输入输出
在交互窗口中. 可以用 raw_input 和 print 语句来输入/输出.
在文件的输入输出中. 就要使用 file 类.
存储器
把对象写入文件. 就是序列化对象.
Python中有一个 pickle 模块专门做这件事. 不过用 cPickle 模块(用c语言编写)更快.
存储与取存储
如:
import cPickle as p
#import pickle as p
# 注意上边两行. 使用了 import as 语法. 用来导入模块时给模块指定另一个名字.
# 这种用法有一个好处. 就是在下边的代码中只使用p这个名字.
# 所以以后要用 pickle 模块取代 cPickle 模块时. 就只要在这里换一下就好了.
shopli = ['apple', 'mango', 'carrot']
f = file('shoplist.data', 'w')
p.dump(shopli, f) #存储
f.close()
del shoplist
f = file('shoplist.data')
shopli = p.load(f) #取存储
print shopli
13. 异常
异常用 raise 来抛出. 用 try except finally 来处理.
例如:
try:
s = raw_input('Enter sth')
except EOFError:
# 例如输入了EOF. (在win中是 Ctrl + z). 会产生 EOFError 异常.
print 'Input is Eof'
sys.exit()
except:
# except后边如果没有指定要捕获的异常类型. 则表示捕获所有异常.
print 'Some error occurred.'
finally:
# 无论是否捕获异常都要执行该块.
要抛出异常. 用 raise 语句. 抛出的异常(或错误)要是 Exception(或Error) 的子类.
例如自定义一个异常类:
class ShortInputException(Exception):
''' A user-defined exception class. '''
def __init__(self, length, atleast):
Exception.__init__(self)#Python中的派生类初始化时. 并不自动初始化基类.
self.length = length
self.atleast = atleast
这个自定义的异常类使用如下:
try:
s = raw_input("Enter Sth")
if len(s) < 3 :
raise ShortInputException(len(s), 3) #构造并抛出异常对象
except ShortInputException, x:
#注意上边一行. 使用 x 来接收抛出的 ShortInputException 异常对象.
pirnt 'ShortInputException: the input was of length %d, \
was expecting at least %d' % (x.length, x.atleast)
14. 标准库
os模块
os.getcwd() 得到当前工作目录,即当前Python脚本工作的目录
os.getenv() 读取环境变量
os.putenv() 设置环境变量
os.listdir() 返回指定目录下的所有文件和目录名
os.remove()删除一个文件
os.system()用来运行shell命令
os.linesep 字符串给出当前平台使用的行终止符
Windows用'\r\n', Linux用'\n', Mac使用'\r'
os.path.split() 返回一个路径的目录名和文件名。
os.path.isfile()路径是一个文件?
os.path.isdir() 路径是一个目录?
os.path.existe()路径是否真地存在?
15. 特殊用法
让函数接收可变数量的参数
例如:
def func(x, *args) :
for i in args:
......
注意函数的参数 args前边有一个 *. 表示args将要接收的是 一组实参构成的元组.
所以调用这个函数时. 参数可以多于函数的形参数目. 多余的参数会作为一个元组存储在args中.
所以当用 func(2, 3) 调用时. args接收的参数是只有一个元素的元组 (3,)
当用 func(2, 3, 4) 调用时. args接收的是元组 (3, 4)
上边的例子中. args 前边有一个前缀* . 表示要接收元组.
如果参数名之前放了两个*(如 **args). 则表示调用函数时. 多于的参数会作为字典的键值对.
exec语句
用来执行保存在字符串(或文件)中的 Python语句. 如:
s = 'print "hello world" '
exec s
就会执行 s 中保存的 Python 语句.
eval语句
用来计算保存在字符串中的 Python表达式的值. 如:
s = '2*3'
eval_r(s)
上一句会返回6.
assert语句
用来断言一个表达式为真.
所以当执行时. 如果该表达式值为假. 会引发一个 AssertionError 错误.
例如:
assert 1>2
执行时会出错.
repr函数
用来取得一个对象的字符串表示.
注意. 用反引号(也称转换符) `(在键盘最左边)可以得到同样的功能. 如:
>>> i = 3
>>> `i`
'3'
>>> repr(i)
'3'
16.
>>> import string
>>> song = "The rain in Spain..."
>>> string.split(song)
['The', 'rain', 'in', 'Spain...']
song="the,rain,in"
string.split(song,',')
['the', 'rain', 'in']
>>> list = ['The', 'rain', 'in', 'Spain...']
>>> string.join(list)
'The rain in Spain...'
>>> string.join(list, '_')
'The_rain_in_Spain...'
17.
如果你有一个字典 oneDict,而想用另一个不同的字典 otherDict 的内容替换它,只需要用:
oneDict.update(otherDict)
>>> p1={'aa':'dsd','bb':'dsafd'}
>>> p2={'bb':'dsdsds','cc':'dsa'}
>>> p1.update(p2)
>>> p1
{'aa': 'dsd', 'cc': 'dsa', 'bb': 'dsdsds'}
页:
[1]