reko_3 发表于 2017-4-23 08:54:41

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]
查看完整版本: python 笔记(转载)