`
zzhanglii
  • 浏览: 3150 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
最近访客 更多访客>>
社区版块
存档分类
最新评论

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. 基本概念

字面意义上的常量
象 1  1.2  9.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
整除  //
取模  %
位左移/右移  <<  >>
按位与或非 & | ~
按位异或  ^
比较运算 > < >= <= == !=
布尔运算  not  and  or


运算符优先级

运算符 描述
lambda Lambda表达式
or 布尔“或”
and 布尔“与”
not x 布尔“非”
in,not in 成员测试
is,is not 同一性测试
<,<=,>,>=,!=,== 比较
| 按位或
^ 按位异或
& 按位与
<<,>> 移位
+,- 加法与减法
*,/,% 乘法、除法与取余
+x,-x 正负号
~x 按位翻转
** 指数
x.attribute 属性参考
x[index] 下标
x[index:index] 寻址段
f(arguments...) 函数调用
(experession,...) 绑定或元组显示
[expression,...] 列表显示
{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[0] 将是 "using_sys.py"
因为模块名总是 argv 中的第一个元素(即argv[0]).

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'}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics